gpt4 book ai didi

java - 当处理器依赖于注释值中的类时,选择 Gradle 增量注释处理器类别

转载 作者:行者123 更新时间:2023-12-02 00:50:38 25 4
gpt4 key购买 nike

我有一个简单的annotation processor其应用如下:

@DiffElement(diffReceiver = Renderer.class)
class ViewState {
String getHello();
int getWorld();
}

class Renderer {
void renderHello(String hello);
void renderWorld(int world);
}

要使该处理器正常工作,get 函数的名称和 Renderer 接口(interface)函数参数的名称必须匹配。它会检查这一点,并使用注释的参数来查看提供的类并基于该类进行一些代码生成。

它生成一个文件。

我已阅读 Incremental annotation processing 上的文档我无法决定该处理器适用于哪个类别。以下是我的考虑:

  • 它不能隔离,因为它不会从带注释元素的 AST 派生所有内容,因为它还从注释参数检查类
  • 它不能聚合,因为它在Renderer类上没有任何注释,所以根据上面的文档,处理器不会在任何时候被调用Renderer 类发生变化,因为处理器尚未注册来处理此文件,因此这将导致生成结果出错。

问题:

  • 我正确理解文档吗?或者某些类别是否仍适用于该处理器
  • 如果它不属于任一类别,我如何告诉 Gradle 它不是增量的,这样“kotlin kapt”等工具就不会向用户提示我的处理器不是增量的

最佳答案

Do I understand documentation correctly? Or can some category still be applied to this processor

有关处理器类别的文档非常简短,而且在我看来,缺乏示例。我花了很多时间来弄清楚这些文档,构建一些简单的实验项目。因此,据我所知,如果我最终正确地弄清楚了它们,就可以应用一个类别:)

你说的是

it can't be isolating, because it doesn't derive everything from annotated element's AST, as it also inspects a class from annotation argument

这并不完全正确,我将解释原因。正如 documentation 中提到的,隔离处理器

must make all decisions (code generation, validation messages) for an annotated type based on information reachable from its AST. This means you can analyze the types' super-class, method return types, annotations etc., even transitively.

“甚至传递”短语在这里非常重要 - 它意味着,您不仅可以分析带注释类型的 AST,还可以分析其中某些方法的返回类型的 AST,然后,比方说,可以分析那种类型...

据我了解,您可以通过带注释元素的 AST 遍历发现的每种类型,都是带注释类型(或一般元素)的依赖项。如果依赖项发生更改,则依赖类型需要重新编译。因此,当 Renderer 类发生更改时,ViewState 将被重新编译,从而重新处理,因为它引用 Renderer 作为其注释参数。父类(super class)型、超接口(interface)、方法的返回类型、方法参数的类型、注释类参数……所有这些都被视为依赖类型。

因此,您的注释处理器实际上可以隔离

<小时/>

P.S.如果隔离不起作用,请确保注释保留为 CLASS 或更高级别,无论出于何种原因。

P.P.S.我发现注释处理中的增量是一个非常阴暗的话题,充满了惊喜和水下岩石。我自己发现的经验法则是,几乎每个经过一些调整的处理器都可以隔离,除非它确实需要基于许多输入生成一个实体。而且,重要的是,只有这些输入在引用方面彼此完全无关,甚至位于不同的库中。

关于java - 当处理器依赖于注释值中的类时,选择 Gradle 增量注释处理器类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com