@GenerateInterface class A {}
@GenerateInterface class B {
void setA(IA a) {}
}
我的注释处理器应生成以下接口:
interface IA {}
interface IB {
void setA(IA a);
}
B
使用正确的导入语句编译良好。 但是,IB
错过了参数IA a
。我使用javapoet来生成接口。用于编译方法参数的代码:
method.getParameters().forEach(p -> {
ParameterSpec.Builder parameterBuilder = ParameterSpec.builder(
TypeName.get(p.asType()),
p.getSimpleName().toString(),
p.getModifiers().toArray(new Modifier[p.getModifiers().size()]));
p.getAnnotationMirrors().stream()
.map(AnnotationSpec::get)
.forEach(parameterBuilder::addAnnotation);
methodBuilder.addParameter(parameterBuilder.build());
});
method
是一个ExecutableElement
. p.asType()
只持有简单的名称IA
。此时,可能尚未生成IA
,因此没有完全限定的名称可用。
目前,我为每个带注释的类逐个生成接口。据我了解,我首先需要一个所有带注释的类及其派生接口名称的列表。然后,当我遇到尚未生成的参数类型时,请从上面的列表中获取完全限定的名称以插入正确的导入语句。
有没有聪明的方法可以做到这一点?我至少可以区分尚未编译的类型与已经编译的类型吗?
编辑:完整代码
我正在为我的 Kripton 持久性库开发注释处理器,我遇到了类似的问题。我的问题相似但不相同:在我的生成类中,我引用了在同一轮中生成的其他生成的类。
我应用的解决方案只是手动"生成"TypeName。在我的注释处理器中,我使用一个特定的类,你可以在这里找到哪个来源。
Kripton将为Android平台生成实现基于SQLite的DAO模式的类。当我生成数据源时,我需要引用将在同一轮中生成的 DAO 类。为此并避免相同的问题,我生成了关联的 TypeName。您可以在 BindDataSourceBuilder 类的方法buildDataSource
中看到这一点。
希望这些信息对您仍然有用。