-1

例如,如果您编写了具有错误返回值的覆盖方法。

new Runnable() {
  public int run() {

  }
};

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

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

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

编辑

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

4

1 回答 1

1

这绝对是可能的。我会使用TreeAPI。

// 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;
    }

}

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

于 2018-08-10T20:24:56.940 回答