From 6b6d7a50302446b1d83c139cce9e45806099e776 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 9 Mar 2017 15:37:28 +0300 Subject: [PATCH] Configuration: Don't create kotlinc.xml if the settings don't differ from the defaults #KT-16647 Fixed --- .../arguments/CommonCompilerArguments.java | 9 + .../arguments/K2JSCompilerArguments.java | 7 + .../arguments/K2JVMCompilerArguments.java | 9 +- .../BaseKotlinCompilerSettings.java | 9 +- .../KotlinCommonCompilerArgumentsHolder.java | 29 ++- .../kotlin/config/facetSerialization.kt | 2 +- .../Kotlin2JsCompilerArgumentsHolder.java | 12 +- .../Kotlin2JvmCompilerArgumentsHolder.java | 14 +- .../.idea/compiler.xml | 22 ++ .../.idea/copyright/profiles_settings.xml | 3 + .../.idea/libraries/KotlinJavaRuntime.xml | 10 + .../.idea/misc.xml | 6 + .../.idea/modules.xml | 8 + .../lib/kotlin-runtime.jar | Bin 0 -> 14358 bytes .../module.iml | 11 + .../src/foo.kt | 0 .../.idea/compiler.xml | 22 ++ .../.idea/copyright/profiles_settings.xml | 3 + .../.idea/libraries/KotlinJavaRuntime.xml | 10 + .../.idea/misc.xml | 6 + .../.idea/modules.xml | 8 + .../lib/kotlin-runtime.jar | Bin 0 -> 17409 bytes .../module.iml | 11 + .../src/foo.kt | 0 .../AbstractConfigureKotlinTest.java | 238 +++++++++++++++++ .../ConfigureKotlinInTempDirTest.kt | 65 +++++ .../configuration/ConfigureKotlinTest.java | 245 ++---------------- 27 files changed, 515 insertions(+), 244 deletions(-) create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/compiler.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/copyright/profiles_settings.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/libraries/KotlinJavaRuntime.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/misc.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/modules.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/lib/kotlin-runtime.jar create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/module.iml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime10/src/foo.kt create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/compiler.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/copyright/profiles_settings.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/libraries/KotlinJavaRuntime.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/misc.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/modules.xml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/lib/kotlin-runtime.jar create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/module.iml create mode 100644 idea/testData/configuration/kotlincExistsNoSettingsRuntime11/src/foo.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.java create mode 100644 idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java index dbb8f970d5c..7acdae33189 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java @@ -99,6 +99,15 @@ public abstract class CommonCompilerArguments implements Serializable { public List unknownExtraFlags = new SmartList(); + @NotNull + public static CommonCompilerArguments createDefaultInstance() { + DummyImpl arguments = new DummyImpl(); + arguments.coroutinesEnable = false; + arguments.coroutinesWarn = true; + arguments.coroutinesError = false; + return arguments; + } + @NotNull public String executableScriptFileName() { return "kotlinc"; 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 cafc7fc278b..7162817cfba 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 @@ -71,6 +71,13 @@ public class K2JSCompilerArguments extends CommonCompilerArguments { @ValueDescription("") public String outputPostfix; + @NotNull + public static K2JSCompilerArguments createDefaultInstance() { + K2JSCompilerArguments arguments = new K2JSCompilerArguments(); + arguments.moduleKind = K2JsArgumentConstants.MODULE_PLAIN; + return arguments; + } + @Override @NotNull public String executableScriptFileName() { 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 4d62eca82b4..f038db1ffa4 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 @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.cli.common.arguments; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.parser.com.sampullara.cli.Argument; +import org.jetbrains.kotlin.config.JvmTarget; public class K2JVMCompilerArguments extends CommonCompilerArguments { public static final long serialVersionUID = 0L; @@ -113,10 +114,16 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments { // Paths to output directories for friend modules. public String[] friendPaths; + @NotNull + public static K2JVMCompilerArguments createDefaultInstance() { + K2JVMCompilerArguments arguments = new K2JVMCompilerArguments(); + arguments.jvmTarget = JvmTarget.DEFAULT.getDescription(); + return arguments; + } + @Override @NotNull public String executableScriptFileName() { return "kotlinc-jvm"; } - } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.java index 7290df6f516..7235ebd3a75 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.java @@ -22,6 +22,9 @@ import com.intellij.util.xmlb.XmlSerializer; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments; +import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.config.SettingConstants; import static com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_DIR; @@ -29,7 +32,11 @@ import static com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_D public abstract class BaseKotlinCompilerSettings implements PersistentStateComponent { public static final String KOTLIN_COMPILER_SETTINGS_PATH = PROJECT_CONFIG_DIR + "/" + SettingConstants.KOTLIN_COMPILER_SETTINGS_FILE; - private static final SkipDefaultValuesSerializationFilters SKIP_DEFAULT_VALUES = new SkipDefaultValuesSerializationFilters(); + private static final SkipDefaultValuesSerializationFilters SKIP_DEFAULT_VALUES = new SkipDefaultValuesSerializationFilters( + CommonCompilerArguments.createDefaultInstance(), + K2JVMCompilerArguments.createDefaultInstance(), + K2JSCompilerArguments.createDefaultInstance() + ); @NotNull private T settings; diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.java index 1591b923d3e..02fdbbf573f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.java @@ -19,9 +19,13 @@ package org.jetbrains.kotlin.idea.compiler.configuration; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; import com.intellij.util.text.VersionComparatorUtil; +import org.jdom.Attribute; import org.jdom.Element; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments; +import org.jetbrains.kotlin.config.FacetSerializationKt; +import org.jetbrains.kotlin.config.LanguageVersion; import static org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMMON_COMPILER_ARGUMENTS_SECTION; @@ -33,10 +37,33 @@ import static org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMMON_COMPILE } ) public class KotlinCommonCompilerArgumentsHolder extends BaseKotlinCompilerSettings { + private static String DEFAULT_LANGUAGE_VERSION = LanguageVersion.LATEST.getVersionString(); + public static KotlinCommonCompilerArgumentsHolder getInstance(Project project) { return ServiceManager.getService(project, KotlinCommonCompilerArgumentsHolder.class); } + private static void dropElementIfDefault(@Nullable Element element) { + if (element == null) return; + + Attribute versionAttribute = element.getAttribute("value"); + String version = versionAttribute != null ? versionAttribute.getValue() : null; + if (DEFAULT_LANGUAGE_VERSION.equals(version)) { + element.detach(); + } + } + + @Override + public Element getState() { + Element element = super.getState(); + if (element != null) { + // Do not serialize language/api version if they correspond to the default language version + dropElementIfDefault(FacetSerializationKt.getOption(element, "languageVersion")); + dropElementIfDefault(FacetSerializationKt.getOption(element, "apiVersion")); + } + return element; + } + @Override public void loadState(Element state) { super.loadState(state); @@ -51,6 +78,6 @@ public class KotlinCommonCompilerArgumentsHolder extends BaseKotlinCompilerSetti @NotNull @Override protected CommonCompilerArguments createSettings() { - return new CommonCompilerArguments.DummyImpl(); + return CommonCompilerArguments.createDefaultInstance(); } } diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index c696d3bd62c..348190d62cb 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -23,7 +23,7 @@ import org.jdom.Element import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments -private fun Element.getOption(name: String) = getChildren("option").firstOrNull { it.getAttribute("name").value == name } +fun Element.getOption(name: String) = getChildren("option").firstOrNull { it.getAttribute("name").value == name } private fun Element.getOptionValue(name: String) = getOption(name)?.getAttribute("value")?.value diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.java index bedcefcdcbf..3d6d88fe760 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.java @@ -33,13 +33,13 @@ import static org.jetbrains.kotlin.config.SettingConstants.KOTLIN_TO_JS_COMPILER ) public class Kotlin2JsCompilerArgumentsHolder extends BaseKotlinCompilerSettings { - @NotNull - @Override - protected K2JSCompilerArguments createSettings() { - return new K2JSCompilerArguments(); - } - public static Kotlin2JsCompilerArgumentsHolder getInstance(Project project) { return ServiceManager.getService(project, Kotlin2JsCompilerArgumentsHolder.class); } + + @NotNull + @Override + protected K2JSCompilerArguments createSettings() { + return K2JSCompilerArguments.createDefaultInstance(); + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.java index 9c2b35a7fdf..b74f54fa99e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.java @@ -21,8 +21,8 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; -import static org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH; import static org.jetbrains.kotlin.config.SettingConstants.KOTLIN_TO_JVM_COMPILER_ARGUMENTS_SECTION; +import static org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH; @State( name = KOTLIN_TO_JVM_COMPILER_ARGUMENTS_SECTION, @@ -33,13 +33,13 @@ import static org.jetbrains.kotlin.config.SettingConstants.KOTLIN_TO_JVM_COMPILE ) public class Kotlin2JvmCompilerArgumentsHolder extends BaseKotlinCompilerSettings { - @NotNull - @Override - protected K2JVMCompilerArguments createSettings() { - return new K2JVMCompilerArguments(); - } - public static Kotlin2JvmCompilerArgumentsHolder getInstance(Project project) { return ServiceManager.getService(project, Kotlin2JvmCompilerArgumentsHolder.class); } + + @NotNull + @Override + protected K2JVMCompilerArguments createSettings() { + return K2JVMCompilerArguments.createDefaultInstance(); + } } diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/compiler.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/compiler.xml new file mode 100644 index 00000000000..1c358218b27 --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/copyright/profiles_settings.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000000..e7bedf3377d --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/libraries/KotlinJavaRuntime.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 00000000000..bcc4ed94e22 --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/misc.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/misc.xml new file mode 100644 index 00000000000..5a967a62c8a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/modules.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/modules.xml new file mode 100644 index 00000000000..83db3b6328a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/lib/kotlin-runtime.jar b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/lib/kotlin-runtime.jar new file mode 100644 index 0000000000000000000000000000000000000000..c62396395dda2929f7d1aae743a0941c12e22056 GIT binary patch literal 14358 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 W4D4l)0Z1=@JTI4R-%APr@c#e@d4|aV literal 0 HcmV?d00001 diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/module.iml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/module.iml new file mode 100644 index 00000000000..94371e52a2a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/module.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/src/foo.kt b/idea/testData/configuration/kotlincExistsNoSettingsRuntime10/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/compiler.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/compiler.xml new file mode 100644 index 00000000000..1c358218b27 --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/copyright/profiles_settings.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000000..e7bedf3377d --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/libraries/KotlinJavaRuntime.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 00000000000..bcc4ed94e22 --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/misc.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/misc.xml new file mode 100644 index 00000000000..5a967a62c8a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/modules.xml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/modules.xml new file mode 100644 index 00000000000..83db3b6328a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/lib/kotlin-runtime.jar b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/lib/kotlin-runtime.jar new file mode 100644 index 0000000000000000000000000000000000000000..24854eff673c5045fd5ef98998c574cc10a4210d GIT binary patch literal 17409 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 literal 0 HcmV?d00001 diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/module.iml b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/module.iml new file mode 100644 index 00000000000..94371e52a2a --- /dev/null +++ b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/module.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/src/foo.kt b/idea/testData/configuration/kotlincExistsNoSettingsRuntime11/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.java new file mode 100644 index 00000000000..e74cb42bc19 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.java @@ -0,0 +1,238 @@ +/* + * Copyright 2010-2015 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.idea.configuration; + +import com.intellij.openapi.application.PathMacros; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.testFramework.PlatformTestCase; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.utils.PathUtil; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import static org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigurator.FileState; +import static org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigurator.LibraryState; + +public abstract class AbstractConfigureKotlinTest extends PlatformTestCase { + private static final String BASE_PATH = "idea/testData/configuration/"; + private static final String TEMP_DIR_MACRO_KEY = "TEMP_TEST_DIR"; + protected static final KotlinJavaModuleConfigurator JAVA_CONFIGURATOR = new KotlinJavaModuleConfigurator() { + @Override + protected String getDefaultPathToJarFile(@NotNull Project project) { + return getPathRelativeToTemp("default_jvm_lib"); + } + }; + protected static final KotlinJsModuleConfigurator JS_CONFIGURATOR = new KotlinJsModuleConfigurator() { + @Override + protected String getDefaultPathToJarFile(@NotNull Project project) { + return getPathRelativeToTemp("default_js_lib"); + } + }; + + private static void configure( + @NotNull List modules, + @NotNull FileState runtimeState, + @NotNull LibraryState libraryState, + @NotNull KotlinWithLibraryConfigurator configurator, + @NotNull String jarFromDist, + @NotNull String jarFromTemp + ) { + Project project = modules.iterator().next().getProject(); + NotificationMessageCollector collector = NotificationMessageCollectorKt.createConfigureKotlinNotificationCollector(project); + for (Module module : modules) { + String pathToJar = getPathToJar(runtimeState, jarFromDist, jarFromTemp); + configurator.configureModuleWithLibraryClasses(module, libraryState, runtimeState, pathToJar, collector); + } + collector.showNotification(); + } + + @NotNull + private static String getPathToJar(@NotNull FileState runtimeState, @NotNull String jarFromDist, @NotNull String jarFromTemp) { + switch (runtimeState) { + case EXISTS: + return jarFromDist; + case COPY: + return jarFromTemp; + case DO_NOT_COPY: + return jarFromDist; + } + return jarFromDist; + } + + protected static void configure(@NotNull Module module, @NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinProjectConfigurator configurator) { + if (configurator instanceof KotlinJavaModuleConfigurator) { + configure(Collections.singletonList(module), jarState, libraryState, + (KotlinWithLibraryConfigurator) configurator, + getPathToExistentRuntimeJar(), getPathToNonexistentRuntimeJar()); + } + if (configurator instanceof KotlinJsModuleConfigurator) { + configure(Collections.singletonList(module), jarState, libraryState, + (KotlinWithLibraryConfigurator) configurator, + getPathToExistentJsJar(), getPathToNonexistentJsJar()); + } + } + + private static String getPathToNonexistentRuntimeJar() { + String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.KOTLIN_JAVA_RUNTIME_JAR; + myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar)); + return pathToTempKotlinRuntimeJar; + } + + private static String getPathToNonexistentJsJar() { + String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.JS_LIB_JAR_NAME; + myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar)); + return pathToTempKotlinRuntimeJar; + } + + private static String getPathToExistentRuntimeJar() { + return PathUtil.getKotlinPathsForDistDirectory().getRuntimePath().getParent(); + } + + private static String getPathToExistentJsJar() { + return PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getParent(); + } + + protected static void assertNotConfigured(Module module, KotlinWithLibraryConfigurator configurator) { + assertFalse( + String.format("Module %s should not be configured as %s Module", module.getName(), configurator.getPresentableText()), + configurator.isConfigured(module)); + } + + protected static void assertConfigured(Module module, KotlinWithLibraryConfigurator configurator) { + assertTrue(String.format("Module %s should be configured with configurator '%s'", module.getName(), + configurator.getPresentableText()), + configurator.isConfigured(module)); + } + + protected static void assertProperlyConfigured(Module module, KotlinWithLibraryConfigurator configurator) { + assertConfigured(module, configurator); + assertNotConfigured(module, getOppositeConfigurator(configurator)); + } + + private static KotlinWithLibraryConfigurator getOppositeConfigurator(KotlinWithLibraryConfigurator configurator) { + if (configurator == JAVA_CONFIGURATOR) return JS_CONFIGURATOR; + if (configurator == JS_CONFIGURATOR) return JAVA_CONFIGURATOR; + + throw new IllegalArgumentException("Only JS_CONFIGURATOR and JAVA_CONFIGURATOR are supported"); + } + + private static String getPathRelativeToTemp(String relativePath) { + String tempPath = PathMacros.getInstance().getValue(TEMP_DIR_MACRO_KEY); + return tempPath + '/' + relativePath; + } + + @Override + protected void tearDown() throws Exception { + PathMacros.getInstance().removeMacro(TEMP_DIR_MACRO_KEY); + + super.tearDown(); + } + + @Override + protected void initApplication() throws Exception { + super.initApplication(); + + File tempLibDir = FileUtil.createTempDirectory("temp", null); + PathMacros.getInstance().setMacro(TEMP_DIR_MACRO_KEY, FileUtilRt.toSystemDependentName(tempLibDir.getAbsolutePath())); + } + + protected void doTestConfigureModulesWithNonDefaultSetup(KotlinWithLibraryConfigurator configurator) { + assertNoFilesInDefaultPaths(); + + Module[] modules = getModules(); + for (Module module : modules) { + assertNotConfigured(module, configurator); + } + + configurator.configure(myProject, Collections.emptyList()); + + assertNoFilesInDefaultPaths(); + + for (Module module : modules) { + assertProperlyConfigured(module, configurator); + } + } + + protected void doTestOneJavaModule(@NotNull FileState jarState, @NotNull LibraryState libraryState) { + doTestOneModule(jarState, libraryState, JAVA_CONFIGURATOR); + } + + protected void doTestOneJsModule(@NotNull FileState jarState, @NotNull LibraryState libraryState) { + doTestOneModule(jarState, libraryState, JS_CONFIGURATOR); + } + + private void doTestOneModule(@NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinWithLibraryConfigurator configurator) { + Module module = getModule(); + assertEquals("Library state loaded from project files should be " + libraryState, libraryState, configurator.getLibraryState(module.getProject())); + + assertNotConfigured(module, configurator); + configure(module, jarState, libraryState, configurator); + assertProperlyConfigured(module, configurator); + } + + @Override + public Module getModule() { + Module[] modules = ModuleManager.getInstance(myProject).getModules(); + assert modules.length == 1 : "One module should be loaded " + modules.length; + myModule = modules[0]; + return super.getModule(); + } + + public Module[] getModules() { + return ModuleManager.getInstance(myProject).getModules(); + } + + @Override + protected File getIprFile() throws IOException { + String projectFilePath = getProjectRoot() + "/projectFile.ipr"; + assertTrue("Project file should exists " + projectFilePath, new File(projectFilePath).exists()); + return new File(projectFilePath); + } + + @Override + protected Project doCreateProject(@NotNull File projectFile) throws Exception { + return myProjectManager.loadProject(projectFile.getPath()); + } + + private String getProjectName() { + String testName = getTestName(true); + if (testName.contains("_")) { + return testName.substring(0, testName.indexOf("_")); + } + return testName; + } + + protected String getProjectRoot() { + return BASE_PATH + getProjectName(); + } + + @Override + protected void setUpModule() { + } + + private void assertNoFilesInDefaultPaths() { + assertDoesntExist(new File(JAVA_CONFIGURATOR.getDefaultPathToJarFile(getProject()))); + assertDoesntExist(new File(JS_CONFIGURATOR.getDefaultPathToJarFile(getProject()))); + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt new file mode 100644 index 00000000000..3204ac5813c --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInTempDirTest.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2017 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.idea.configuration + +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.impl.ApplicationImpl +import com.intellij.openapi.util.io.FileUtil +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings +import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.junit.Assert +import java.io.File +import java.io.IOException + +class ConfigureKotlinInTempDirTest : AbstractConfigureKotlinTest() { + @Throws(IOException::class) + override fun getIprFile(): File { + val tempDir = FileUtil.generateRandomTemporaryPath() + FileUtil.createTempDirectory("temp", null) + + FileUtil.copyDir(File(projectRoot), tempDir) + + val projectRoot = tempDir.path + + val projectFilePath = projectRoot + "/projectFile.ipr" + if (!File(projectFilePath).exists()) { + val dotIdeaPath = projectRoot + "/.idea" + Assert.assertTrue("Project file or '.idea' dir should exists in " + projectRoot, File(dotIdeaPath).exists()) + return File(projectRoot) + } + return File(projectFilePath) + } + + @Throws(IOException::class) + fun testKotlincExistsNoSettingsRuntime10() { + val application = ApplicationManager.getApplication() as ApplicationImpl + application.doNotSave(false) + Assert.assertEquals(LanguageVersion.KOTLIN_1_0, myProject.getLanguageVersionSettings(null).languageVersion) + Assert.assertEquals(LanguageVersion.KOTLIN_1_0, module.languageVersionSettings.languageVersion) + application.saveAll() + Assert.assertTrue(project.baseDir.findFileByRelativePath(".idea/kotlinc.xml") != null) + } + + fun testKotlincExistsNoSettingsRuntime11() { + val application = ApplicationManager.getApplication() as ApplicationImpl + application.doNotSave(false) + Assert.assertEquals(LanguageVersion.KOTLIN_1_1, myProject.getLanguageVersionSettings(null).languageVersion) + Assert.assertEquals(LanguageVersion.KOTLIN_1_1, module.languageVersionSettings.languageVersion) + Assert.assertTrue(project.baseDir.findFileByRelativePath(".idea/kotlinc.xml") == null) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 7223744409f..b6f237fd8d4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 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. @@ -16,162 +16,29 @@ package org.jetbrains.kotlin.idea.configuration; -import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; -import com.intellij.testFramework.PlatformTestCase; -import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.idea.project.PlatformKt; -import org.jetbrains.kotlin.utils.PathUtil; import java.io.File; import java.io.IOException; import java.util.Collections; -import java.util.List; - -import static org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigurator.FileState; -import static org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigurator.LibraryState; - -public class ConfigureKotlinTest extends PlatformTestCase { - private static final String BASE_PATH = "idea/testData/configuration/"; - private static final String TEMP_DIR_MACRO_KEY = "TEMP_TEST_DIR"; - private static final KotlinJavaModuleConfigurator JAVA_CONFIGURATOR = new KotlinJavaModuleConfigurator() { - @Override - protected String getDefaultPathToJarFile(@NotNull Project project) { - return getPathRelativeToTemp("default_jvm_lib"); - } - }; - private static final KotlinJsModuleConfigurator JS_CONFIGURATOR = new KotlinJsModuleConfigurator() { - @Override - protected String getDefaultPathToJarFile(@NotNull Project project) { - return getPathRelativeToTemp("default_js_lib"); - } - }; - - private static void configure( - @NotNull List modules, - @NotNull FileState runtimeState, - @NotNull LibraryState libraryState, - @NotNull KotlinWithLibraryConfigurator configurator, - @NotNull String jarFromDist, - @NotNull String jarFromTemp - ) { - Project project = modules.iterator().next().getProject(); - NotificationMessageCollector collector = NotificationMessageCollectorKt.createConfigureKotlinNotificationCollector(project); - for (Module module : modules) { - String pathToJar = getPathToJar(runtimeState, jarFromDist, jarFromTemp); - configurator.configureModuleWithLibraryClasses(module, libraryState, runtimeState, pathToJar, collector); - } - collector.showNotification(); - } - - @NotNull - private static String getPathToJar(@NotNull FileState runtimeState, @NotNull String jarFromDist, @NotNull String jarFromTemp) { - switch (runtimeState) { - case EXISTS: - return jarFromDist; - case COPY: - return jarFromTemp; - case DO_NOT_COPY: - return jarFromDist; - } - return jarFromDist; - } - - private static void configure(@NotNull Module module, @NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinProjectConfigurator configurator) { - if (configurator instanceof KotlinJavaModuleConfigurator) { - configure(Collections.singletonList(module), jarState, libraryState, - (KotlinWithLibraryConfigurator) configurator, - getPathToExistentRuntimeJar(), getPathToNonexistentRuntimeJar()); - } - if (configurator instanceof KotlinJsModuleConfigurator) { - configure(Collections.singletonList(module), jarState, libraryState, - (KotlinWithLibraryConfigurator) configurator, - getPathToExistentJsJar(), getPathToNonexistentJsJar()); - } - } - - private static String getPathToNonexistentRuntimeJar() { - String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.KOTLIN_JAVA_RUNTIME_JAR; - myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar)); - return pathToTempKotlinRuntimeJar; - } - - private static String getPathToNonexistentJsJar() { - String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.JS_LIB_JAR_NAME; - myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar)); - return pathToTempKotlinRuntimeJar; - } - - private static String getPathToExistentRuntimeJar() { - return PathUtil.getKotlinPathsForDistDirectory().getRuntimePath().getParent(); - } - - private static String getPathToExistentJsJar() { - return PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getParent(); - } - - private static void assertNotConfigured(Module module, KotlinWithLibraryConfigurator configurator) { - assertFalse( - String.format("Module %s should not be configured as %s Module", module.getName(), configurator.getPresentableText()), - configurator.isConfigured(module)); - } - - private static void assertConfigured(Module module, KotlinWithLibraryConfigurator configurator) { - assertTrue(String.format("Module %s should be configured with configurator '%s'", module.getName(), - configurator.getPresentableText()), - configurator.isConfigured(module)); - } - - private static void assertProperlyConfigured(Module module, KotlinWithLibraryConfigurator configurator) { - assertConfigured(module, configurator); - assertNotConfigured(module, getOppositeConfigurator(configurator)); - } - - private static KotlinWithLibraryConfigurator getOppositeConfigurator(KotlinWithLibraryConfigurator configurator) { - if (configurator == JAVA_CONFIGURATOR) return JS_CONFIGURATOR; - if (configurator == JS_CONFIGURATOR) return JAVA_CONFIGURATOR; - - throw new IllegalArgumentException("Only JS_CONFIGURATOR and JAVA_CONFIGURATOR are supported"); - } - - private static String getPathRelativeToTemp(String relativePath) { - String tempPath = PathMacros.getInstance().getValue(TEMP_DIR_MACRO_KEY); - return tempPath + '/' + relativePath; - } - - @Override - protected void tearDown() throws Exception { - PathMacros.getInstance().removeMacro(TEMP_DIR_MACRO_KEY); - - super.tearDown(); - } - - @Override - protected void initApplication() throws Exception { - super.initApplication(); - - File tempLibDir = FileUtil.createTempDirectory("temp", null); - PathMacros.getInstance().setMacro(TEMP_DIR_MACRO_KEY, FileUtilRt.toSystemDependentName(tempLibDir.getAbsolutePath())); - } +public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { public void testNewLibrary_copyJar() { - doTestOneJavaModule(FileState.COPY, LibraryState.NEW_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testNewLibrary_doNotCopyJar() { - doTestOneJavaModule(FileState.DO_NOT_COPY, LibraryState.NEW_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testLibrary_doNotCopyJar() { try { - doTestOneJavaModule(FileState.DO_NOT_COPY, LibraryState.LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.LIBRARY); } catch (IllegalStateException e) { return; @@ -180,19 +47,19 @@ public class ConfigureKotlinTest extends PlatformTestCase { } public void testLibraryWithoutPaths_jarExists() { - doTestOneJavaModule(FileState.EXISTS, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.EXISTS, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } public void testNewLibrary_jarExists() { - doTestOneJavaModule(FileState.EXISTS, LibraryState.NEW_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.EXISTS, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testLibraryWithoutPaths_copyJar() { - doTestOneJavaModule(FileState.COPY, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.COPY, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } public void testLibraryWithoutPaths_doNotCopyJar() { - doTestOneJavaModule(FileState.DO_NOT_COPY, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJavaModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } @SuppressWarnings("ConstantConditions") @@ -200,12 +67,12 @@ public class ConfigureKotlinTest extends PlatformTestCase { Module[] modules = getModules(); for (Module module : modules) { if (module.getName().equals("module1")) { - configure(module, KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, LibraryState.NEW_LIBRARY, JAVA_CONFIGURATOR); + configure(module, KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY, JAVA_CONFIGURATOR); assertConfigured(module, JAVA_CONFIGURATOR); } else if (module.getName().equals("module2")) { assertNotConfigured(module, JAVA_CONFIGURATOR); - configure(module, FileState.EXISTS, LibraryState.LIBRARY, JAVA_CONFIGURATOR); + configure(module, KotlinWithLibraryConfigurator.FileState.EXISTS, KotlinWithLibraryConfigurator.LibraryState.LIBRARY, JAVA_CONFIGURATOR); assertConfigured(module, JAVA_CONFIGURATOR); } } @@ -233,20 +100,20 @@ public class ConfigureKotlinTest extends PlatformTestCase { } public void testNewLibrary_jarExists_js() { - doTestOneJsModule(FileState.EXISTS, LibraryState.NEW_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.EXISTS, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testNewLibrary_copyJar_js() { - doTestOneJsModule(FileState.COPY, LibraryState.NEW_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.COPY, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testNewLibrary_doNotCopyJar_js() { - doTestOneJsModule(FileState.DO_NOT_COPY, LibraryState.NEW_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.NEW_LIBRARY); } public void testJsLibrary_doNotCopyJar() { try { - doTestOneJsModule(FileState.DO_NOT_COPY, LibraryState.LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.LIBRARY); } catch (IllegalStateException e) { return; @@ -255,15 +122,15 @@ public class ConfigureKotlinTest extends PlatformTestCase { } public void testJsLibraryWithoutPaths_jarExists() { - doTestOneJsModule(FileState.EXISTS, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.EXISTS, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } public void testJsLibraryWithoutPaths_copyJar() { - doTestOneJsModule(FileState.COPY, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.COPY, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } public void testJsLibraryWithoutPaths_doNotCopyJar() { - doTestOneJsModule(FileState.DO_NOT_COPY, LibraryState.NON_CONFIGURED_LIBRARY); + doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.DO_NOT_COPY, KotlinWithLibraryConfigurator.LibraryState.NON_CONFIGURED_LIBRARY); } public void testProjectWithoutFacetWithRuntime106WithoutLanguageLevel() { @@ -345,80 +212,4 @@ public class ConfigureKotlinTest extends PlatformTestCase { assertEquals("amd", arguments.moduleKind); assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments); } - - private void doTestConfigureModulesWithNonDefaultSetup(KotlinWithLibraryConfigurator configurator) { - assertNoFilesInDefaultPaths(); - - Module[] modules = getModules(); - for (Module module : modules) { - assertNotConfigured(module, configurator); - } - - configurator.configure(myProject, Collections.emptyList()); - - assertNoFilesInDefaultPaths(); - - for (Module module : modules) { - assertProperlyConfigured(module, configurator); - } - } - - private void doTestOneJavaModule(@NotNull FileState jarState, @NotNull LibraryState libraryState) { - doTestOneModule(jarState, libraryState, JAVA_CONFIGURATOR); - } - - private void doTestOneJsModule(@NotNull FileState jarState, @NotNull LibraryState libraryState) { - doTestOneModule(jarState, libraryState, JS_CONFIGURATOR); - } - - private void doTestOneModule(@NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinWithLibraryConfigurator configurator) { - Module module = getModule(); - assertEquals("Library state loaded from project files should be " + libraryState, libraryState, configurator.getLibraryState(module.getProject())); - - assertNotConfigured(module, configurator); - configure(module, jarState, libraryState, configurator); - assertProperlyConfigured(module, configurator); - } - - @Override - public Module getModule() { - Module[] modules = ModuleManager.getInstance(myProject).getModules(); - assert modules.length == 1 : "One module should be loaded " + modules.length; - myModule = modules[0]; - return super.getModule(); - } - - public Module[] getModules() { - return ModuleManager.getInstance(myProject).getModules(); - } - - @Override - protected File getIprFile() throws IOException { - String projectName = getProjectName(); - String projectFilePath = BASE_PATH + projectName + "/projectFile.ipr"; - assertTrue("Project file should exists " + projectFilePath, new File(projectFilePath).exists()); - return new File(projectFilePath); - } - - @Override - protected Project doCreateProject(@NotNull File projectFile) throws Exception { - return myProjectManager.loadProject(projectFile.getPath()); - } - - private String getProjectName() { - String testName = getTestName(true); - if (testName.contains("_")) { - return testName.substring(0, testName.indexOf("_")); - } - return testName; - } - - @Override - protected void setUpModule() { - } - - private void assertNoFilesInDefaultPaths() { - assertDoesntExist(new File(JAVA_CONFIGURATOR.getDefaultPathToJarFile(getProject()))); - assertDoesntExist(new File(JS_CONFIGURATOR.getDefaultPathToJarFile(getProject()))); - } }