例如,如果您使用错误的返回值编写覆盖方法。
new Runnable() {
public int run() {
}
};
编译器将标记您的返回值int
,并显示错误消息“返回类型与Runnable.run()不兼容”。
现在我正在编写注释处理器,我可以在返回值上标记错误吗?
Messager.printMessage(Kind.ERROR, "return value error", /* which element here? */)
编辑
编译错误不仅是因为注释处理。但是注释处理会引起编译错误。问题是如何在方法的返回类型上标记错误。答案可能是“可能”或“不可能”。如果可能的话,请帮助提供示例。
答案 0 :(得分:1)
绝对有可能。我会使用Tree
API。
// In your annotation processor you get it's instance using
// processingEnv
Trees trees = Trees.instance(env);
现在,如果您必须使用TreePathScanner
检查代码。所以例如获得TreePath
的元素:
TreePath path = trees.getPath(element);
现在遍历您的TreePathScanner
:
new ReturnTypeCheckingScanner().scan(path, null);
现在您的TreePathScanner
实现:
public class ReturnTypeCheckingScanner extends TreePathScanner<Void, Void> {
@Override
public Void visitMethod(MethodTree methodTree, Void aVoid) {
Tree returnType = methodTree.getReturnType();
if(invalidReturnType(returnType)) {
trees.printMessage(
ERROR,
"Invalid return type",
returnType,
getCurrentPath().getCompilationUnit()
);
}
return aVoid;
}
}
直接使用Messager
和Element
API也应该可行。但是您必须弄清楚如何获取ExecutableElement.getReturnType()元素(类型为TypeMirror
)。