From b090b79d92ea6d0e8246b40f59efc13eae058405 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 22 Apr 2016 14:06:16 +0300 Subject: [PATCH] KT-3008 Add UI that allows to change module kind in IDEA Kotlin configurator --- .../arguments/K2JSCompilerArguments.java | 5 +++ .../jetbrains/kotlin/cli/js/K2JSCompiler.java | 8 ++--- .../KotlinCompilerConfigurableTab.form | 21 +++++++++-- .../KotlinCompilerConfigurableTab.java | 36 ++++++++++++++++++- .../jetbrains/kotlin/js/test/BasicTest.java | 2 +- .../js/test/MultipleModulesTranslationTest.kt | 13 +++---- 6 files changed, 71 insertions(+), 14 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.java index 97abbb235e0..88ae69c29ae 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.java @@ -24,6 +24,11 @@ import static org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants.CA import static org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants.NO_CALL; public class K2JSCompilerArguments extends CommonCompilerArguments { + public static final String MODULE_PLAIN = "plain"; + public static final String MODULE_AMD = "amd"; + public static final String MODULE_COMMONJS = "commonjs"; + public static final String MODULE_UMD = "umd"; + @Argument(value = "output", description = "Output file path") @ValueDescription("") public String outputFile; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java index 262b6ef8f08..f90da8811f4 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java @@ -278,16 +278,16 @@ public class K2JSCompiler extends CLICompiler { ModuleKind moduleKind = ModuleKind.PLAIN; if (moduleKindName != null) { moduleKindName = moduleKindName.toLowerCase(); - if (moduleKindName.equals("plain")) { + if (moduleKindName.equals(K2JSCompilerArguments.MODULE_PLAIN)) { moduleKind = ModuleKind.PLAIN; } - else if (moduleKindName.equals("amd")) { + else if (moduleKindName.equals(K2JSCompilerArguments.MODULE_AMD)) { moduleKind = ModuleKind.AMD; } - else if (moduleKindName.equals("commonjs")) { + else if (moduleKindName.equals(K2JSCompilerArguments.MODULE_COMMONJS)) { moduleKind = ModuleKind.COMMON_JS; } - else if (moduleKindName.equals("umd")) { + else if (moduleKindName.equals(K2JSCompilerArguments.MODULE_UMD)) { moduleKind = ModuleKind.UMD; } else { diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form index 5be22476e56..d64d003e1c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form @@ -3,7 +3,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -160,6 +160,23 @@ + + + + + + + + + + + + + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java index 0d8f9117b38..e60cdb5a12c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -40,8 +40,18 @@ import org.jetbrains.kotlin.idea.PluginStartupComponent; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import java.util.List; + +import static java.util.Arrays.asList; public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Configurable.NoScroll{ + private static final List moduleKindDescriptions = asList( + "Plain (put to global scope)", + "AMD", + "CommonJS/node.js", + "UMD (detect AMD or CommonJS if available, fallback to plain)" + ); + private static final List moduleKindIds = asList("plain", "amd", "commonjs", "umd"); private final CommonCompilerArguments commonCompilerArguments; private final K2JSCompilerArguments k2jsCompilerArguments; private final CompilerSettings compilerSettings; @@ -61,6 +71,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private JCheckBox copyRuntimeFilesCheckBox; private JCheckBox keepAliveCheckBox; private JCheckBox enablePreciseIncrementalCheckBox; + private JComboBox moduleKindComboBox; public KotlinCompilerConfigurableTab(Project project) { this.commonCompilerArguments = KotlinCommonCompilerArgumentsHolder.getInstance(project).getSettings(); @@ -84,6 +95,16 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co labelForOutputDirectory.setEnabled(copyRuntimeFilesCheckBox.isSelected()); } }); + + fillModuleKindList(); + } + + @SuppressWarnings("unchecked") + private void fillModuleKindList() { + for (String description : moduleKindDescriptions) { + // TODO: not sure if it's a right way to add items to a combo box + moduleKindComboBox.addItem(description); + } } @NotNull @@ -116,7 +137,12 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co ComparingUtils.isModified(generateSourceMapsCheckBox, k2jsCompilerArguments.sourceMap) || isModified(outputPrefixFile, k2jsCompilerArguments.outputPrefix) || - isModified(outputPostfixFile, k2jsCompilerArguments.outputPostfix); + isModified(outputPostfixFile, k2jsCompilerArguments.outputPostfix) || + !getSelectedModuleKind().equals(k2jsCompilerArguments.moduleKind); + } + + private String getSelectedModuleKind() { + return moduleKindIds.get(moduleKindComboBox.getSelectedIndex()); } @Override @@ -137,6 +163,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co k2jsCompilerArguments.sourceMap = generateSourceMapsCheckBox.isSelected(); k2jsCompilerArguments.outputPrefix = StringUtil.nullize(outputPrefixFile.getText(), true); k2jsCompilerArguments.outputPostfix = StringUtil.nullize(outputPostfixFile.getText(), true); + k2jsCompilerArguments.moduleKind = getSelectedModuleKind(); BuildManager.getInstance().clearState(project); } @@ -154,6 +181,13 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co generateSourceMapsCheckBox.setSelected(k2jsCompilerArguments.sourceMap); outputPrefixFile.setText(k2jsCompilerArguments.outputPrefix); outputPostfixFile.setText(k2jsCompilerArguments.outputPostfix); + + String moduleKind = k2jsCompilerArguments.moduleKind; + int index = moduleKind != null ? moduleKindIds.indexOf(moduleKind) : 0; + if (index < 0) { + index = 0; + } + moduleKindComboBox.setSelectedIndex(index); } @Override diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicTest.java index a07a65e7204..d2ff8a0f078 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicTest.java @@ -347,7 +347,7 @@ public abstract class BasicTest extends KotlinTestWithEnvironment { configuration.put(JSConfigurationKeys.UNIT_TEST_CONFIG, shouldBeTranslateAsUnitTestClass()); - setupConfig(configBuilder); + setupConfig(configuration); return new LibrarySourcesConfig(project, configuration); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/MultipleModulesTranslationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/MultipleModulesTranslationTest.kt index d44fd6f17c7..02488dfbbab 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/MultipleModulesTranslationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/MultipleModulesTranslationTest.kt @@ -18,9 +18,10 @@ package org.jetbrains.kotlin.js.test import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil -import org.jetbrains.kotlin.js.config.Config +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.js.config.EcmaVersion -import org.jetbrains.kotlin.js.config.LibrarySourcesConfig +import org.jetbrains.kotlin.js.config.JSConfigurationKeys +import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.facade.MainCallParameters import org.jetbrains.kotlin.js.test.rhino.RhinoFunctionResultChecker import org.jetbrains.kotlin.js.test.utils.JsTestUtils.getAllFilesInDir @@ -28,7 +29,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import java.io.File -import java.util.LinkedHashMap +import java.util.* abstract class MultipleModulesTranslationTest(main: String) : BasicTest(main) { private val MAIN_MODULE_NAME: String = "main" @@ -70,7 +71,7 @@ abstract class MultipleModulesTranslationTest(main: String) : BasicTest(main) { private fun getMetaFileOutputPath(moduleDirectoryName: String, version: EcmaVersion) = KotlinJavascriptMetadataUtils.replaceSuffix(getOutputFilePath(moduleDirectoryName, version)) - override fun setupConfig(builder: LibrarySourcesConfig.Builder) { + override fun setupConfig(configuration: CompilerConfiguration) { val method = try { javaClass.getMethod(name) } @@ -79,7 +80,7 @@ abstract class MultipleModulesTranslationTest(main: String) : BasicTest(main) { } method.getAnnotation(WithModuleKind::class.java)?.let { moduleKind = it.value } - builder.moduleKind(moduleKind) + configuration.put(JSConfigurationKeys.MODULE_KIND, moduleKind) } override fun shouldGenerateMetaInfo() = true @@ -100,7 +101,7 @@ abstract class MultipleModulesTranslationTest(main: String) : BasicTest(main) { } override fun translateFiles(jetFiles: MutableList, outputFile: File, mainCallParameters: MainCallParameters, - config: Config) { + config: JsConfig) { super.translateFiles(jetFiles, outputFile, mainCallParameters, config) if (config.moduleKind == ModuleKind.COMMON_JS) {