自定义Lombok注释方法未显示在“方法”视图中

时间:2018-04-11 19:07:47

标签: java annotations lombok

我最近开始涉足定制的lombok变换,并提出了一个@HelloWorld转换,它简单地打印出了hello world。我的单元测试通过检查并运行helloWorld方法,但是,当我进入intelliJ中的方法视图时,它不会显示(与lombok创建的getter和setter不同)。任何人都可以检查我有什么,看看我错过了什么?不胜感激!

FWIW:我正在进行javac实施。

@Override
public void handle(AnnotationValues<HelloWorld> annotation, JCAnnotation ast, JavacNode annotationNode) {

    handleFlagUsage(annotationNode, HELLO_WORLD_FLAG_USAGE, "@HelloWorld");

    JavacNode parent = annotationNode.up();
    validateType(parent, annotationNode);
    validateAccessLevel(annotation, annotationNode);
    validateParent(parent, annotationNode);

    JCMethodDecl helloWorld = createHelloWorld(annotationNode);
    JavacHandlerUtil.injectMethod(parent, helloWorld);
}

void validateType(JavacNode parent, JavacNode annotationNode) {
    JCClassDecl typeDecl = null;
    if (parent.get() instanceof JCClassDecl) typeDecl = (JCClassDecl) parent.get();
    long modifiers = typeDecl == null ? 0 : typeDecl.mods.flags;
    boolean notAClass = (modifiers & (Flags.INTERFACE | Flags.ANNOTATION | Flags.ENUM)) != 0;

    if (notAClass) {
        annotationNode.addError("@HelloWorld is only supported on a class");
    }
}

void validateAccessLevel(AnnotationValues<HelloWorld> annotation, JavacNode annotationNode) {
    HelloWorld annotationInstance = annotation.getInstance();
    AccessLevel level = annotationInstance.value();

    if (level == AccessLevel.NONE) {
        annotationNode.addError("No access level");
    }
}

void validateParent(JavacNode parent, JavacNode annotationNode) {
    if (parent == null) {
        annotationNode.addError("Parent is null");
    }
}

JCMethodDecl createHelloWorld(JavacNode node) {

    JavacTreeMaker treeMaker = node.getTreeMaker();

    // Generate method type
    JCExpression methodType = treeMaker.Type(Javac.createVoidType(treeMaker, CTC_VOID));
    // Generate the methodName
    Name methodName = node.toName("helloWorld");
    // Generate statements
    List<JCStatement> statements = createHelloWorldBody(treeMaker, node);
    // Generate method body
    JCBlock methodBody = treeMaker.Block(0, statements);
    // Generate generic types
    List<JCTypeParameter> methodGenericParams = List.nil();
    // Generate method parameters
    List<JCVariableDecl> parameters = List.nil();
    // Generate throws clause
    List<JCExpression> throwsClauses = List.nil();

    JCExpression annotationMethodDefaultValue = null;

    return treeMaker.MethodDef(
                    treeMaker.Modifiers(Flags.PUBLIC),
                    methodName,
                    methodType,
                    methodGenericParams,
                    parameters,
                    throwsClauses,
                    methodBody,
                    annotationMethodDefaultValue);
}

List<JCStatement> createHelloWorldBody(JavacTreeMaker treeMaker, JavacNode field) {
    JCExpression printlnMethod = JavacHandlerUtil.chainDots(field, "System", "out", "println");
    List<JCExpression> printlnArgs = List.of(treeMaker.Literal("hello world"));
    return List.of(treeMaker.Exec(treeMaker.Apply(List.nil(), printlnMethod, printlnArgs)));
}

这是我的单元测试显示良好的运行

unit test

这是使用getter和setter但不使用helloWorld方法的方法视图。

method view

1 个答案:

答案 0 :(得分:0)

根据上面提供的代码,您只触及了Lombok插件的JAVA编译器部分。 lombok源代码还有其他部分可以顺利地与IDE-s集成,如intellyJ或Eclipse。

您肯定希望继续https://github.com/mplushnikov/lombok-intellij-plugin的研究。

使用JRE运行时的代码是由JAVAC(gradle)生成的。 intellyJ IDE不使用该代码。

如果要在方法视图中查看方法,则必须为intellyJ IDE实现注释处理器