#Signature file v4.1
#Version 1.27.1

CLSS public abstract interface java.io.Serializable

CLSS public abstract interface java.lang.Comparable<%0 extends java.lang.Object>
meth public abstract int compareTo({java.lang.Comparable%0})

CLSS public abstract java.lang.Enum<%0 extends java.lang.Enum<{java.lang.Enum%0}>>
cons protected init(java.lang.String,int)
intf java.io.Serializable
intf java.lang.Comparable<{java.lang.Enum%0}>
meth protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected final void finalize()
meth public final boolean equals(java.lang.Object)
meth public final int compareTo({java.lang.Enum%0})
meth public final int hashCode()
meth public final int ordinal()
meth public final java.lang.Class<{java.lang.Enum%0}> getDeclaringClass()
meth public final java.lang.String name()
meth public java.lang.String toString()
meth public static <%0 extends java.lang.Enum<{%%0}>> {%%0} valueOf(java.lang.Class<{%%0}>,java.lang.String)
supr java.lang.Object
hfds name,ordinal

CLSS public java.lang.Object
cons public init()
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected void finalize() throws java.lang.Throwable
meth public boolean equals(java.lang.Object)
meth public final java.lang.Class<?> getClass()
meth public final void notify()
meth public final void notifyAll()
meth public final void wait() throws java.lang.InterruptedException
meth public final void wait(long) throws java.lang.InterruptedException
meth public final void wait(long,int) throws java.lang.InterruptedException
meth public int hashCode()
meth public java.lang.String toString()

CLSS public abstract interface java.lang.annotation.Annotation
meth public abstract boolean equals(java.lang.Object)
meth public abstract int hashCode()
meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
meth public abstract java.lang.String toString()

CLSS public abstract interface !annotation java.lang.annotation.Documented
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation

CLSS public abstract interface !annotation java.lang.annotation.Retention
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation
meth public abstract java.lang.annotation.RetentionPolicy value()

CLSS public abstract interface !annotation java.lang.annotation.Target
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation
meth public abstract java.lang.annotation.ElementType[] value()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.BooleanOption
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[FIELD])
intf java.lang.annotation.Annotation
meth public abstract boolean defaultValue()
meth public abstract java.lang.String displayName()
meth public abstract java.lang.String tooltip()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.ConstraintVariableType
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[])
intf java.lang.annotation.Annotation
meth public abstract java.lang.String type()
meth public abstract java.lang.String variable()

CLSS public abstract interface org.netbeans.spi.java.hints.CustomizerProvider
meth public abstract javax.swing.JComponent getCustomizer(java.util.prefs.Preferences)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()

CLSS public org.netbeans.spi.java.hints.ErrorDescriptionFactory
meth public !varargs static org.netbeans.spi.editor.hints.ErrorDescription forName(org.netbeans.spi.java.hints.HintContext,com.sun.source.tree.Tree,java.lang.String,org.netbeans.spi.editor.hints.Fix[])
meth public !varargs static org.netbeans.spi.editor.hints.ErrorDescription forName(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String,org.netbeans.spi.editor.hints.Fix[])
meth public !varargs static org.netbeans.spi.editor.hints.ErrorDescription forSpan(org.netbeans.spi.java.hints.HintContext,int,int,java.lang.String,org.netbeans.spi.editor.hints.Fix[])
meth public !varargs static org.netbeans.spi.editor.hints.ErrorDescription forTree(org.netbeans.spi.java.hints.HintContext,com.sun.source.tree.Tree,java.lang.String,org.netbeans.spi.editor.hints.Fix[])
meth public !varargs static org.netbeans.spi.editor.hints.ErrorDescription forTree(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String,org.netbeans.spi.editor.hints.Fix[])
supr java.lang.Object
hfds DECLARATION
hcls DisableConfigure,FixImpl,InspectFix,TopLevelConfigureFix

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.Hint
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE, METHOD])
innr public final static !enum Kind
innr public final static !enum Options
intf java.lang.annotation.Annotation
meth public abstract !hasdefault boolean enabled()
meth public abstract !hasdefault java.lang.Class<? extends org.netbeans.spi.java.hints.CustomizerProvider> customizerProvider()
meth public abstract !hasdefault java.lang.String id()
meth public abstract !hasdefault java.lang.String[] suppressWarnings()
meth public abstract !hasdefault org.netbeans.spi.editor.hints.Severity severity()
meth public abstract !hasdefault org.netbeans.spi.java.hints.Hint$Kind hintKind()
meth public abstract !hasdefault org.netbeans.spi.java.hints.Hint$Options[] options()
meth public abstract java.lang.String category()
meth public abstract java.lang.String description()
meth public abstract java.lang.String displayName()

CLSS public final static !enum org.netbeans.spi.java.hints.Hint$Kind
 outer org.netbeans.spi.java.hints.Hint
fld public final static org.netbeans.spi.java.hints.Hint$Kind ACTION
fld public final static org.netbeans.spi.java.hints.Hint$Kind INSPECTION
meth public static org.netbeans.spi.java.hints.Hint$Kind valueOf(java.lang.String)
meth public static org.netbeans.spi.java.hints.Hint$Kind[] values()
supr java.lang.Enum<org.netbeans.spi.java.hints.Hint$Kind>

CLSS public final static !enum org.netbeans.spi.java.hints.Hint$Options
 outer org.netbeans.spi.java.hints.Hint
fld public final static org.netbeans.spi.java.hints.Hint$Options HEAVY
fld public final static org.netbeans.spi.java.hints.Hint$Options NO_BATCH
fld public final static org.netbeans.spi.java.hints.Hint$Options QUERY
meth public static org.netbeans.spi.java.hints.Hint$Options valueOf(java.lang.String)
meth public static org.netbeans.spi.java.hints.Hint$Options[] values()
supr java.lang.Enum<org.netbeans.spi.java.hints.Hint$Options>

CLSS public org.netbeans.spi.java.hints.HintContext
innr public final static !enum MessageKind
meth public boolean isBulkMode()
meth public boolean isCanceled()
meth public com.sun.source.util.TreePath getPath()
meth public int getCaretLocation()
meth public java.util.Map<java.lang.String,com.sun.source.util.TreePath> getVariables()
meth public java.util.Map<java.lang.String,java.lang.String> getVariableNames()
meth public java.util.Map<java.lang.String,java.util.Collection<? extends com.sun.source.util.TreePath>> getMultiVariables()
meth public java.util.Map<java.lang.String,javax.lang.model.type.TypeMirror> getConstraints()
meth public java.util.prefs.Preferences getPreferences()
meth public org.netbeans.api.java.source.CompilationInfo getInfo()
meth public org.netbeans.spi.editor.hints.Severity getSeverity()
meth public void reportMessage(org.netbeans.spi.java.hints.HintContext$MessageKind,java.lang.String)
supr java.lang.Object
hfds bulkMode,cancel,caret,constraints,info,messages,metadata,multiVariables,path,preferences,settings,severity,variableNames,variables

CLSS public final static !enum org.netbeans.spi.java.hints.HintContext$MessageKind
 outer org.netbeans.spi.java.hints.HintContext
fld public final static org.netbeans.spi.java.hints.HintContext$MessageKind ERROR
fld public final static org.netbeans.spi.java.hints.HintContext$MessageKind WARNING
meth public static org.netbeans.spi.java.hints.HintContext$MessageKind valueOf(java.lang.String)
meth public static org.netbeans.spi.java.hints.HintContext$MessageKind[] values()
supr java.lang.Enum<org.netbeans.spi.java.hints.HintContext$MessageKind>

CLSS public final !enum org.netbeans.spi.java.hints.HintSeverity
fld public final static org.netbeans.spi.java.hints.HintSeverity CURRENT_LINE_WARNING
fld public final static org.netbeans.spi.java.hints.HintSeverity ERROR
fld public final static org.netbeans.spi.java.hints.HintSeverity WARNING
meth public org.netbeans.spi.editor.hints.Severity toEditorSeverity()
meth public static org.netbeans.spi.java.hints.HintSeverity valueOf(java.lang.String)
meth public static org.netbeans.spi.java.hints.HintSeverity[] values()
supr java.lang.Enum<org.netbeans.spi.java.hints.HintSeverity>

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.IntegerOption
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[FIELD])
intf java.lang.annotation.Annotation
meth public abstract !hasdefault int defaultValue()
meth public abstract !hasdefault int maxValue()
meth public abstract !hasdefault int minValue()
meth public abstract !hasdefault int step()
meth public abstract !hasdefault java.lang.String tooltip()
meth public abstract java.lang.String displayName()

CLSS public abstract org.netbeans.spi.java.hints.JavaFix
cons protected init(org.netbeans.api.java.source.CompilationInfo,com.sun.source.util.TreePath)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
cons protected init(org.netbeans.api.java.source.CompilationInfo,com.sun.source.util.TreePath,java.lang.String)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NullAllowed()
cons protected init(org.netbeans.api.java.source.TreePathHandle)
 anno 1 org.netbeans.api.annotations.common.NonNull()
cons protected init(org.netbeans.api.java.source.TreePathHandle,java.lang.String)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NullAllowed()
innr public final static TransformationContext
meth protected abstract java.lang.String getText()
 anno 0 org.netbeans.api.annotations.common.NonNull()
meth protected abstract void performRewrite(org.netbeans.spi.java.hints.JavaFix$TransformationContext) throws java.lang.Exception
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public final org.netbeans.spi.editor.hints.Fix toEditorFix()
supr java.lang.Object
hfds handle,options,sortText

CLSS public final static org.netbeans.spi.java.hints.JavaFix$TransformationContext
 outer org.netbeans.spi.java.hints.JavaFix
meth public com.sun.source.util.TreePath getPath()
 anno 0 org.netbeans.api.annotations.common.NonNull()
meth public java.io.InputStream getResourceContent(org.openide.filesystems.FileObject) throws java.io.IOException
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public java.io.OutputStream getResourceOutput(org.openide.filesystems.FileObject) throws java.io.IOException
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public org.netbeans.api.java.source.WorkingCopy getWorkingCopy()
 anno 0 org.netbeans.api.annotations.common.NonNull()
supr java.lang.Object
hfds canShowUI,fileChanges,path,resourceContentChanges,workingCopy

CLSS public org.netbeans.spi.java.hints.JavaFixUtilities
cons public init()
meth public static boolean requiresParenthesis(com.sun.source.tree.Tree,com.sun.source.tree.Tree,com.sun.source.tree.Tree)
meth public static org.netbeans.spi.editor.hints.Fix removeFromParent(org.netbeans.spi.java.hints.HintContext,java.lang.String,com.sun.source.util.TreePath)
meth public static org.netbeans.spi.editor.hints.Fix rewriteFix(org.netbeans.spi.java.hints.HintContext,java.lang.String,com.sun.source.util.TreePath,java.lang.String)
supr java.lang.Object
hfds NUMBER_LITERAL_KINDS,OPERATOR_PRIORITIES,SPEC_VERSION
hcls IK,JavaFixRealImpl,MoveFile,RemoveFromParent,ReplaceParameters

CLSS public org.netbeans.spi.java.hints.MatcherUtilities
cons public init()
meth public static boolean matches(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public static boolean matches(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String,boolean)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public static boolean matches(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String,java.util.Map<java.lang.String,com.sun.source.util.TreePath>,java.util.Map<java.lang.String,java.util.Collection<? extends com.sun.source.util.TreePath>>,java.util.Map<java.lang.String,java.lang.String>)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public static boolean matches(org.netbeans.spi.java.hints.HintContext,com.sun.source.util.TreePath,java.lang.String,java.util.Map<java.lang.String,com.sun.source.util.TreePath>,java.util.Map<java.lang.String,java.util.Collection<? extends com.sun.source.util.TreePath>>,java.util.Map<java.lang.String,java.lang.String>,java.util.Map<java.lang.String,javax.lang.model.type.TypeMirror>)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public static boolean matches(org.netbeans.spi.java.hints.HintContext,java.util.Collection<? extends com.sun.source.util.TreePath>,java.lang.String,java.util.Map<java.lang.String,com.sun.source.util.TreePath>,java.util.Map<java.lang.String,java.util.Collection<? extends com.sun.source.util.TreePath>>,java.util.Map<java.lang.String,java.lang.String>)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
supr java.lang.Object

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.TriggerOptions
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
fld public final static java.lang.String PROCESS_GUARDED = "processGuarded"
intf java.lang.annotation.Annotation
meth public abstract java.lang.String[] value()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.TriggerPattern
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
intf java.lang.annotation.Annotation
meth public abstract !hasdefault org.netbeans.spi.java.hints.ConstraintVariableType[] constraints()
meth public abstract java.lang.String value()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.TriggerPatterns
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
intf java.lang.annotation.Annotation
meth public abstract org.netbeans.spi.java.hints.TriggerPattern[] value()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.TriggerTreeKind
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
intf java.lang.annotation.Annotation
meth public abstract com.sun.source.tree.Tree$Kind[] value()

CLSS public abstract interface !annotation org.netbeans.spi.java.hints.UseOptions
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[METHOD])
intf java.lang.annotation.Annotation
meth public abstract java.lang.String[] value()

CLSS public final org.netbeans.spi.java.hints.support.FixFactory
meth public final static org.netbeans.spi.editor.hints.Fix addModifiersFix(org.netbeans.api.java.source.CompilationInfo,com.sun.source.util.TreePath,java.util.Set<javax.lang.model.element.Modifier>,java.lang.String)
meth public final static org.netbeans.spi.editor.hints.Fix changeModifiersFix(org.netbeans.api.java.source.CompilationInfo,com.sun.source.util.TreePath,java.util.Set<javax.lang.model.element.Modifier>,java.util.Set<javax.lang.model.element.Modifier>,java.lang.String)
meth public final static org.netbeans.spi.editor.hints.Fix removeModifiersFix(org.netbeans.api.java.source.CompilationInfo,com.sun.source.util.TreePath,java.util.Set<javax.lang.model.element.Modifier>,java.lang.String)
supr java.lang.Object
hcls ChangeModifiersFixImpl

CLSS public final org.netbeans.spi.java.hints.support.TransformationSupport
innr public abstract interface static Transformer
meth public java.util.Collection<? extends org.netbeans.api.java.source.ModificationResult> processAllProjects()
 anno 0 org.netbeans.api.annotations.common.NonNull()
meth public org.netbeans.spi.java.hints.support.TransformationSupport setCancel(java.util.concurrent.atomic.AtomicBoolean)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public static org.netbeans.spi.java.hints.support.TransformationSupport create(java.lang.String)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public static org.netbeans.spi.java.hints.support.TransformationSupport create(java.lang.String,org.netbeans.spi.java.hints.support.TransformationSupport$Transformer)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
meth public void transformTreePath(org.netbeans.api.java.source.WorkingCopy,com.sun.source.util.TreePath)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
supr java.lang.Object
hfds cancel,jackpotPattern,transformer

CLSS public abstract interface static org.netbeans.spi.java.hints.support.TransformationSupport$Transformer
 outer org.netbeans.spi.java.hints.support.TransformationSupport
meth public abstract void transform(org.netbeans.api.java.source.WorkingCopy,org.netbeans.api.java.source.matching.Occurrence)

