add kjsm option for kotlin js command line compiler

This commit is contained in:
Michael Nedzelsky
2015-11-20 15:59:11 +03:00
parent 24e473f47b
commit c80c33efb6
13 changed files with 69 additions and 12 deletions
@@ -43,5 +43,16 @@ public class SimpleOutputFile(
override fun asByteArray(): ByteArray = content.toByteArray() override fun asByteArray(): ByteArray = content.toByteArray()
override fun asText(): String = content override fun asText(): String = content
override fun toString() = "$relativePath (compiled from $sourceFiles)"
}
public class SimpleOutputBinaryFile(
override val sourceFiles: List<File>,
override val relativePath: String,
private val content: ByteArray
) : OutputFile {
override fun asByteArray(): ByteArray = content
override fun asText(): String = String(content)
override fun toString() = "$relativePath (compiled from $sourceFiles)" override fun toString() = "$relativePath (compiled from $sourceFiles)"
} }
@@ -41,6 +41,9 @@ public class K2JSCompilerArguments extends CommonCompilerArguments {
@Argument(value = "meta-info", description = "Generate metadata") @Argument(value = "meta-info", description = "Generate metadata")
public boolean metaInfo; public boolean metaInfo;
@Argument(value = "kjsm", description = "Generate kjsm-files (for creating libraries)")
public boolean kjsm;
@Argument(value = "target", description = "Generate JS files for specific ECMA version (only ECMA 5 is supported)") @Argument(value = "target", description = "Generate JS files for specific ECMA version (only ECMA 5 is supported)")
@ValueDescription("<version>") @ValueDescription("<version>")
public String target; public String target;
@@ -264,6 +264,7 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
.sourceMap(arguments.sourceMap) .sourceMap(arguments.sourceMap)
.inlineEnabled(inlineEnabled) .inlineEnabled(inlineEnabled)
.metaInfo(arguments.metaInfo) .metaInfo(arguments.metaInfo)
.kjsm(arguments.kjsm)
.build(); .build();
} }
+5
View File
@@ -0,0 +1,5 @@
compiler/testData/integration/ant/js/simpleWithoutStdlibAndFolderAsAnotherLib/jslib-example/LibraryExample.kt
-no-stdlib
-kjsm
-output
$TEMP_DIR$/jslib-example.js
+1
View File
@@ -0,0 +1 @@
OK
+1
View File
@@ -1,5 +1,6 @@
compiler/testData/integration/ant/js/simpleWithoutStdlibAndFolderAsAnotherLib/jslib-example/LibraryExample.kt compiler/testData/integration/ant/js/simpleWithoutStdlibAndFolderAsAnotherLib/jslib-example/LibraryExample.kt
-no-stdlib -no-stdlib
-meta-info -meta-info
-kjsm
-output -output
$TEMP_DIR$/jslib-example.js $TEMP_DIR$/jslib-example.js
+1
View File
@@ -5,6 +5,7 @@ where possible options include:
-library-files <path[,]> Path to zipped library sources or kotlin files separated by commas -library-files <path[,]> Path to zipped library sources or kotlin files separated by commas
-source-map Generate source map -source-map Generate source map
-meta-info Generate metadata -meta-info Generate metadata
-kjsm Generate kjsm-files (for creating libraries)
-target <version> Generate JS files for specific ECMA version (only ECMA 5 is supported) -target <version> Generate JS files for specific ECMA version (only ECMA 5 is supported)
-main {call,noCall} Whether a main function should be called; default 'call' (main function will be auto detected) -main {call,noCall} Whether a main function should be called; default 'call' (main function will be auto detected)
-output-prefix <path> Path to file which will be added to the beginning of output file -output-prefix <path> Path to file which will be added to the beginning of output file
@@ -274,6 +274,12 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/cli/js"), Pattern.compile("^(.+)\\.args$"), false); KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/cli/js"), Pattern.compile("^(.+)\\.args$"), false);
} }
@TestMetadata("createKjsm.args")
public void testCreateKjsm() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/js/createKjsm.args");
doJsTest(fileName);
}
@TestMetadata("createMetadata.args") @TestMetadata("createMetadata.args")
public void testCreateMetadata() throws Exception { public void testCreateMetadata() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/js/createMetadata.args"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/js/createMetadata.args");
@@ -97,6 +97,15 @@ public class K2JsCliTest extends CliBaseTest {
Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example.meta.js").isFile()); Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example.meta.js").isFile());
Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example.js").isFile()); Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example.js").isFile());
Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example/library/sample/classA.kjsm").isFile());
}
@Test
public void createKjsm() throws Exception {
executeCompilerCompareOutputJS();
Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example.js").isFile());
Assert.assertTrue(new File(tmpdir.getTmpDir(), "jslib-example/library/sample/classA.kjsm").isFile());
} }
@Test @Test
@@ -57,6 +57,7 @@ public abstract class Config {
private final boolean sourcemap; private final boolean sourcemap;
private final boolean metaInfo; private final boolean metaInfo;
private final boolean kjsm;
@NotNull @NotNull
protected final List<KotlinJavascriptMetadata> metadata = new SmartList<KotlinJavascriptMetadata>(); protected final List<KotlinJavascriptMetadata> metadata = new SmartList<KotlinJavascriptMetadata>();
@@ -72,7 +73,8 @@ public abstract class Config {
@NotNull EcmaVersion ecmaVersion, @NotNull EcmaVersion ecmaVersion,
boolean sourcemap, boolean sourcemap,
boolean inlineEnabled, boolean inlineEnabled,
boolean metaInfo boolean metaInfo,
boolean kjsm
) { ) {
this.project = project; this.project = project;
this.target = ecmaVersion; this.target = ecmaVersion;
@@ -80,6 +82,7 @@ public abstract class Config {
this.sourcemap = sourcemap; this.sourcemap = sourcemap;
this.inlineEnabled = inlineEnabled; this.inlineEnabled = inlineEnabled;
this.metaInfo = metaInfo; this.metaInfo = metaInfo;
this.kjsm = kjsm;
} }
public boolean isSourcemap() { public boolean isSourcemap() {
@@ -90,6 +93,10 @@ public abstract class Config {
return metaInfo; return metaInfo;
} }
public boolean isKjsm() {
return kjsm;
}
public boolean isInlineEnabled() { public boolean isInlineEnabled() {
return inlineEnabled; return inlineEnabled;
} }
@@ -70,9 +70,10 @@ public class LibrarySourcesConfig extends Config {
boolean sourceMap, boolean sourceMap,
boolean inlineEnabled, boolean inlineEnabled,
boolean isUnitTestConfig, boolean isUnitTestConfig,
boolean metaInfo boolean metaInfo,
boolean kjsm
) { ) {
super(project, moduleId, ecmaVersion, sourceMap, inlineEnabled, metaInfo); super(project, moduleId, ecmaVersion, sourceMap, inlineEnabled, metaInfo, kjsm);
this.files = files; this.files = files;
this.isUnitTestConfig = isUnitTestConfig; this.isUnitTestConfig = isUnitTestConfig;
} }
@@ -197,6 +198,7 @@ public class LibrarySourcesConfig extends Config {
boolean inlineEnabled = true; boolean inlineEnabled = true;
boolean isUnitTestConfig = false; boolean isUnitTestConfig = false;
boolean metaInfo = false; boolean metaInfo = false;
boolean kjsm = false;
public Builder(@NotNull Project project, @NotNull String moduleId, @NotNull List<String> files) { public Builder(@NotNull Project project, @NotNull String moduleId, @NotNull List<String> files) {
this.project = project; this.project = project;
@@ -229,8 +231,13 @@ public class LibrarySourcesConfig extends Config {
return this; return this;
} }
public Builder kjsm(boolean kjsm) {
this.kjsm = kjsm;
return this;
}
public Config build() { public Config build() {
return new LibrarySourcesConfig(project, moduleId, files, ecmaVersion, sourceMap, inlineEnabled, isUnitTestConfig, metaInfo); return new LibrarySourcesConfig(project, moduleId, files, ecmaVersion, sourceMap, inlineEnabled, isUnitTestConfig, metaInfo, kjsm);
} }
} }
@@ -168,11 +168,11 @@ public object KotlinJavascriptSerializationUtil {
return KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classDescriptor.classId) return KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classDescriptor.classId)
} }
private fun ModuleDescriptor.toContentMap(): Map<String, ByteArray> { public fun toContentMap(module: ModuleDescriptor): Map<String, ByteArray> {
val contentMap = hashMapOf<String, ByteArray>() val contentMap = hashMapOf<String, ByteArray>()
getPackagesFqNames(this).forEach { getPackagesFqNames(module).forEach {
serializePackage(this, it) { serializePackage(module, it) {
fileName, bytes -> contentMap[fileName] = bytes fileName, bytes -> contentMap[fileName] = bytes
} }
} }
@@ -218,7 +218,7 @@ public object KotlinJavascriptSerializationUtil {
} }
private fun ModuleDescriptor.toBinaryMetadata(): ByteArray = private fun ModuleDescriptor.toBinaryMetadata(): ByteArray =
KotlinJavascriptSerializationUtil.contentMapToByteArray(this.toContentMap()) KotlinJavascriptSerializationUtil.contentMapToByteArray(toContentMap(this))
} }
public fun KotlinJavascriptMetadata.forEachFile(operation: (filePath: String, fileContent: ByteArray) -> Unit): Unit = public fun KotlinJavascriptMetadata.forEachFile(operation: (filePath: String, fileContent: ByteArray) -> Unit): Unit =
@@ -21,9 +21,7 @@ import com.google.dart.compiler.util.TextOutput
import com.google.dart.compiler.util.TextOutputImpl import com.google.dart.compiler.util.TextOutputImpl
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection import org.jetbrains.kotlin.backend.common.output.*
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFile
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.js.config.Config import org.jetbrains.kotlin.js.config.Config
import org.jetbrains.kotlin.js.sourceMap.JsSourceGenerationVisitor import org.jetbrains.kotlin.js.sourceMap.JsSourceGenerationVisitor
@@ -70,7 +68,7 @@ public abstract class TranslationResult protected constructor(public val diagnos
} }
val jsFile = SimpleOutputFile(sourceFiles, outputFile.getName(), prefix + code + postfix) val jsFile = SimpleOutputFile(sourceFiles, outputFile.getName(), prefix + code + postfix)
val outputFiles = arrayListOf(jsFile) val outputFiles = arrayListOf<OutputFile>(jsFile)
if (config.isMetaInfo()) { if (config.isMetaInfo()) {
val metaFileName = KotlinJavascriptMetadataUtils.replaceSuffix(outputFile.getName()) val metaFileName = KotlinJavascriptMetadataUtils.replaceSuffix(outputFile.getName())
@@ -80,6 +78,13 @@ public abstract class TranslationResult protected constructor(public val diagnos
outputFiles.add(jsMetaFile) outputFiles.add(jsMetaFile)
} }
if (config.isKjsm) {
KotlinJavascriptSerializationUtil.toContentMap(moduleDescriptor).forEach {
// TODO Add correct source files
outputFiles.add(SimpleOutputBinaryFile(emptyList(), config.moduleId + VfsUtilCore.VFS_SEPARATOR_CHAR + it.key, it.value))
}
}
if (sourceMapBuilder != null) { if (sourceMapBuilder != null) {
sourceMapBuilder.skipLinesAtBeginning(StringUtil.getLineBreakCount(prefix)) sourceMapBuilder.skipLinesAtBeginning(StringUtil.getLineBreakCount(prefix))
val sourceMapFile = SimpleOutputFile(sourceFiles, sourceMapBuilder.getOutFile().getName(), sourceMapBuilder.build()) val sourceMapFile = SimpleOutputFile(sourceFiles, sourceMapBuilder.getOutFile().getName(), sourceMapBuilder.build())