Tag: 注释处理

在“注释处理器”中为生成的类指定路径

我正在创建一个Android应用程序。 我使用AbstractProcessor从Annotated类和Velocity模板生成我自己的类。 这是生成源文件的方法。 private void createSourceFile(String className, String packageName, VelocityContext context, Template template) throws IOException { final JavaFileObject javaFileObject = processingEnv.getFiler().createSourceFile(packageName + "." + className); processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "creating file: " + javaFileObject.toUri()); final Writer writer = javaFileObject.openWriter(); if (DEBUGGING) { processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "applying velocity template: " + template.getName()); } template.merge(context, writer); writer.close(); } 我的问题是 我可以为生成的类指定一个目录吗? 现在他们在build / […]

如何为本地库启动annotationProcessing(kapt)?

我写小型库进行注释处理。 使用Gradle将其编译为jar文件并添加到android项目中。 在build.gradle应用程序lvl我补充说: dependencies { //… compile files('/Users/I/Documents/Projects/my/test2/build/libs/codelib-0.3.jar') } 和 android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true 但是,如果我建立的项目Java类没有产生。 在另一个Java项目(不是android!)中,所有完美的作品(用于构建我使用命令gradle assemble )和文件创建。 对于注释在另一个依赖关系(匕首,滑翔)处理我使用“kotlin-kapt”,他在那里工作得很好,但他不是很明显的地方。

为kapt禁用增量构建

由于android gradle插件默认启用了增量构建,因此注释处理会中断,因为只有自上次增量构建以来更改过的那些类才会被注释处理器考虑在内。 所以对于java源代码,我们通常使用apt grald插件来运行注释处理。 但是,如果在同一个项目中使用apt ,则Android的gradle插件会自动禁用gradle的增量构建功能: https : //github.com/google/dagger/issues/298 现在我正在开发一个kotlin项目,我正面临与kapt相同的增量构建问题。 所以与apt ,解决方案是禁用增量构建。 该文件说: android { compileOptions.incremental = false … } 但是,这不适合我。 有谁知道如何禁用增量构建?

使用kapt和gradle时,无法调试注释处理器

我正在构建一个注释处理器,最近我使用kotlin-kapt插件将默认的annotationProcessor类型转换为kapt。 我正在使用该命令调试我的处理器 ./gradlew –no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac (完整的说明在这里: https : //stackoverflow.com/a/42488641/502463 ) 然后运行远程调试配置。 当我使用annotationProcessor时,我可以打断点,并且很好的调试。 与kapt,我的处理器运行,但我无法调试它。 没有断点被触发。 我的kotlin版本是1.1.2-3

kotlin注释处理器中的可空类型

我正在为Kotlin处理注释处理程序,因为处理的元素是用Java编写的,所以我没有收到可空的数据? 而不是@Nullable注释,这很好,但我正在接受类型和高阶函数中的空参数的问题,正常的参数。 var someNullField: String? = "" 我将在其注释中使用@org.jetbrains.annotations.Nullable来接收java.lang.String 。 但是List<String?>例如会返回我java.util.List<java.lang.String>而不会在主要元素中没有任何注释,而不会在导致未知可空性状态的类型参数中 我尝试使用javax.lang.model.util.Types来找到某种结果,但没有。 我现在使用的一些代码: val utils = processingEnvironment.typeUtils val type = fieldElement.asType() if (type is DeclaredType) { val typeElement = utils.asElement(type) type.typeArguments .forEach { //Trying different ways and just printing for possible results val capture = utils.capture(it) val erasure = utils.erasure(it) val element = utils.asElement(it) printMessage("element: $element […]

Java注释处理器 – 注释的Kotlin类单元测试

我有一个注释处理器库 ,我想为Kotlin工作,但是我的单元测试遇到了麻烦。 如果有人能给我一些建议,我将不胜感激。 我目前的单元测试实现使用Google的编译测试库。 我创建输入和输出类并将它们存储在资源目录中。 然后在单元测试期间,编译测试库编译输入java类,执行注释处理器,然后将生成的类与资源目录中的预期输出类进行比较。 这里是我所指的一个例子(从我的项目): 单元测试类 资源(输入和预期的输出类 这对我所有的基于java的单元测试都很有帮助。 但是,当我尝试使用Kotlin类编写一些测试时,我的测试无法加载类。 我相信这是由于编译测试库首先是一个Java特定的库(我没有看到他们的项目中提到Kotlin) 目前我遇到以下问题: java.lang.IllegalArgumentException: Compilation unit is not of SOURCE kind: "/C:/dev/gsonpath/gsonpath-compiler/build/resources/test/adapter/auto/field_types/primitives/valid/TestValidPrimitives.kt" at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:137) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64) at com.google.testing.compile.Compilation.compile(Compilation.java:69) at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:281) 这个问题相当明显,正在使用不正确的编译器。 当我的文件扩展名不是'.java'时引发异常。 如果我尝试使用'.java'文件扩展名加载Kotlin类,它不起作用,因为它的Java语法不正确。 有没有人遇到过这个问题,并解决了它? 我看了一些其他的注释处理器(比如DBFlow ),而且他们不用这种方式编写单元测试。 由于Kotlin最近才在注释处理中涉足,也许我是第一个有这个问题的?

使用Kotlin进行数据绑定会导致Resources $ NotFoundException

上下文 我正在使用一个利用数据绑定的库来通过BindingAdapter在任何View上定义一个自定义属性: @BindingAdapter({"attribute"}) public static void bindAttribute(@NonNull View view, String attribute) {…} 这使我可以定义由库在运行时处理的自定义属性: <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:algolia="http://schemas.android.com/apk/res-auto"> <LinearLayout <!– … –> android:orientation="horizontal"> <ImageView <!– … –> algolia:attribute='@{"objectID"}'/> </LinearLayout> </layout> 这个视图然后被用作子类RecyclerView的ViewHolder的itemLayout 。 所有这些在我的Java应用程序中工作正常。 问题 我开始在Kotlin建立一个类似的应用程序。 要使用数据绑定,我按照文档的指南,并添加以下内容: // ./app/build.gradle apply plugin: 'kotlin-kapt' android { dataBinding { enabled true } … } dependencies { kapt "com.android.databinding:compiler:$plugin_version" […]

Kotlin可以使用龙目吗?

我有一个Kotlin Gradle项目。 我将Kotlin添加为依赖项,并使用kapt注册 compileOnly("org.projectlombok:lombok:$lombokVersion") kapt("org.projectlombok:lombok:$lombokVersion") 我只想使用@Slf4j anotation来自动生成log 。 它适用于Java类,但不适用于Kotlin类。 现在甚至可以一起使用Kotling和Lombok? 编辑:添加更多的细节 如果我用@Slf4j注释一个Kotlin类,并使用它里面的log ,我会得到 未解决的参考:日志 显然没有应用注释处理。

如何从注释处理器生成一个kotlin文件?

我有一个java注释处理器,在编译过程中生成一堆java文件。 我想通过添加扩展方法使生成的类更好地在kotlin中使用。 我已经被告知在kotlin论坛上,我可以尝试的是写一个包含我的扩展功能的kotlin文件。 我试过这个,我用Filer对象来创建这个文件输出到StandardLocations.SOURCE_OUTPUT目录。 Intellij可以看到我生成的类,并且可以按照预期使用扩展函数,但是由于编译器无法找到新的kotlin文件,所以应用程序将无法编译。 有什么办法可以写一个新的kotlin文件,这个文件可以被kotlin编译器使用吗?