NetBeans Java Hints: Quick & Dirty Guide
- by Geertjan
In NetBeans IDE 7.2, a new wizard will be found in the "Module Development" category in the New File dialog, for creating new Java Hints.
Select a package in a NetBeans module project. Right click, choose New/Other.../Module Development/Java Hint: You'll then see this:
Fill in:
Class Name: the name of the class that should be generated. E.g. "Example".
Hint Display Name: the display name of the hint itself (as will appear in Tools/Options). E.g. "Example Hint".
Warning Message: the warning that should be produced by the hint. E.g. "Something wrong is going on".
Hint Description: a longer description of the hint, will appear in Tools/Options and eventually some other places. E.g. "This is an example hint that warns about an example problem."
Will also provide an Automatic Fix: whether the hint will provide some kind of transformation. E.g. "yes".
Fix Display Name: the display name of such a fix/transformation. E.g. "Fix the problem".
Click Finish.
Should generate "Example.java", the hint itself:
import com.sun.source.util.TreePath;
import org.netbeans.api.java.source.CompilationInfo;
import org.netbeans.spi.editor.hints.ErrorDescription;
import org.netbeans.spi.editor.hints.Fix;
import org.netbeans.spi.java.hints.ConstraintVariableType;
import org.netbeans.spi.java.hints.ErrorDescriptionFactory;
import org.netbeans.spi.java.hints.Hint;
import org.netbeans.spi.java.hints.HintContext;
import org.netbeans.spi.java.hints.JavaFix;
import org.netbeans.spi.java.hints.TriggerPattern;
import org.openide.util.NbBundle.Messages;
@Hint(displayName = "DN_com.bla.Example",
description = "DESC_com.bla.Example",
category = "general") //NOI18N
@Messages({"DN_com.bla.Example=Example Hint",
"DESC_com.bla.Example=This is an example hint that warns about an example problem."})
public class Example {
@TriggerPattern(value = "$str.equals(\"\")", //Specify a pattern as needed
constraints =
@ConstraintVariableType(variable = "$str", type = "java.lang.String"))
@Messages("ERR_com.bla.Example=Something wrong is going on")
public static ErrorDescription computeWarning(HintContext ctx) {
Fix fix = new FixImpl(ctx.getInfo(), ctx.getPath()).toEditorFix();
return ErrorDescriptionFactory.forName(ctx, ctx.getPath(), Bundle.ERR_com.bla_Example(), fix);
}
private static final class FixImpl extends JavaFix {
public FixImpl(CompilationInfo info, TreePath tp) {
super(info, tp);
}
@Override
@Messages("FIX_com.bla.Example=Fix the problem")
protected String getText() {
return Bundle.FIX_com_bla_Example();
}
@Override
protected void performRewrite(TransformationContext ctx) {
//perform the required transformation
}
}
}
Should also generate "ExampleTest.java", a test for it. Unfortunately, the wizard infrastructure is not capable of handling changes related to test dependencies. So the ExampleTest.java has a todo list at its begining:
/* TODO to make this test work:
- add test dependency on Java Hints Test API (and JUnit 4)
- to ensure that the newest Java language features supported by the IDE are available,
regardless of which JDK you build the module with:
-- for Ant-based modules, add "requires.nb.javac=true" into nbproject/project.properties
-- for Maven-based modules, use dependency:copy in validate phase to create
target/endorsed/org-netbeans-libs-javacapi-*.jar and add to endorseddirs
in maven-compiler-plugin configuration
*/Warning: if this is a project for which tests never existed before, you may need to close&reopen the project, so that "Unit Test Libraries" node appears - a bug in apisupport projects, as far as I can tell.
Thanks to Jan Lahoda for the above rough guide.