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