Kapt3: Separate classpaths for compilation and for annotation processing
This commit is contained in:
committed by
Yan Zhulanow
parent
3c77242da2
commit
ada8bb63a4
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user