Kapt3: Separate classpaths for compilation and for annotation processing

This commit is contained in:
Yan Zhulanow
2016-11-29 23:16:59 +03:00
committed by Yan Zhulanow
parent 3c77242da2
commit ada8bb63a4
6 changed files with 21 additions and 14 deletions
@@ -40,7 +40,8 @@ import javax.annotation.processing.Processor
import com.sun.tools.javac.util.List as JavacList
class ClasspathBasedKapt3Extension(
val annotationProcessingClasspath: List<File>,
compileClasspath: List<File>,
annotationProcessingClasspath: List<File>,
javaSourceRoots: List<File>,
sourcesOutputDir: File,
classFilesOutputDir: File,
@@ -50,7 +51,7 @@ class ClasspathBasedKapt3Extension(
val useLightAnalysis: Boolean,
pluginInitializedTime: Long,
logger: KaptLogger
) : AbstractKapt3Extension(annotationProcessingClasspath, javaSourceRoots, sourcesOutputDir,
) : AbstractKapt3Extension(compileClasspath, annotationProcessingClasspath, javaSourceRoots, sourcesOutputDir,
classFilesOutputDir, options, aptOnly, pluginInitializedTime, logger) {
override val analyzePartially: Boolean
get() = useLightAnalysis
@@ -71,7 +72,8 @@ class ClasspathBasedKapt3Extension(
}
override fun loadProcessors(): List<Processor> {
val classLoader = URLClassLoader(annotationProcessingClasspath.map { it.toURI().toURL() }.toTypedArray())
val classpath = annotationProcessingClasspath + compileClasspath
val classLoader = URLClassLoader(classpath.map { it.toURI().toURL() }.toTypedArray())
this.annotationProcessingClassLoader = classLoader
val processors = ServiceLoader.load(Processor::class.java, classLoader).toList()
@@ -98,7 +100,8 @@ class ClasspathBasedKapt3Extension(
}
abstract class AbstractKapt3Extension(
val classpath: List<File>,
val compileClasspath: List<File>,
val annotationProcessingClasspath: List<File>,
val javaSourceRoots: List<File>,
val sourcesOutputDir: File,
val classFilesOutputDir: File,
@@ -145,8 +148,8 @@ abstract class AbstractKapt3Extension(
val (annotationProcessingTime) = measureTimeMillis {
kaptContext.doAnnotationProcessing(
javaSourceFiles, processors,
classpath, sourcesOutputDir, classFilesOutputDir, kotlinSourceStubs)
javaSourceFiles, processors, compileClasspath, annotationProcessingClasspath,
sourcesOutputDir, classFilesOutputDir, kotlinSourceStubs)
}
logger.info { "Annotation processing took $annotationProcessingTime ms" }
@@ -138,7 +138,6 @@ class Kapt3ComponentRegistrar : ComponentRegistrar {
val contentRoots = configuration[JVMConfigurationKeys.CONTENT_ROOTS] ?: emptyList()
val compileClasspath = contentRoots.filterIsInstance<JvmContentRoot>().map { it.file }
val classpath = apClasspath + compileClasspath
val javaSourceRoots = contentRoots.filterIsInstance<JavaSourceRoot>().map { it.file }
@@ -155,13 +154,14 @@ class Kapt3ComponentRegistrar : ComponentRegistrar {
logger.info("Source output directory: $sourcesOutputDir")
logger.info("Classes output directory: $classFilesOutputDir")
logger.info("Stubs output directory: $stubsOutputDir")
logger.info("Annotation processing classpath: " + classpath.joinToString())
logger.info("Compile classpath: " + compileClasspath.joinToString())
logger.info("Annotation processing classpath: " + apClasspath.joinToString())
logger.info("Java source roots: " + javaSourceRoots.joinToString())
logger.info("Options: $apOptions")
}
val kapt3AnalysisCompletedHandlerExtension = ClasspathBasedKapt3Extension(
classpath, javaSourceRoots, sourcesOutputDir, classFilesOutputDir, stubsOutputDir, apOptions,
compileClasspath, apClasspath, javaSourceRoots, sourcesOutputDir, classFilesOutputDir, stubsOutputDir, apOptions,
isAptOnly, useLightAnalysis, System.currentTimeMillis(), logger)
AnalysisHandlerExtension.registerExtension(project, kapt3AnalysisCompletedHandlerExtension)
}
@@ -33,14 +33,16 @@ import com.sun.tools.javac.util.List as JavacList
fun KaptContext.doAnnotationProcessing(
javaSourceFiles: List<File>,
processors: List<Processor>,
classpath: List<File>,
compileClasspath: List<File>,
annotationProcessingClasspath: List<File>,
sourcesOutputDir: File,
classesOutputDir: File,
additionalSources: JavacList<JCTree.JCCompilationUnit> = JavacList.nil()
) {
with (options) {
put(Option.PROC, "only") // Only process annotations
put(Option.CLASSPATH, classpath.joinToString(File.pathSeparator) { it.canonicalPath })
put(Option.CLASSPATH, compileClasspath.joinToString(File.pathSeparator) { it.canonicalPath })
put(Option.PROCESSORPATH, annotationProcessingClasspath.joinToString(File.pathSeparator) { it.canonicalPath })
put(Option.S, sourcesOutputDir.canonicalPath)
put(Option.D, classesOutputDir.canonicalPath)
}
@@ -139,7 +139,7 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() {
javaSourceRoots: List<File>,
outputDir: File,
options: Map<String, String>
) : AbstractKapt3Extension(emptyList(), javaSourceRoots, outputDir, outputDir,
) : AbstractKapt3Extension(emptyList(), emptyList(), javaSourceRoots, outputDir, outputDir,
options, true, System.currentTimeMillis(), KaptLogger(true)
) {
internal var savedStubs: String? = null
@@ -100,7 +100,8 @@ abstract class AbstractKotlinKaptContextTest : AbstractKotlinKapt3Test() {
val sourceOutputDir = Files.createTempDirectory("kaptRunner").toFile()
try {
kaptRunner.doAnnotationProcessing(emptyList(), listOf(JavaKaptContextTest.simpleProcessor()),
classpath = listOf(), sourcesOutputDir = sourceOutputDir, classesOutputDir = sourceOutputDir,
compileClasspath = emptyList(), annotationProcessingClasspath = emptyList(),
sourcesOutputDir = sourceOutputDir, classesOutputDir = sourceOutputDir,
additionalSources = compilationUnits)
val javaFiles = sourceOutputDir.walkTopDown().filter { it.isFile && it.extension == "java" }
@@ -82,7 +82,8 @@ class JavaKaptContextTest {
).doAnnotationProcessing(
listOf(javaSourceFile),
listOf(processor),
emptyList(), // classpath
emptyList(), // compile classpath
emptyList(), // annotation processing classpath
outputDir,
outputDir)
}