From 0042a59fb63b19d76ee9b77c6cf6f45bdc74ec67 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 23 Aug 2016 18:45:45 +0300 Subject: [PATCH] Kapt: Use also the compile classpath, not only apt classpath (cherry picked from commit d810119) --- .../AnnotationProcessingExtension.kt | 4 ++-- .../processing/AnnotationProcessingPlugin.kt | 21 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt index 58b98c7c080..07353e49413 100755 --- a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt @@ -38,14 +38,14 @@ import javax.annotation.processing.Processor import javax.tools.Diagnostic class ClasspathBasedAnnotationProcessingExtension( - val annotationProcessingClasspath: List, + val annotationProcessingClasspath: List, generatedSourcesOutputDir: File, classesOutputDir: File, javaSourceRoots: List, verboseOutput: Boolean ) : AbstractAnnotationProcessingExtension(generatedSourcesOutputDir, classesOutputDir, javaSourceRoots, verboseOutput) { override fun loadAnnotationProcessors(): List { - val classLoader = URLClassLoader(annotationProcessingClasspath.map { File(it).toURI().toURL() }.toTypedArray()) + val classLoader = URLClassLoader(annotationProcessingClasspath.map { it.toURI().toURL() }.toTypedArray()) return ServiceLoader.load(Processor::class.java, classLoader).toList() } } diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt index 9e9ffe8b641..c60ce606213 100755 --- a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey +import org.jetbrains.kotlin.config.ContentRoot import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import java.io.File @@ -81,16 +82,28 @@ class AnnotationProcessingCommandLineProcessor : CommandLineProcessor { } class AnnotationProcessingComponentRegistrar : ComponentRegistrar { + private companion object { + private val JVM_CLASSPATH_ROOT = "org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot" + private val JAVA_SOURCE_ROOT = "org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot" + + private val CLASSPATH_ROOTS = listOf(JVM_CLASSPATH_ROOT, JAVA_SOURCE_ROOT) + } + override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { val generatedOutputDir = configuration.get(AnnotationProcessingConfigurationKeys.GENERATED_OUTPUT_DIR) ?: return - val classpath = configuration.get(AnnotationProcessingConfigurationKeys.ANNOTATION_PROCESSOR_CLASSPATH) ?: return + val apClasspath = configuration.get(AnnotationProcessingConfigurationKeys.ANNOTATION_PROCESSOR_CLASSPATH)?.map(::File) ?: return val generatedOutputDirFile = File(generatedOutputDir) generatedOutputDirFile.mkdirs() + + val contentRoots = configuration[JVMConfigurationKeys.CONTENT_ROOTS] ?: emptyList() - val javaRoots = configuration[JVMConfigurationKeys.CONTENT_ROOTS] - ?.filter { it.javaClass.canonicalName == "org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot" } - ?.map { it.javaClass.getMethod("getFile")(it) as File } ?: emptyList() + fun ContentRoot.jvmRootFile() = javaClass.getMethod("getFile")(this) as File + + val compileClasspath = contentRoots.filter { it.javaClass.canonicalName in CLASSPATH_ROOTS }.map { it.jvmRootFile() } + val classpath = apClasspath + compileClasspath + + val javaRoots = contentRoots.filter { it.javaClass.canonicalName == JAVA_SOURCE_ROOT }.map { it.jvmRootFile() } val classesOutputDir = File(configuration.get(AnnotationProcessingConfigurationKeys.CLASS_FILES_OUTPUT_DIR) ?: configuration[JVMConfigurationKeys.MODULES]!!.first().getOutputDirectory())