This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 253861
Collapse All | Expand All

(-)a/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java (+3 lines)
Lines 67-72 Link Here
67
import org.netbeans.spi.java.hints.Hint;
67
import org.netbeans.spi.java.hints.Hint;
68
import org.netbeans.spi.java.hints.Hint.Options;
68
import org.netbeans.spi.java.hints.Hint.Options;
69
import org.netbeans.spi.java.hints.HintContext;
69
import org.netbeans.spi.java.hints.HintContext;
70
import org.netbeans.spi.java.hints.TriggerOptions;
70
import org.netbeans.spi.java.hints.TriggerPattern;
71
import org.netbeans.spi.java.hints.TriggerPattern;
71
import org.netbeans.spi.java.hints.TriggerTreeKind;
72
import org.netbeans.spi.java.hints.TriggerTreeKind;
72
import org.openide.util.NbBundle;
73
import org.openide.util.NbBundle;
Lines 141-146 Link Here
141
        }
142
        }
142
143
143
        @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT})
144
        @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT})
145
        @TriggerOptions(TriggerOptions.PROCESS_LOCKED)
144
        public static ErrorDescription before(HintContext ctx) {
146
        public static ErrorDescription before(HintContext ctx) {
145
            VariableElement var = testElement(ctx);
147
            VariableElement var = testElement(ctx);
146
148
Lines 249-254 Link Here
249
        }
251
        }
250
252
251
        @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT})
253
        @TriggerTreeKind({Kind.IDENTIFIER, Kind.MEMBER_SELECT})
254
        @TriggerOptions(TriggerOptions.PROCESS_LOCKED)
252
        public static ErrorDescription before(HintContext ctx) {
255
        public static ErrorDescription before(HintContext ctx) {
253
            TreePath tp = ctx.getPath();
256
            TreePath tp = ctx.getPath();
254
            VariableElement var = testElement(ctx);
257
            VariableElement var = testElement(ctx);
(-)a/spi.java.hints/apichanges.xml (+16 lines)
Lines 46-51 Link Here
46
        <apidef name="JavaHintsSPI">Java Hints SPI</apidef>
46
        <apidef name="JavaHintsSPI">Java Hints SPI</apidef>
47
    </apidefs>
47
    </apidefs>
48
    <changes>
48
    <changes>
49
        <change id="TriggerOptions">
50
            <api name="JavaHintsSPI"/>
51
            <summary>Hint can choose to trigger for protected code</summary>
52
            <version major="1" minor="26"/>
53
            <date day="27" month="7" year="2015"/>
54
            <author login="sdedic"/>
55
            <compatibility addition="yes"/>
56
            <description>
57
                <p>
58
                    Hints triggered by Tree.Kind are not invoked for Trees which are
59
                    protected from editing (i.e. Form Builder guarded blocks). Hint implementor
60
                    can opt to be triggered even for such code, in order to e.g. collect
61
                    data.
62
                </p>
63
            </description>
64
        </change>
49
        <change id="EnhancedJavaFix">
65
        <change id="EnhancedJavaFix">
50
            <api name="JavaHintsSPI"/>
66
            <api name="JavaHintsSPI"/>
51
            <summary>Added ability to specify sort text for JavaFix</summary>
67
            <summary>Added ability to specify sort text for JavaFix</summary>
(-)a/spi.java.hints/nbproject/project.properties (-1 / +1 lines)
Lines 1-7 Link Here
1
is.autoload=true
1
is.autoload=true
2
javac.source=1.7
2
javac.source=1.7
3
javac.compilerargs=-Xlint -Xlint:-serial
3
javac.compilerargs=-Xlint -Xlint:-serial
4
spec.version.base=1.25.0
4
spec.version.base=1.26.0
5
requires.nb.javac=true
5
requires.nb.javac=true
6
javadoc.arch=${basedir}/arch.xml
6
javadoc.arch=${basedir}/arch.xml
7
javadoc.apichanges=${basedir}/apichanges.xml
7
javadoc.apichanges=${basedir}/apichanges.xml
(-)a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/code/CodeHintProviderImpl.java (-3 / +6 lines)
Lines 82-87 Link Here
82
import org.netbeans.spi.java.hints.ConstraintVariableType;
82
import org.netbeans.spi.java.hints.ConstraintVariableType;
83
import org.netbeans.spi.java.hints.Hint;
83
import org.netbeans.spi.java.hints.Hint;
84
import org.netbeans.spi.java.hints.IntegerOption;
84
import org.netbeans.spi.java.hints.IntegerOption;
85
import org.netbeans.spi.java.hints.TriggerOptions;
85
import org.netbeans.spi.java.hints.TriggerPattern;
86
import org.netbeans.spi.java.hints.TriggerPattern;
86
import org.netbeans.spi.java.hints.TriggerPatterns;
87
import org.netbeans.spi.java.hints.TriggerPatterns;
87
import org.netbeans.spi.java.hints.TriggerTreeKind;
88
import org.netbeans.spi.java.hints.TriggerTreeKind;
Lines 247-257 Link Here
247
    
248
    
248
    private static void processTreeKindHint(Map<HintMetadata, Collection<HintDescription>> hints, MethodWrapper m, HintMetadata metadata) {
249
    private static void processTreeKindHint(Map<HintMetadata, Collection<HintDescription>> hints, MethodWrapper m, HintMetadata metadata) {
249
        TriggerTreeKind kindTrigger = m.getAnnotation(TriggerTreeKind.class);
250
        TriggerTreeKind kindTrigger = m.getAnnotation(TriggerTreeKind.class);
250
251
        
251
        if (kindTrigger == null) {
252
        if (kindTrigger == null) {
252
            return ;
253
            return ;
253
        }
254
        }
254
255
        TriggerOptions opts = m.getAnnotation(TriggerOptions.class);
255
        Worker w = new WorkerImpl(m.getClazz().getName(), m.getName());
256
        Worker w = new WorkerImpl(m.getClazz().getName(), m.getName());
256
257
257
        Set<Kind> kinds = EnumSet.noneOf(Kind.class);
258
        Set<Kind> kinds = EnumSet.noneOf(Kind.class);
Lines 260-265 Link Here
260
261
261
        addHint(hints, metadata, HintDescriptionFactory.create()
262
        addHint(hints, metadata, HintDescriptionFactory.create()
262
                                                       .setTrigger(new Kinds(kinds))
263
                                                       .setTrigger(new Kinds(kinds))
264
                                                       .setTriggerOptions(opts == null ? null : opts.value())
263
                                                       .setWorker(w)
265
                                                       .setWorker(w)
264
                                                       .setMetadata(metadata)
266
                                                       .setMetadata(metadata)
265
                                                       .produce());
267
                                                       .produce());
Lines 290-300 Link Here
290
        for (ConstraintVariableType c : patternTrigger.constraints()) {
292
        for (ConstraintVariableType c : patternTrigger.constraints()) {
291
            constraints.put(c.variable(), c.type());
293
            constraints.put(c.variable(), c.type());
292
        }
294
        }
293
295
        TriggerOptions opts = m.getAnnotation(TriggerOptions.class);
294
        PatternDescription pd = PatternDescription.create(pattern, constraints);
296
        PatternDescription pd = PatternDescription.create(pattern, constraints);
295
297
296
        addHint(hints, metadata, HintDescriptionFactory.create()
298
        addHint(hints, metadata, HintDescriptionFactory.create()
297
                                                       .setTrigger(pd)
299
                                                       .setTrigger(pd)
300
                                                       .setTriggerOptions(opts == null ? null : opts.value())
298
                                                       .setWorker(new WorkerImpl(m.getClazz().getName(), m.getName()))
301
                                                       .setWorker(new WorkerImpl(m.getClazz().getName(), m.getName()))
299
                                                       .setMetadata(metadata)
302
                                                       .setMetadata(metadata)
300
                                                       .produce());
303
                                                       .produce());
(-)a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/HintDescriptionFactory.java (+5 lines)
Lines 81-86 Link Here
81
        this.metadata = metadata;
81
        this.metadata = metadata;
82
        return this;
82
        return this;
83
    }
83
    }
84
    
85
    public HintDescriptionFactory setTriggerOptions(String[] triggerOpts) {
86
        this.trigger.setOptions(triggerOpts);
87
        return this;
88
    }
84
89
85
    public HintDescriptionFactory setTrigger(Trigger trigger) {
90
    public HintDescriptionFactory setTrigger(Trigger trigger) {
86
        if (this.trigger != null) {
91
        if (this.trigger != null) {
(-)a/spi.java.hints/src/org/netbeans/modules/java/hints/providers/spi/Trigger.java (-1 / +23 lines)
Lines 44-49 Link Here
44
import com.sun.source.tree.Tree;
44
import com.sun.source.tree.Tree;
45
import com.sun.source.tree.Tree.Kind;
45
import com.sun.source.tree.Tree.Kind;
46
import java.util.Arrays;
46
import java.util.Arrays;
47
import java.util.Collection;
48
import java.util.Collections;
49
import java.util.HashSet;
47
import java.util.Map;
50
import java.util.Map;
48
import java.util.Set;
51
import java.util.Set;
49
import org.netbeans.api.java.source.matching.Pattern;
52
import org.netbeans.api.java.source.matching.Pattern;
Lines 54-61 Link Here
54
 * @author lahvac
57
 * @author lahvac
55
 */
58
 */
56
public abstract class Trigger {
59
public abstract class Trigger {
57
60
    private static final String[] NO_OPTIONS = new String[0];
61
    
62
    private Set<String> options = Collections.emptySet();
63
    
58
    Trigger() {}
64
    Trigger() {}
65
    
66
    public boolean hasOption(String opt) {
67
        return options.contains(opt);
68
    }
69
    
70
    public void setOptions(String[] opts) {
71
        if (opts == null || opts.length == 0) {
72
            options = Collections.emptySet();
73
        } else {
74
            options = new HashSet<>(Arrays.asList(opts));
75
        }
76
    }
77
    
78
    public String[] getOptions() {
79
        return options.isEmpty() ? NO_OPTIONS : options.toArray(new String[options.size()]);
80
    }
59
81
60
    /**Invoke the given hint's worker on the specified {@link Tree.Kind}(s).
82
    /**Invoke the given hint's worker on the specified {@link Tree.Kind}(s).
61
     *
83
     *
(-)a/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/hints/HintsInvoker.java (-1 / +6 lines)
Lines 102-107 Link Here
102
import org.netbeans.api.java.source.matching.Matcher;
102
import org.netbeans.api.java.source.matching.Matcher;
103
import org.netbeans.api.java.source.matching.Occurrence;
103
import org.netbeans.api.java.source.matching.Occurrence;
104
import org.netbeans.api.java.source.matching.Pattern;
104
import org.netbeans.api.java.source.matching.Pattern;
105
import org.netbeans.spi.java.hints.TriggerOptions;
105
import org.openide.util.Exceptions;
106
import org.openide.util.Exceptions;
106
107
107
/**
108
/**
Lines 639-649 Link Here
639
        }
640
        }
640
641
641
        private void runAndAdd(TreePath path, List<HintDescription> rules, Map<HintDescription, List<ErrorDescription>> d) {
642
        private void runAndAdd(TreePath path, List<HintDescription> rules, Map<HintDescription, List<ErrorDescription>> d) {
642
            if (rules != null && !isInGuarded(info, path)) {
643
            if (rules != null) {
644
                boolean guarded = isInGuarded(info, path);
643
                OUTER: for (HintDescription hd : rules) {
645
                OUTER: for (HintDescription hd : rules) {
644
                    if (isCanceled()) {
646
                    if (isCanceled()) {
645
                        return ;
647
                        return ;
646
                    }
648
                    }
649
                    if (guarded && !hd.getTrigger().hasOption(TriggerOptions.PROCESS_LOCKED)) {
650
                        continue;
651
                    }
647
652
648
                    HintMetadata hm = hd.getMetadata();
653
                    HintMetadata hm = hd.getMetadata();
649
654
(-)a/spi.java.hints/src/org/netbeans/spi/java/hints/support/TransformationSupport.java (-1 / +3 lines)
Lines 225-231 Link Here
225
225
226
        for (HintDescription hd : PatternConvertor.create(inputJackpotPattern)) {
226
        for (HintDescription hd : PatternConvertor.create(inputJackpotPattern)) {
227
            final String triggerPattern = ((Trigger.PatternDescription) hd.getTrigger()).getPattern();
227
            final String triggerPattern = ((Trigger.PatternDescription) hd.getTrigger()).getPattern();
228
            descriptions.add(HintDescriptionFactory.create().setTrigger(hd.getTrigger()).setWorker(new HintDescription.Worker() {
228
            descriptions.add(HintDescriptionFactory.create().setTrigger(hd.getTrigger()).
229
                    setTriggerOptions(hd.getTrigger().getOptions()).
230
                setWorker(new HintDescription.Worker() {
229
                @Override public Collection<? extends ErrorDescription> createErrors(HintContext ctx) {
231
                @Override public Collection<? extends ErrorDescription> createErrors(HintContext ctx) {
230
                    final Map<String, TypeMirrorHandle<?>> constraintsHandles = new HashMap<String, TypeMirrorHandle<?>>();
232
                    final Map<String, TypeMirrorHandle<?>> constraintsHandles = new HashMap<String, TypeMirrorHandle<?>>();
231
233

Return to bug 253861