From af9c5cc45df13cd553d34cb6854adaae5678e5f5 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 17 Oct 2014 19:52:39 +0400 Subject: [PATCH] Providing plugin classpath through JPS extensions --- .../build/KotlinJpsCompilerArgumentsProvider.kt | 1 + .../jetbrains/kotlin/jps/build/KotlinBuilder.kt | 15 ++++++++++++--- plugins/android-jps-plugin/android-jps-plugin.iml | 4 ++-- .../src/KotlinAndroidJpsPlugin.kt | 9 ++++++++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinJpsCompilerArgumentsProvider.kt b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinJpsCompilerArgumentsProvider.kt index 065b2644b37..3a3833d83e6 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinJpsCompilerArgumentsProvider.kt +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinJpsCompilerArgumentsProvider.kt @@ -22,4 +22,5 @@ import org.jetbrains.jps.incremental.CompileContext public trait KotlinJpsCompilerArgumentsProvider { public fun getExtraArguments(moduleBuildTarget: ModuleBuildTarget, context: CompileContext): List + public fun getClasspath(moduleBuildTarget: ModuleBuildTarget, context: CompileContext): List } \ No newline at end of file diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 72b007a0d10..cb10338f474 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -142,11 +142,20 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR val representativeTarget = chunk.representativeTarget() + fun concatenate(strings: Array?, cp: List) = array(*(strings ?: array()), *cp.copyToArray()) + for (argumentProvider in ServiceLoader.load(javaClass())) { // appending to pluginOptions - commonArguments.pluginOptions = array( - *(commonArguments.pluginOptions ?: array()), - *argumentProvider.getExtraArguments(representativeTarget, context).copyToArray() + commonArguments.pluginOptions = concatenate(commonArguments.pluginOptions, + argumentProvider.getExtraArguments(representativeTarget, context)) + // appending to classpath + commonArguments.pluginClasspaths = concatenate(commonArguments.pluginClasspaths, + argumentProvider.getClasspath(representativeTarget, context)) + + messageCollector.report( + INFO, + "Plugin loaded: ${argumentProvider.javaClass.getSimpleName()}", + NO_LOCATION ) } diff --git a/plugins/android-jps-plugin/android-jps-plugin.iml b/plugins/android-jps-plugin/android-jps-plugin.iml index dcebb13eecf..707d7f8da33 100644 --- a/plugins/android-jps-plugin/android-jps-plugin.iml +++ b/plugins/android-jps-plugin/android-jps-plugin.iml @@ -12,6 +12,6 @@ + - - + \ No newline at end of file diff --git a/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt b/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt index 6ebf9ee56cf..16b43dd0123 100644 --- a/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt +++ b/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt @@ -22,8 +22,9 @@ import org.jetbrains.jps.incremental.CompileContext import org.jetbrains.jps.model.module.JpsModule import java.io.File import org.jetbrains.jps.android.AndroidJpsUtil -import org.jetbrains.kotlin.android.AndroidCommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.CliOption +import org.jetbrains.kotlin.android.AndroidCommandLineProcessor +import org.jetbrains.jet.utils.PathUtil public class KotlinAndroidJpsPlugin : KotlinJpsCompilerArgumentsProvider { override fun getExtraArguments(moduleBuildTarget: ModuleBuildTarget, context: CompileContext): List { @@ -34,6 +35,12 @@ public class KotlinAndroidJpsPlugin : KotlinJpsCompilerArgumentsProvider { ) } + override fun getClasspath(moduleBuildTarget: ModuleBuildTarget, context: CompileContext): List { + return listOf( + File(PathUtil.getJarPathForClass(javaClass).getParentFile().getParentFile(), "android-compiler-plugin.jar").getAbsolutePath() + ) + } + private fun makePluginOption(option: CliOption, value: String): String { return "plugin:${AndroidCommandLineProcessor.ANDROID_COMPILER_PLUGIN_ID}:${option.name}=$value" }