我最近开始涉足定制的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)));
}
这是我的单元测试显示良好的运行
这是使用getter和setter但不使用helloWorld方法的方法视图。
答案 0 :(得分:0)
根据上面提供的代码,您只触及了Lombok插件的JAVA编译器部分。 lombok源代码还有其他部分可以顺利地与IDE-s集成,如intellyJ或Eclipse。
您肯定希望继续https://github.com/mplushnikov/lombok-intellij-plugin的研究。
使用JRE运行时的代码是由JAVAC(gradle)生成的。 intellyJ IDE不使用该代码。
如果要在方法视图中查看方法,则必须为intellyJ IDE实现注释处理器。