在注释处理中是否可能在方法的返回类型上引发编译错误

时间:2018-07-11 09:26:21

标签: java annotations annotation-processing annotation-processor

例如,如果您使用错误的返回值编写覆盖方法。

new Runnable() {
  public int run() {

  }
};

编译器将标记您的返回值int,并显示错误消息“返回类型与Runnable.run()不兼容”。

现在我正在编写注释处理器,我可以在返回值上标记错误吗?

Messager.printMessage(Kind.ERROR, "return value error", /* which element here? */)

编辑

编译错误不仅是因为注释处理。但是注释处理会引起编译错误。问题是如何在方法的返回类型上标记错误。答案可能是“可能”或“不可能”。如果可能的话,请帮助提供示例。

1 个答案:

答案 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;
    }

}

直接使用MessagerElement API也应该可行。但是您必须弄清楚如何获取ExecutableElement.getReturnType()元素(类型为TypeMirror)。