diff --git a/.idea/modules.xml b/.idea/modules.xml index 0e4be34ac14..0dfff9df3d4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,8 @@ + + diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java index 8b5654fe674..27b1e73d9eb 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.java @@ -66,14 +66,6 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments { @Argument(value = "Xno-optimize", description = "Disable optimizations") public boolean noOptimize; - @Argument(value = "androidRes", description = "Android resources path") - @ValueDescription("") - public String androidRes; - - @Argument(value = "androidManifest", description = "Android manifest file") - @ValueDescription("") - public String androidManifest; - @Override @NotNull public String executableScriptFileName() { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/JVMConfigurationKeys.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/JVMConfigurationKeys.java index 2bf8b65f7a3..30a4c1ca94d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/JVMConfigurationKeys.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/JVMConfigurationKeys.java @@ -51,10 +51,4 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey> MODULE_IDS = CompilerConfigurationKey.create("module id strings"); - - public static final CompilerConfigurationKey ANDROID_RES_PATH = - CompilerConfigurationKey.create("android resources search path"); - - public static final CompilerConfigurationKey ANDROID_MANIFEST = - CompilerConfigurationKey.create("android manifest file"); } diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBoxTest.kt b/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBoxTest.kt index 75d1aa0e127..fc51edd2f7c 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBoxTest.kt +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBoxTest.kt @@ -31,6 +31,7 @@ import com.intellij.util.Processor import org.jetbrains.jet.codegen.CodegenTestFiles import java.util.regex.Pattern import org.jetbrains.jet.config.CompilerConfiguration +import org.jetbrains.kotlin.android.AndroidConfigurationKeys public abstract class AbstractAndroidBoxTest : AbstractBlackBoxCodegenTest() { @@ -43,8 +44,8 @@ public abstract class AbstractAndroidBoxTest : AbstractBlackBoxCodegenTest() { } private fun createEnvironmentForConfiguration(configuration: CompilerConfiguration, path: String) { - configuration.put(JVMConfigurationKeys.ANDROID_RES_PATH, path + "layout/"); - configuration.put(JVMConfigurationKeys.ANDROID_MANIFEST, path + "AndroidManifest.xml"); + configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, path + "layout/"); + configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, path + "AndroidManifest.xml"); myEnvironment = JetCoreEnvironment.createForTests(getTestRootDisposable()!!, configuration); } diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBytecodePersistenceTest.kt b/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBytecodePersistenceTest.kt index 7cbc43805c5..d34d46bab51 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBytecodePersistenceTest.kt +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/android/AbstractAndroidBytecodePersistenceTest.kt @@ -23,6 +23,7 @@ import org.jetbrains.jet.TestJdkKind import org.jetbrains.jet.config.CompilerConfiguration import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment +import org.jetbrains.kotlin.android.AndroidConfigurationKeys public abstract class AbstractAndroidBytecodePersistenceTest : AbstractBytecodeTextTest() { @@ -35,8 +36,8 @@ public abstract class AbstractAndroidBytecodePersistenceTest : AbstractBytecodeT } private fun createEnvironmentForConfiguration(configuration: CompilerConfiguration, path: String) { - configuration.put(JVMConfigurationKeys.ANDROID_RES_PATH, path + "res/layout/"); - configuration.put(JVMConfigurationKeys.ANDROID_MANIFEST, path + "../AndroidManifest.xml"); + configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, path + "res/layout/"); + configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, path + "../AndroidManifest.xml"); myEnvironment = JetCoreEnvironment.createForTests(getTestRootDisposable()!!, configuration); } public override fun doTest(path: String) { diff --git a/idea/tests/org/jetbrains/jet/android/AbstractCrossParserTest.kt b/idea/tests/org/jetbrains/jet/android/AbstractCrossParserTest.kt index b24a32eb1b2..1730475a4b1 100644 --- a/idea/tests/org/jetbrains/jet/android/AbstractCrossParserTest.kt +++ b/idea/tests/org/jetbrains/jet/android/AbstractCrossParserTest.kt @@ -16,7 +16,6 @@ package org.jetbrains.jet.android -import com.intellij.testFramework.UsefulTestCase import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment import org.jetbrains.jet.lang.resolve.android.CliAndroidUIXmlProcessor import org.jetbrains.jet.JetTestUtils @@ -24,20 +23,10 @@ import org.jetbrains.jet.ConfigurationKind import org.jetbrains.jet.TestJdkKind import org.jetbrains.jet.plugin.android.IDEAndroidUIXmlProcessor import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys -import junit.framework.TestCase import kotlin.test.assertEquals import org.jetbrains.jet.plugin.android.TestConst -import com.intellij.testFramework.LightCodeInsightTestCase -import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import org.jetbrains.jet.plugin.PluginTestCaseBase -import org.jetbrains.jet.test.TestMetadata -import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase -import com.intellij.ide.startup.impl.StartupManagerImpl -import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess -import org.jetbrains.jet.JetTestCaseBuilder -import com.intellij.openapi.startup.StartupManager -import com.android.SdkConstants -import com.intellij.openapi.application.PathManager +import org.jetbrains.kotlin.android.AndroidConfigurationKeys public abstract class AbstractCrossParserTest : KotlinAndroidTestCase() { public fun doTest(path: String) { @@ -55,8 +44,8 @@ public abstract class AbstractCrossParserTest : KotlinAndroidTestCase() { private fun getEnvironment(testPath: String): JetCoreEnvironment { val configuration = JetTestUtils.compilerConfigurationForTests(ConfigurationKind.ALL, TestJdkKind.MOCK_JDK) - configuration.put(JVMConfigurationKeys.ANDROID_RES_PATH, testPath + "/layout") - configuration.put(JVMConfigurationKeys.ANDROID_MANIFEST, testPath + "/AndroidManifest.xml") + configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, testPath + "/layout") + configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, testPath + "/AndroidManifest.xml") return JetCoreEnvironment.createForTests(getTestRootDisposable()!!, configuration) } diff --git a/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt new file mode 100644 index 00000000000..3fd4ddf39b9 --- /dev/null +++ b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android + +import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.jet.lang.resolve.android.CliAndroidUIXmlProcessor +import org.jetbrains.jet.config.CompilerConfiguration +import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor +import com.intellij.mock.MockProject +import org.jetbrains.jet.config.CompilerConfigurationKey +import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor +import org.jetbrains.kotlin.compiler.plugin.CliOption +import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException + +public object AndroidConfigurationKeys { + + public val ANDROID_RES_PATH: CompilerConfigurationKey = CompilerConfigurationKey.create("android resources search path") + + public val ANDROID_MANIFEST: CompilerConfigurationKey = CompilerConfigurationKey.create("android manifest file") +} + +public class AndroidCommandLineProcessor : CommandLineProcessor { + class object { + public val ANDROID_COMPILER_PLUGIN_ID: String = "org.jetbrains.kotlin.android" + + public val RESOURCE_PATH_OPTION: CliOption = CliOption("androidRes", "", "Android resources path") + public val MANIFEST_FILE_OPTION: CliOption = CliOption("androidManifest", "", "Android manifest file") + } + + override val pluginId: String = ANDROID_COMPILER_PLUGIN_ID + + override val pluginOptions: Collection = listOf(RESOURCE_PATH_OPTION, MANIFEST_FILE_OPTION) + + override fun processOption(option: CliOption, value: String, configuration: CompilerConfiguration) { + when (option) { + RESOURCE_PATH_OPTION -> configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, value) + MANIFEST_FILE_OPTION -> configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, value) + else -> throw CliOptionProcessingException("Unknown option: ${option.name}") + } + } +} + +public class AndroidComponentRegistrar : ComponentRegistrar { + + public override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { + val androidResPath = configuration.get(AndroidConfigurationKeys.ANDROID_RES_PATH) + val androidManifest = configuration.get(AndroidConfigurationKeys.ANDROID_MANIFEST) + project.registerService(javaClass(), CliAndroidUIXmlProcessor(project, androidResPath, androidManifest)) + } +} \ No newline at end of file diff --git a/plugins/android-compiler-plugin/src/META-INF/MANIFEST.MF b/plugins/android-compiler-plugin/src/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..2352d7dc9a3 --- /dev/null +++ b/plugins/android-compiler-plugin/src/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Implementation-Vendor: JetBrains + +Name: org.jetbrains.kotlin.compiler.plugin +CommandLineProcessor: org.jetbrains.kotlin.android.AndroidCommandLineProcessor +ComponentRegistrar: org.jetbrains.kotlin.android.AndroidComponentRegistrar diff --git a/plugins/android-jps-plugin/android-jps-plugin.iml b/plugins/android-jps-plugin/android-jps-plugin.iml new file mode 100644 index 00000000000..dcebb13eecf --- /dev/null +++ b/plugins/android-jps-plugin/android-jps-plugin.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt b/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt new file mode 100644 index 00000000000..6ebf9ee56cf --- /dev/null +++ b/plugins/android-jps-plugin/src/KotlinAndroidJpsPlugin.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.jps + +import org.jetbrains.jet.jps.build.KotlinJpsCompilerArgumentsProvider +import org.jetbrains.jps.incremental.ModuleBuildTarget +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 + +public class KotlinAndroidJpsPlugin : KotlinJpsCompilerArgumentsProvider { + override fun getExtraArguments(moduleBuildTarget: ModuleBuildTarget, context: CompileContext): List { + val module = moduleBuildTarget.getModule() + return listOf( + makePluginOption(AndroidCommandLineProcessor.RESOURCE_PATH_OPTION, getAndroidResPath(module)), + makePluginOption(AndroidCommandLineProcessor.MANIFEST_FILE_OPTION, getAndroidManifest(module)) + ) + } + + private fun makePluginOption(option: CliOption, value: String): String { + return "plugin:${AndroidCommandLineProcessor.ANDROID_COMPILER_PLUGIN_ID}:${option.name}=$value" + } + + private fun getAndroidResPath(module: JpsModule): String { + val extension = AndroidJpsUtil.getExtension(module) + if (extension == null) return "" + val path = AndroidJpsUtil.getResourceDirForCompilationPath(extension) + return File(path!!.getAbsolutePath() + "/layout").getAbsolutePath() + } + + private fun getAndroidManifest(module: JpsModule): String { + val extension = AndroidJpsUtil.getExtension(module) + if (extension == null) return "" + return AndroidJpsUtil.getManifestFileForCompilationPath(extension)!!.getAbsolutePath() + } +} \ No newline at end of file diff --git a/plugins/android-jps-plugin/src/META-INF/services/org.jetbrains.jet.jps.build.KotlinJpsCompilerArgumentsProvider b/plugins/android-jps-plugin/src/META-INF/services/org.jetbrains.jet.jps.build.KotlinJpsCompilerArgumentsProvider new file mode 100644 index 00000000000..d2483124e7b --- /dev/null +++ b/plugins/android-jps-plugin/src/META-INF/services/org.jetbrains.jet.jps.build.KotlinJpsCompilerArgumentsProvider @@ -0,0 +1 @@ +org.jetbrains.kotlin.android.jps.KotlinAndroidJpsPlugin \ No newline at end of file