# HG changeset patch # Parent 54216150aa68bf66bce61f8932a2e287b758c4e3 diff --git a/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java b/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java --- a/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java +++ b/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java @@ -67,6 +67,7 @@ import org.netbeans.spi.java.hints.Hint; import org.netbeans.spi.java.hints.Hint.Options; import org.netbeans.spi.java.hints.HintContext; +import org.netbeans.spi.java.hints.TriggerOptions; import org.netbeans.spi.java.hints.TriggerPattern; import org.netbeans.spi.java.hints.TriggerTreeKind; import org.openide.util.NbBundle; @@ -141,6 +142,7 @@ } @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT}) + @TriggerOptions(TriggerOptions.PROCESS_LOCKED) public static ErrorDescription before(HintContext ctx) { VariableElement var = testElement(ctx); @@ -249,6 +251,7 @@ } @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT}) + @TriggerOptions(TriggerOptions.PROCESS_LOCKED) public static ErrorDescription before(HintContext ctx) { TreePath tp = ctx.getPath(); VariableElement var = testElement(ctx); diff --git a/spi.java.hints/apichanges.xml b/spi.java.hints/apichanges.xml --- a/spi.java.hints/apichanges.xml +++ b/spi.java.hints/apichanges.xml @@ -46,6 +46,22 @@ Java Hints SPI + + + Hint can choose to trigger for protected code + + + + + +

+ Hints triggered by Tree.Kind are not invoked for Trees which are + protected from editing (i.e. Form Builder guarded blocks). Hint implementor + can opt to be triggered even for such code, in order to e.g. collect + data. +

+
+
Added ability to specify sort text for JavaFix diff --git a/spi.java.hints/nbproject/project.properties b/spi.java.hints/nbproject/project.properties --- a/spi.java.hints/nbproject/project.properties +++ b/spi.java.hints/nbproject/project.properties @@ -1,7 +1,7 @@ is.autoload=true javac.source=1.7 javac.compilerargs=-Xlint -Xlint:-serial -spec.version.base=1.25.0 +spec.version.base=1.26.0 requires.nb.javac=true javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml diff --git a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/code/CodeHintProviderImpl.java b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/code/CodeHintProviderImpl.java --- a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/code/CodeHintProviderImpl.java +++ b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/code/CodeHintProviderImpl.java @@ -82,6 +82,7 @@ import org.netbeans.spi.java.hints.ConstraintVariableType; import org.netbeans.spi.java.hints.Hint; import org.netbeans.spi.java.hints.IntegerOption; +import org.netbeans.spi.java.hints.TriggerOptions; import org.netbeans.spi.java.hints.TriggerPattern; import org.netbeans.spi.java.hints.TriggerPatterns; import org.netbeans.spi.java.hints.TriggerTreeKind; @@ -247,11 +248,11 @@ private static void processTreeKindHint(Map> hints, MethodWrapper m, HintMetadata metadata) { TriggerTreeKind kindTrigger = m.getAnnotation(TriggerTreeKind.class); - + if (kindTrigger == null) { return ; } - + TriggerOptions opts = m.getAnnotation(TriggerOptions.class); Worker w = new WorkerImpl(m.getClazz().getName(), m.getName()); Set kinds = EnumSet.noneOf(Kind.class); @@ -260,6 +261,7 @@ addHint(hints, metadata, HintDescriptionFactory.create() .setTrigger(new Kinds(kinds)) + .setTriggerOptions(opts == null ? null : opts.value()) .setWorker(w) .setMetadata(metadata) .produce()); @@ -290,11 +292,12 @@ for (ConstraintVariableType c : patternTrigger.constraints()) { constraints.put(c.variable(), c.type()); } - + TriggerOptions opts = m.getAnnotation(TriggerOptions.class); PatternDescription pd = PatternDescription.create(pattern, constraints); addHint(hints, metadata, HintDescriptionFactory.create() .setTrigger(pd) + .setTriggerOptions(opts == null ? null : opts.value()) .setWorker(new WorkerImpl(m.getClazz().getName(), m.getName())) .setMetadata(metadata) .produce()); diff --git a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/HintDescriptionFactory.java b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/HintDescriptionFactory.java --- a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/HintDescriptionFactory.java +++ b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/HintDescriptionFactory.java @@ -81,6 +81,11 @@ this.metadata = metadata; return this; } + + public HintDescriptionFactory setTriggerOptions(String[] triggerOpts) { + this.trigger.setOptions(triggerOpts); + return this; + } public HintDescriptionFactory setTrigger(Trigger trigger) { if (this.trigger != null) { diff --git a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/Trigger.java b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/Trigger.java --- a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/Trigger.java +++ b/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/Trigger.java @@ -44,6 +44,9 @@ import com.sun.source.tree.Tree; import com.sun.source.tree.Tree.Kind; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.Map; import java.util.Set; import org.netbeans.api.java.source.matching.Pattern; @@ -54,8 +57,27 @@ * @author lahvac */ public abstract class Trigger { - + private static final String[] NO_OPTIONS = new String[0]; + + private Set options = Collections.emptySet(); + Trigger() {} + + public boolean hasOption(String opt) { + return options.contains(opt); + } + + public void setOptions(String[] opts) { + if (opts == null || opts.length == 0) { + options = Collections.emptySet(); + } else { + options = new HashSet<>(Arrays.asList(opts)); + } + } + + public String[] getOptions() { + return options.isEmpty() ? NO_OPTIONS : options.toArray(new String[options.size()]); + } /**Invoke the given hint's worker on the specified {@link Tree.Kind}(s). * diff --git a/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/hints/HintsInvoker.java b/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/hints/HintsInvoker.java --- a/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/hints/HintsInvoker.java +++ b/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/hints/HintsInvoker.java @@ -102,6 +102,7 @@ import org.netbeans.api.java.source.matching.Matcher; import org.netbeans.api.java.source.matching.Occurrence; import org.netbeans.api.java.source.matching.Pattern; +import org.netbeans.spi.java.hints.TriggerOptions; import org.openide.util.Exceptions; /** @@ -639,11 +640,15 @@ } private void runAndAdd(TreePath path, List rules, Map> d) { - if (rules != null && !isInGuarded(info, path)) { + if (rules != null) { + boolean guarded = isInGuarded(info, path); OUTER: for (HintDescription hd : rules) { if (isCanceled()) { return ; } + if (guarded && !hd.getTrigger().hasOption(TriggerOptions.PROCESS_LOCKED)) { + continue; + } HintMetadata hm = hd.getMetadata(); diff --git a/spi.java.hints/src/org/netbeans/spi/java/hints/support/TransformationSupport.java b/spi.java.hints/src/org/netbeans/spi/java/hints/support/TransformationSupport.java --- a/spi.java.hints/src/org/netbeans/spi/java/hints/support/TransformationSupport.java +++ b/spi.java.hints/src/org/netbeans/spi/java/hints/support/TransformationSupport.java @@ -225,7 +225,9 @@ for (HintDescription hd : PatternConvertor.create(inputJackpotPattern)) { final String triggerPattern = ((Trigger.PatternDescription) hd.getTrigger()).getPattern(); - descriptions.add(HintDescriptionFactory.create().setTrigger(hd.getTrigger()).setWorker(new HintDescription.Worker() { + descriptions.add(HintDescriptionFactory.create().setTrigger(hd.getTrigger()). + setTriggerOptions(hd.getTrigger().getOptions()). + setWorker(new HintDescription.Worker() { @Override public Collection createErrors(HintContext ctx) { final Map> constraintsHandles = new HashMap>();