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