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