#Signature file v4.1
#Version 1.35.0

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,LOG
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 minSourceVersion()
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 isPrimary(com.sun.source.tree.Tree)
 anno 1 org.netbeans.api.annotations.common.NonNull()
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)

