diff --git a/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java index 8a468eee221..939925fe0b1 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java @@ -603,7 +603,7 @@ public final class DebugJsProtoBuf { /** * repeated string importedModules = 3; */ - com.google.protobuf.ByteString + org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index); } /** @@ -678,7 +678,7 @@ public final class DebugJsProtoBuf { } case 26: { if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.LazyStringArrayList(); + importedModules_ = new org.jetbrains.kotlin.protobuf.LazyStringArrayList(); mutable_bitField0_ |= 0x00000004; } importedModules_.add(input.readBytes()); @@ -696,7 +696,7 @@ public final class DebugJsProtoBuf { entry_ = java.util.Collections.unmodifiableList(entry_); } if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.UnmodifiableLazyStringList(importedModules_); + importedModules_ = new org.jetbrains.kotlin.protobuf.UnmodifiableLazyStringList(importedModules_); } this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); @@ -733,7 +733,7 @@ public final class DebugJsProtoBuf { * Protobuf enum {@code org.jetbrains.kotlin.serialization.js.Library.Kind} */ public enum Kind - implements com.google.protobuf.ProtocolMessageEnum { + implements org.jetbrains.kotlin.protobuf.ProtocolMessageEnum { /** * PLAIN = 1; */ @@ -773,27 +773,27 @@ public final class DebugJsProtoBuf { } } - public static com.google.protobuf.Internal.EnumLiteMap + public static org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap internalGetValueMap() { return internalValueMap; } - private static com.google.protobuf.Internal.EnumLiteMap + private static org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap internalValueMap = - new com.google.protobuf.Internal.EnumLiteMap() { + new org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap() { public Kind findValueByNumber(int number) { return Kind.valueOf(number); } }; - public final com.google.protobuf.Descriptors.EnumValueDescriptor + public final org.jetbrains.kotlin.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() { return getDescriptor().getValues().get(index); } - public final com.google.protobuf.Descriptors.EnumDescriptor + public final org.jetbrains.kotlin.protobuf.Descriptors.EnumDescriptor getDescriptorForType() { return getDescriptor(); } - public static final com.google.protobuf.Descriptors.EnumDescriptor + public static final org.jetbrains.kotlin.protobuf.Descriptors.EnumDescriptor getDescriptor() { return org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Library.getDescriptor().getEnumTypes().get(0); } @@ -801,7 +801,7 @@ public final class DebugJsProtoBuf { private static final Kind[] VALUES = values(); public static Kind valueOf( - com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + org.jetbrains.kotlin.protobuf.Descriptors.EnumValueDescriptor desc) { if (desc.getType() != getDescriptor()) { throw new java.lang.IllegalArgumentException( "EnumValueDescriptor is not for this type."); @@ -1446,7 +1446,7 @@ public final class DebugJsProtoBuf { // repeated string importedModules = 3; public static final int IMPORTEDMODULES_FIELD_NUMBER = 3; - private com.google.protobuf.LazyStringList importedModules_; + private org.jetbrains.kotlin.protobuf.LazyStringList importedModules_; /** * repeated string importedModules = 3; */ @@ -1469,7 +1469,7 @@ public final class DebugJsProtoBuf { /** * repeated string importedModules = 3; */ - public com.google.protobuf.ByteString + public org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index) { return importedModules_.getByteString(index); } @@ -1477,7 +1477,7 @@ public final class DebugJsProtoBuf { private void initFields() { entry_ = java.util.Collections.emptyList(); kind_ = org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Library.Kind.PLAIN; - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -1520,13 +1520,13 @@ public final class DebugJsProtoBuf { .computeMessageSize(1, entry_.get(i)); } if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream + size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeEnumSize(2, kind_.getNumber()); } { int dataSize = 0; for (int i = 0; i < importedModules_.size(); i++) { - dataSize += com.google.protobuf.CodedOutputStream + dataSize += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeBytesSizeNoTag(importedModules_.getByteString(i)); } size += dataSize; @@ -1657,7 +1657,7 @@ public final class DebugJsProtoBuf { } kind_ = org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.Library.Kind.PLAIN; bitField0_ = (bitField0_ & ~0x00000002); - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -1701,7 +1701,7 @@ public final class DebugJsProtoBuf { } result.kind_ = kind_; if (((bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.UnmodifiableLazyStringList( + importedModules_ = new org.jetbrains.kotlin.protobuf.UnmodifiableLazyStringList( importedModules_); bitField0_ = (bitField0_ & ~0x00000004); } @@ -2071,10 +2071,10 @@ public final class DebugJsProtoBuf { } // repeated string importedModules = 3; - private com.google.protobuf.LazyStringList importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private org.jetbrains.kotlin.protobuf.LazyStringList importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; private void ensureImportedModulesIsMutable() { if (!((bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.LazyStringArrayList(importedModules_); + importedModules_ = new org.jetbrains.kotlin.protobuf.LazyStringArrayList(importedModules_); bitField0_ |= 0x00000004; } } @@ -2100,7 +2100,7 @@ public final class DebugJsProtoBuf { /** * repeated string importedModules = 3; */ - public com.google.protobuf.ByteString + public org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index) { return importedModules_.getByteString(index); } @@ -2144,7 +2144,7 @@ public final class DebugJsProtoBuf { * repeated string importedModules = 3; */ public Builder clearImportedModules() { - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; bitField0_ = (bitField0_ & ~0x00000004); onChanged(); return this; @@ -2153,7 +2153,7 @@ public final class DebugJsProtoBuf { * repeated string importedModules = 3; */ public Builder addImportedModulesBytes( - com.google.protobuf.ByteString value) { + org.jetbrains.kotlin.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } diff --git a/build.xml b/build.xml index 2b2dfe62128..5bf2a3e231a 100644 --- a/build.xml +++ b/build.xml @@ -367,18 +367,6 @@ - - - - - - - - - - - - @@ -388,6 +376,8 @@ + + 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 843d93dd106..ca0070736ce 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 @@ -48,6 +48,10 @@ public class K2JSCompilerArguments extends CommonCompilerArguments { @ValueDescription("") public String target; + @Argument(value = "module-kind", description = "Kind of a module generated by compiler. Supported values are: plain (by default), " + + "amd, commonjs.") + public String moduleKind; + @Nullable @Argument(value = "main", description = "Whether a main function should be called; default '" + CALL + "' (main function will be auto detected)") @ValueDescription("{" + CALL + "," + NO_CALL + "}") 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 adeb1d73e18..ce8d40462d4 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.java @@ -58,6 +58,7 @@ import org.jetbrains.kotlin.js.facade.TranslationResult; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; +import org.jetbrains.kotlin.serialization.js.ModuleKind; import org.jetbrains.kotlin.utils.PathUtil; import java.io.File; @@ -243,8 +244,11 @@ public class K2JSCompiler extends CLICompiler { @Override protected void setupPlatformSpecificArgumentsAndServices( - @NotNull CompilerConfiguration configuration, @NotNull K2JSCompilerArguments arguments, @NotNull Services services + @NotNull CompilerConfiguration configuration, @NotNull K2JSCompilerArguments arguments, + @NotNull Services services ) { + MessageCollector messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY); + if (arguments.target != null) { assert arguments.target == "v5" : "Unsupported ECMA version: " + arguments.target; } @@ -270,6 +274,27 @@ public class K2JSCompiler extends CLICompiler { } configuration.put(JSConfigurationKeys.LIBRARY_FILES, libraryFiles); + String moduleKindName = arguments.moduleKind; + ModuleKind moduleKind = ModuleKind.PLAIN; + if (moduleKindName != null) { + moduleKindName = moduleKindName.toLowerCase(); + if (moduleKindName.equals("plain")) { + moduleKind = ModuleKind.PLAIN; + } + else if (moduleKindName.equals("amd")) { + moduleKind = ModuleKind.AMD; + } + else if (moduleKindName.equals("commonjs")) { + moduleKind = ModuleKind.COMMON_JS; + } + else { + messageCollector.report(CompilerMessageSeverity.ERROR, "Unknown module kind: " + moduleKindName + ". " + + "valid values are: plain, amd, commonjs", + CompilerMessageLocation.NO_LOCATION); + } + } + + configuration.put(JSConfigurationKeys.MODULE_KIND, moduleKind); } private static MainCallParameters createMainCallParameters(String main) { diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt index 1d43ad3760d..b4af4d044ab 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt @@ -71,14 +71,12 @@ class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() { val config = LibrarySourcesConfig(environment.project, environment.configuration) val analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(files, config) val description = JsModuleDescriptor( - name = MODULE_NAME, + name = KotlinTestUtils.TEST_MODULE_NAME, kind = ModuleKind.PLAIN, imported = listOf(), data = analysisResult.moduleDescriptor - ); - FileUtil.writeToFile(metaFile, KotlinJavascriptSerializationUtil.metadataAsString( - KotlinTestUtils.TEST_MODULE_NAME, analysisResult.moduleDescriptor - )) + ) + FileUtil.writeToFile(metaFile, KotlinJavascriptSerializationUtil.metadataAsString(description)) } finally { Disposer.dispose(rootDisposable) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java index 61aac7a7b54..344de8a6bb4 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.js.config; import org.jetbrains.kotlin.config.CompilerConfigurationKey; +import org.jetbrains.kotlin.serialization.js.ModuleKind; import java.util.List; @@ -36,4 +37,7 @@ public class JSConfigurationKeys { public static final CompilerConfigurationKey UNIT_TEST_CONFIG = CompilerConfigurationKey.create("unit test config"); + + public static final CompilerConfigurationKey MODULE_KIND = + CompilerConfigurationKey.create("module kind"); } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java index 726b37d9638..a1f02e50730 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java @@ -23,6 +23,7 @@ import kotlin.Unit; import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; @@ -51,15 +52,6 @@ public abstract class JsConfig { private final CompilerConfiguration configuration; private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); private final List sourceFilesFromLibraries = new SmartList(); - @NotNull - private final EcmaVersion target; - - @NotNull - private final String moduleId; - - private final boolean sourcemap; - private final boolean metaInfo; - private final boolean kjsm; @NotNull protected final List metadata = new SmartList(); @@ -67,9 +59,6 @@ public abstract class JsConfig { @Nullable private List> moduleDescriptors = null; - @NotNull - private final ModuleKind moduleKind; - private boolean initialized = false; protected JsConfig(@NotNull Project project, @NotNull CompilerConfiguration configuration) { @@ -94,7 +83,7 @@ public abstract class JsConfig { @NotNull public ModuleKind getModuleKind() { - return moduleKind; + return configuration.getNotNull(JSConfigurationKeys.MODULE_KIND); } public abstract boolean checkLibFilesAndReportErrors(@NotNull Function1 report); diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java index 79ae35558c3..fae5362f7d1 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java @@ -530,7 +530,7 @@ public final class JsProtoBuf { /** * repeated string importedModules = 3; */ - com.google.protobuf.ByteString + org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index); } /** @@ -595,7 +595,7 @@ public final class JsProtoBuf { } case 26: { if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.LazyStringArrayList(); + importedModules_ = new org.jetbrains.kotlin.protobuf.LazyStringArrayList(); mutable_bitField0_ |= 0x00000004; } importedModules_.add(input.readBytes()); @@ -613,7 +613,7 @@ public final class JsProtoBuf { entry_ = java.util.Collections.unmodifiableList(entry_); } if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.UnmodifiableLazyStringList(importedModules_); + importedModules_ = new org.jetbrains.kotlin.protobuf.UnmodifiableLazyStringList(importedModules_); } makeExtensionsImmutable(); } @@ -637,7 +637,7 @@ public final class JsProtoBuf { * Protobuf enum {@code org.jetbrains.kotlin.serialization.js.Library.Kind} */ public enum Kind - implements com.google.protobuf.Internal.EnumLite { + implements org.jetbrains.kotlin.protobuf.Internal.EnumLite { /** * PLAIN = 1; */ @@ -677,13 +677,13 @@ public final class JsProtoBuf { } } - public static com.google.protobuf.Internal.EnumLiteMap + public static org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap internalGetValueMap() { return internalValueMap; } - private static com.google.protobuf.Internal.EnumLiteMap + private static org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap internalValueMap = - new com.google.protobuf.Internal.EnumLiteMap() { + new org.jetbrains.kotlin.protobuf.Internal.EnumLiteMap() { public Kind findValueByNumber(int number) { return Kind.valueOf(number); } @@ -1261,7 +1261,7 @@ public final class JsProtoBuf { // repeated string importedModules = 3; public static final int IMPORTEDMODULES_FIELD_NUMBER = 3; - private com.google.protobuf.LazyStringList importedModules_; + private org.jetbrains.kotlin.protobuf.LazyStringList importedModules_; /** * repeated string importedModules = 3; */ @@ -1284,7 +1284,7 @@ public final class JsProtoBuf { /** * repeated string importedModules = 3; */ - public com.google.protobuf.ByteString + public org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index) { return importedModules_.getByteString(index); } @@ -1292,7 +1292,7 @@ public final class JsProtoBuf { private void initFields() { entry_ = java.util.Collections.emptyList(); kind_ = org.jetbrains.kotlin.serialization.js.JsProtoBuf.Library.Kind.PLAIN; - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -1334,13 +1334,13 @@ public final class JsProtoBuf { .computeMessageSize(1, entry_.get(i)); } if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += com.google.protobuf.CodedOutputStream + size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeEnumSize(2, kind_.getNumber()); } { int dataSize = 0; for (int i = 0; i < importedModules_.size(); i++) { - dataSize += com.google.protobuf.CodedOutputStream + dataSize += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeBytesSizeNoTag(importedModules_.getByteString(i)); } size += dataSize; @@ -1441,7 +1441,7 @@ public final class JsProtoBuf { bitField0_ = (bitField0_ & ~0x00000001); kind_ = org.jetbrains.kotlin.serialization.js.JsProtoBuf.Library.Kind.PLAIN; bitField0_ = (bitField0_ & ~0x00000002); - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -1476,7 +1476,7 @@ public final class JsProtoBuf { } result.kind_ = kind_; if (((bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.UnmodifiableLazyStringList( + importedModules_ = new org.jetbrains.kotlin.protobuf.UnmodifiableLazyStringList( importedModules_); bitField0_ = (bitField0_ & ~0x00000004); } @@ -1704,10 +1704,10 @@ public final class JsProtoBuf { } // repeated string importedModules = 3; - private com.google.protobuf.LazyStringList importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private org.jetbrains.kotlin.protobuf.LazyStringList importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; private void ensureImportedModulesIsMutable() { if (!((bitField0_ & 0x00000004) == 0x00000004)) { - importedModules_ = new com.google.protobuf.LazyStringArrayList(importedModules_); + importedModules_ = new org.jetbrains.kotlin.protobuf.LazyStringArrayList(importedModules_); bitField0_ |= 0x00000004; } } @@ -1733,7 +1733,7 @@ public final class JsProtoBuf { /** * repeated string importedModules = 3; */ - public com.google.protobuf.ByteString + public org.jetbrains.kotlin.protobuf.ByteString getImportedModulesBytes(int index) { return importedModules_.getByteString(index); } @@ -1777,7 +1777,7 @@ public final class JsProtoBuf { * repeated string importedModules = 3; */ public Builder clearImportedModules() { - importedModules_ = com.google.protobuf.LazyStringArrayList.EMPTY; + importedModules_ = org.jetbrains.kotlin.protobuf.LazyStringArrayList.EMPTY; bitField0_ = (bitField0_ & ~0x00000004); return this; @@ -1786,7 +1786,7 @@ public final class JsProtoBuf { * repeated string importedModules = 3; */ public Builder addImportedModulesBytes( - com.google.protobuf.ByteString value) { + org.jetbrains.kotlin.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index a34d86ecfe0..0c65266edd6 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -60,7 +60,7 @@ object KotlinJavascriptSerializationUtil { kotlinModule: ModuleDescriptor): JsModuleDescriptor { val prototype = metadata.toContentMap() - val packageFragmentProvider = createPackageFragmentProvider(kotlinModule, prototype.contentMap, storageManager); + val packageFragmentProvider = createPackageFragmentProvider(kotlinModule, prototype.contentMap, storageManager) return JsModuleDescriptor(kotlinModule.name.asString(), prototype.kind, prototype.imported, packageFragmentProvider) } @@ -94,7 +94,7 @@ object KotlinJavascriptSerializationUtil { ModuleKind.PLAIN -> JsProtoBuf.Library.Kind.PLAIN ModuleKind.AMD -> JsProtoBuf.Library.Kind.AMD ModuleKind.COMMON_JS -> JsProtoBuf.Library.Kind.COMMON_JS - }; + } importedModules.forEach { contentBuilder.addImportedModules(it) } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/rhino/RhinoUtils.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/rhino/RhinoUtils.java index 2dac6a9d952..aceb796f3a6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/rhino/RhinoUtils.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/rhino/RhinoUtils.java @@ -197,8 +197,8 @@ public final class RhinoUtils { runFileWithRhino(TEST_DATA_DIR_PATH + "kotlin_lib.js", context, scope); runFileWithRhino(TEST_DATA_DIR_PATH + "maps.js", context, scope); runFileWithRhino(TEST_DATA_DIR_PATH + "long.js", context, scope); - runFileWithRhino(DIST_DIR_JS_PATH + STDLIB_JS_FILE_NAME, context, scope); runFileWithRhino(DIST_DIR_JS_PATH + BUILTINS_JS_FILE_NAME, context, scope); + runFileWithRhino(DIST_DIR_JS_PATH + STDLIB_JS_FILE_NAME, context, scope); //runFileWithRhino(pathToTestFilesRoot() + "jshint.js", context, scope); for (String jsLibrary : jsLibraries) { runFileWithRhino(jsLibrary, context, scope); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiModuleTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiModuleTestGenerated.java index 1cb843b9e2c..11c5e17509d 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiModuleTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiModuleTestGenerated.java @@ -35,6 +35,12 @@ public class MultiModuleTestGenerated extends AbstractMultiModuleTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/multiModule/cases"), Pattern.compile("^([^\\.]+)$"), false); } + @TestMetadata("moduleAndVariableNameClash") + public void testModuleAndVariableNameClash() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/"); + doTest(fileName); + } + @TestMetadata("useElementsFromDefaultPackageInAnotherModule") public void testUseElementsFromDefaultPackageInAnotherModule() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/multiModule/cases/useElementsFromDefaultPackageInAnotherModule/"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index 47ca0f95347..0b7d3fb4d36 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -106,6 +106,8 @@ public final class Namer { private static final JsNameRef JS_OBJECT = new JsNameRef("Object"); private static final JsNameRef JS_OBJECT_CREATE_FUNCTION = new JsNameRef("create", JS_OBJECT); + public static final String LOCAL_MODULE_PREFIX = "$module$"; + public static boolean isUndefined(@NotNull JsExpression expr) { if (expr instanceof JsPrefixOperation) { JsUnaryOperator op = ((JsPrefixOperation) expr).getOperator(); @@ -511,4 +513,30 @@ public final class Namer { public static JsNameRef createInlineFunction() { return pureFqn(DEFINE_INLINE_FUNCTION, kotlinObject()); } + + @NotNull + public static String suggestedModuleName(@NotNull String id) { + if (id.isEmpty()) { + return "_"; + } + + StringBuilder sb = new StringBuilder(id.length()); + char c = id.charAt(0); + if (Character.isJavaIdentifierStart(c)) { + sb.append(c); + } + else { + sb.append('_'); + if (Character.isJavaIdentifierPart(c)) { + sb.append(c); + } + } + + for (int i = 1; i < id.length(); ++i) { + c = id.charAt(i); + sb.append(Character.isJavaIdentifierPart(c) ? c : '_'); + } + + return sb.toString(); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index a83d85de7dd..7cc3be2bc3c 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -41,10 +41,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject; -import java.util.List; -import java.util.Collections; -import java.util.Map; -import java.util.Set; +import java.util.*; import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.*; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn; @@ -556,13 +553,11 @@ public final class StaticContext { JsName moduleId = importedModules.get(moduleName); if (moduleId == null) { - moduleId = rootScope.declareFreshName(suggestedModuleName(moduleName)); + moduleId = rootScope.declareFreshName(Namer.LOCAL_MODULE_PREFIX + Namer.suggestedModuleName(moduleName)); importedModules.put(moduleName, moduleId); } - // TODO: use just generated moduleId to refer to module. This requires to rewrite how JS module is written - return JsAstUtils.replaceRootReference( - result, namer.getModuleReference(program.getStringLiteral(moduleName))); + return JsAstUtils.replaceRootReference(result, JsAstUtils.pureFqn(moduleId, null)); } }; Rule constructorOrCompanionObjectHasTheSameQualifierAsTheClass = new Rule() { @@ -656,40 +651,6 @@ public final class StaticContext { } } - private static String suggestedModuleName(String id) { - if (id.isEmpty()) { - return "_"; - } - - StringBuilder sb = new StringBuilder(id.length()); - char c = id.charAt(0); - if (Character.isJavaIdentifierStart(c)) { - sb.append(c); - } - else { - sb.append('_'); - if (Character.isJavaIdentifierPart(c)) { - sb.append(c); - } - } - - sb.append(Character.isJavaIdentifierStart(c) ? c : '_'); - for (int i = 1; i < id.length(); ++i) { - c = id.charAt(i); - sb.append(Character.isJavaIdentifierPart(c) ? c : '_'); - } - - return sb.toString(); - } - - @Nullable - private static ClassDescriptor getEnclosing(@Nullable DeclarationDescriptor descriptor) { - while (descriptor != null && !(descriptor instanceof ClassDescriptor)) { - descriptor = descriptor.getContainingDeclaration(); - } - return (ClassDescriptor) descriptor; - } - private static JsExpression applySideEffects(JsExpression expression, DeclarationDescriptor descriptor) { if (expression instanceof HasMetadata) { if (descriptor instanceof FunctionDescriptor || diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java index eb7e54351cc..eecdc8d9977 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.js.translate.test.JSTestGenerator; import org.jetbrains.kotlin.js.translate.test.JSTester; import org.jetbrains.kotlin.js.translate.test.QUnitTester; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; +import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils; import org.jetbrains.kotlin.js.translate.utils.mutator.AssignToExpressionMutator; import org.jetbrains.kotlin.psi.KtDeclarationWithBody; import org.jetbrains.kotlin.psi.KtExpression; @@ -51,6 +52,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -196,9 +198,8 @@ public final class Translation { ) { StaticContext staticContext = StaticContext.generateStaticContext(bindingTrace, config, moduleDescriptor); JsProgram program = staticContext.getProgram(); - JsBlock block = program.getGlobalBlock(); - JsFunction rootFunction = JsAstUtils.createPackage(block.getStatements(), program.getScope()); + JsFunction rootFunction = JsAstUtils.createFunctionWithEmptyBody(program.getScope()); JsBlock rootBlock = rootFunction.getBody(); List statements = rootBlock.getStatements(); statements.add(program.getStringLiteral("use strict").makeStmt()); @@ -206,6 +207,31 @@ public final class Translation { TranslationContext context = TranslationContext.rootContext(staticContext, rootFunction); statements.addAll(PackageDeclarationTranslator.translateFiles(files, context)); defineModule(context, statements, config.getModuleId()); + statements.add(new JsReturn(program.getRootScope().declareName(Namer.getRootPackageName()).makeRef())); + + mayBeGenerateTests(files, config, rootBlock, context); + + JsBlock block = program.getGlobalBlock(); + + // Invoke function passing modules as arguments + // This should help minifier tool to recognize references to this modules as local variables and make them shorter. + List invocationArgs = new ArrayList(staticContext.getImportedModules().size() + 1); + JsName kotlinName = program.getScope().declareName(Namer.KOTLIN_NAME); + rootFunction.getParameters().add(new JsParameter((kotlinName))); + invocationArgs.add(kotlinName.makeRef()); + + for (String importedModule : staticContext.getImportedModules().keySet()) { + rootFunction.getParameters().add(new JsParameter(staticContext.getImportedModules().get(importedModule))); + + JsName globalId = program.getScope().declareName(Namer.suggestedModuleName(importedModule)); + invocationArgs.add(JsAstUtils.pureFqn(globalId, null)); + } + JsInvocation invocation = new JsInvocation(rootFunction, invocationArgs); + + String thisModuleName = JsDescriptorUtils.getModuleNameFromDescriptorName(moduleDescriptor); + JsName thisModuleId = program.getScope().declareName(Namer.suggestedModuleName(thisModuleName)); + block.getStatements().add(JsAstUtils.newVar(thisModuleId, + new JsBinaryOperation(JsBinaryOperator.OR, thisModuleId.makeRef(), invocation))); if (mainCallParameters.shouldBeGenerated()) { JsStatement statement = generateCallToMain(context, files, mainCallParameters.arguments()); @@ -213,7 +239,7 @@ public final class Translation { statements.add(statement); } } - mayBeGenerateTests(files, config, rootBlock, context); + return context; } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java index e051ee624b8..f6e00886dfd 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java @@ -442,18 +442,6 @@ public final class JsAstUtils { return dataDescriptor; } - @NotNull - public static JsFunction createPackage(@NotNull List to, @NotNull JsObjectScope scope) { - JsFunction packageBlockFunction = createFunctionWithEmptyBody(scope); - - JsName kotlinObjectAsParameter = packageBlockFunction.getScope().declareNameUnsafe(Namer.KOTLIN_NAME); - packageBlockFunction.getParameters().add(new JsParameter(kotlinObjectAsParameter)); - - to.add(new JsInvocation(packageBlockFunction, Namer.kotlinObject()).makeStmt()); - - return packageBlockFunction; - } - @NotNull public static JsObjectLiteral wrapValue(@NotNull JsExpression label, @NotNull JsExpression value) { return new JsObjectLiteral(Collections.singletonList(new JsPropertyInitializer(label, value))); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java index 2bab3cb86f8..9882299eb0b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java @@ -197,7 +197,7 @@ public final class JsDescriptorUtils { return element.getContainingFile().getUserData(LibrarySourcesConfig.EXTERNAL_MODULE_NAME); } - private static String getModuleNameFromDescriptorName(DeclarationDescriptor descriptor) { + public static String getModuleNameFromDescriptorName(DeclarationDescriptor descriptor) { ModuleDescriptor moduleDescriptor = DescriptorUtils.getContainingModule(descriptor); String moduleName = moduleDescriptor.getName().asString(); return moduleName.substring(1, moduleName.length() - 1); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt index 8ac37fd5632..3f75150aca2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt @@ -31,7 +31,7 @@ fun expandIsCalls(node: JsNode, context: TranslationContext) { private class TypeCheckRewritingVisitor(private val context: TranslationContext) : JsVisitorWithContextImpl() { private val scopes = Stack() - private val localVars = Stack>() + private val localVars = Stack>().apply { push(mutableSetOf()) } override fun visit(x: JsFunction, ctx: JsContext<*>): Boolean { scopes.push(x.scope) diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index 1b2dc121f86..6a59e57ec87 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var Kotlin = Kotlin || {}; (function (Kotlin) { "use strict"; diff --git a/js/js.translator/testData/kotlin_lib_ecma5.js b/js/js.translator/testData/kotlin_lib_ecma5.js index e2761daa0fb..4bc4f1688bf 100644 --- a/js/js.translator/testData/kotlin_lib_ecma5.js +++ b/js/js.translator/testData/kotlin_lib_ecma5.js @@ -14,7 +14,7 @@ * limitations under the License. */ -var Kotlin = {}; +var Kotlin = Kotlin || {}; (function (Kotlin) { 'use strict'; diff --git a/js/js.translator/testData/long.js b/js/js.translator/testData/long.js index 391e5e797a9..625d9ffe6fa 100644 --- a/js/js.translator/testData/long.js +++ b/js/js.translator/testData/long.js @@ -26,6 +26,8 @@ // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +var Kotlin = Kotlin || {}; + (function (Kotlin) { "use strict"; diff --git a/js/js.translator/testData/maps.js b/js/js.translator/testData/maps.js index b1c4bcf41c0..af7477b7e84 100644 --- a/js/js.translator/testData/maps.js +++ b/js/js.translator/testData/maps.js @@ -14,6 +14,8 @@ * limitations under the License. */ +var Kotlin = Kotlin || {}; + (function (Kotlin) { "use strict"; diff --git a/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/dependencies.txt b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/dependencies.txt new file mode 100644 index 00000000000..6db4872a51a --- /dev/null +++ b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +main->module1 \ No newline at end of file diff --git a/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/main/main.kt b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/main/main.kt new file mode 100644 index 00000000000..38d7c1de434 --- /dev/null +++ b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/main/main.kt @@ -0,0 +1,6 @@ +fun box(): String { + var module1 = bar() + assertEquals("bar", module1) + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/module1/module1.kt b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/module1/module1.kt new file mode 100644 index 00000000000..7ebd3013b6b --- /dev/null +++ b/js/js.translator/testData/multiModule/cases/moduleAndVariableNameClash/module1/module1.kt @@ -0,0 +1 @@ +fun bar() = "bar" \ No newline at end of file