APT: Use task qualifiers in annotation file names

This commit is contained in:
Yan Zhulanow
2015-05-26 17:50:11 +03:00
parent cbe435ccef
commit c2dd7d197e
3 changed files with 23 additions and 13 deletions
@@ -37,7 +37,10 @@ data class AnnotatedMethodDescriptor(classFqName: String, public val methodName:
data class AnnotatedConstructorDescriptor(classFqName: String) : AnnotatedElementDescriptor(classFqName)
data class AnnotatedFieldDescriptor(classFqName: String, public val fieldName: String) : AnnotatedElementDescriptor(classFqName)
public abstract class AnnotationProcessorWrapper(private val processorFqName: String) : Processor {
public abstract class AnnotationProcessorWrapper(
private val processorFqName: String,
private val taskQualifier: String
) : Processor {
private val processor: Processor by Delegates.lazy {
try {
@@ -72,7 +75,7 @@ public abstract class AnnotationProcessorWrapper(private val processorFqName: St
return
}
val annotationsTxt = processingEnv.getFiler().getResource(StandardLocation.CLASS_PATH, "", "annotations.kotlin.txt")
val annotationsTxt = processingEnv.getFiler().getResource(StandardLocation.CLASS_PATH, "", "annotations.$taskQualifier.txt")
kotlinAnnotationsProvider = FileObjectKotlinAnnotationProvider(annotationsTxt)
processor.init(processingEnv)
@@ -29,6 +29,7 @@ import java.util.zip.ZipFile
public class AnnotationProcessingManager(
private val task: AbstractCompile,
val javaTask: JavaCompile,
val taskQualifier: String,
val aptFiles: Set<File>,
val aptOutputDir: File,
val aptWorkingDir: File) {
@@ -38,13 +39,12 @@ public class AnnotationProcessingManager(
private companion object {
val JAVA_FQNAME_PATTERN = "^([\\p{L}_$][\\p{L}\\p{N}_$]*\\.)*[\\p{L}_$][\\p{L}\\p{N}_$]*$".toRegex()
val WRAPPERS_DIRECTORY = "wrappers"
val ANNOTATIONS_FILENAME = "annotations.kotlin.txt"
val GEN_ANNOTATION = "__gen/annotation"
}
fun getAnnotationFile(): File {
aptWorkingDir.mkdirs()
return File(aptWorkingDir, "$WRAPPERS_DIRECTORY/$ANNOTATIONS_FILENAME")
return File(aptWorkingDir, "$WRAPPERS_DIRECTORY/annotations.$taskQualifier.txt")
}
fun setupKapt() {
@@ -79,7 +79,7 @@ public class AnnotationProcessingManager(
javaTask.source(javaAptSourceDir)
}
private fun generateAnnotationProcessorStubs(aptDir: File, javaTask: JavaCompile, apFqNames: Set<String>) {
private fun generateAnnotationProcessorStubs(aptDir: File, javaTask: JavaCompile, processorFqNames: Set<String>) {
val stubOutputDir = File(aptDir, "$WRAPPERS_DIRECTORY")
generateKotlinAptAnnotation(stubOutputDir)
@@ -87,12 +87,12 @@ public class AnnotationProcessingManager(
val stubOutputPackageDir = File(stubOutputDir, "__gen")
stubOutputPackageDir.mkdirs()
for (processor in apFqNames) {
for (processor in processorFqNames) {
generateAnnotationProcessorWrapper(processor, "__gen", stubOutputPackageDir)
}
val annotationProcessorWrapperFqNames = apFqNames
.map { "__gen.AnnotationProcessorWrapper_${it.replace('.', '_')}" }
val annotationProcessorWrapperFqNames = processorFqNames
.map { fqName -> "__gen." + getProcessorStubClassName(fqName) }
.joinToString(",")
javaTask.appendClasspath(stubOutputDir)
@@ -120,6 +120,10 @@ public class AnnotationProcessingManager(
javaTask.getOptions().setCompilerArgs(compilerArgs)
}
private fun getProcessorStubClassName(processorFqName: String): String {
return "AnnotationProcessorWrapper_${taskQualifier}_${processorFqName.replace('.', '_')}"
}
private fun addGeneratedSourcesOutputToCompilerArgs(javaTask: JavaCompile, outputDir: File) {
outputDir.mkdirs()
@@ -160,7 +164,7 @@ public class AnnotationProcessingManager(
}
private fun generateAnnotationProcessorWrapper(processorFqName: String, packageName: String, outputDirectory: File) {
val className = "AnnotationProcessorWrapper_${processorFqName.replace('.', '_')}"
val className = getProcessorStubClassName(processorFqName)
val classFqName = "$packageName/$className"
val bytes = with (ClassWriter(0)) {
@@ -174,9 +178,10 @@ public class AnnotationProcessingManager(
with (visitMethod(ACC_PUBLIC, "<init>", "()V", null, null)) {
visitVarInsn(ALOAD, 0)
visitLdcInsn(processorFqName)
visitMethodInsn(INVOKESPECIAL, superClass, "<init>", "(Ljava/lang/String;)V", false)
visitLdcInsn(taskQualifier)
visitMethodInsn(INVOKESPECIAL, superClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V", false)
visitInsn(RETURN)
visitMaxs(2, 1)
visitMaxs(3 /*max stack*/, 1 /*max locals*/)
visitEnd()
}
@@ -168,7 +168,8 @@ class Kotlin2JvmSourceSetProcessor(
if (aptConfiguration.getDependencies().size() > 1 && javaTask is JavaCompile) {
val (aptOutputDir, aptWorkingDir) = project.getAptDirsForSourceSet(kotlinTask, sourceSet.getName())
val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, aptConfiguration.resolve(), aptOutputDir, aptWorkingDir)
val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, sourceSet.getName(),
aptConfiguration.resolve(), aptOutputDir, aptWorkingDir)
kotlinTask.storeKaptAnnotationsFile(kaptManager)
javaTask.doFirst {
@@ -437,7 +438,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler, val t
javaTask.dependsOn(kotlinTaskName)
val kaptManager = if (javaTask is JavaCompile) {
val manager = AnnotationProcessingManager(kotlinTask, javaTask, aptFiles.toSet(), aptOutputDir, aptWorkingDir)
val manager = AnnotationProcessingManager(kotlinTask, javaTask, variantDataName,
aptFiles.toSet(), aptOutputDir, aptWorkingDir)
kotlinTask.storeKaptAnnotationsFile(manager)
manager
}