混合java/KotlinAndroid项目中的AnnotationProcessor不处理kotlin类

34gzjxbg  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(166)

在一个Android项目中(原生的混合java /Kotlin),我们使用一个简单的注解处理器在构建过程中生成一个类。生成的类包含了项目中所有的Activity类,这些类已经被特定的项目内部注解所注解,我们使用它来初始化Android设备上的一些特定硬件。
注解处理器工作正常,我们现在遇到了一个问题,一个Activity类 * 没有 * 编译到生成的类中。我意识到这个Activity是第二个用Kotlin实现的Activity,也是第一个基于kotlin的Activity
因此,我深入注解处理器,检查了从RoundEnvironment获得的注解文件集,实际上,在我们的处理器操作的集合中已经缺少Activity类。
所以我的问题是

  • 为什么基于Kotlin的Activity类不包含在环境中?
  • 或者我该怎么做才能把它包括进去?

下面是注解处理器的相关代码:

// [...]
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
// [...]

@SupportedAnnotationTypes(EnableScannerTypesAnnotationProcessor.ENABLE_SCANNER_ANNOTATION)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SuppressWarnings("PMD.ConsecutiveLiteralAppends")
public class EnableScannerTypesAnnotationProcessor
    extends AbstractProcessor {

    // [...]

    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        // [...]
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    
        for (TypeElement annotation : annotations) {
            if (annotation.getQualifiedName().contentEquals(ENABLE_SCANNER_ANNOTATION)) {
                final Set<? extends Element> annotatedTypes = roundEnv.getElementsAnnotatedWith(annotation);
                // the processor now operates on the set `annotatedTypes`
                // [...]
6jjcrrmo

6jjcrrmo1#

我们最终基于KSP而不是KAPT重新实现了注解处理器。这样,它确实也可以看到基于Kotlin的类。
重新实现非常简单。虽然我希望有一个更好的文档为KSP。

相关问题