JS: use metadata in jps build process

This commit is contained in:
Michael Nedzelsky
2015-03-25 22:44:34 +03:00
parent 9a02db3e8b
commit 06aef3164c
4 changed files with 44 additions and 45 deletions
@@ -17,46 +17,51 @@
package org.jetbrains.kotlin.jps.build package org.jetbrains.kotlin.jps.build
import com.intellij.util.Consumer import com.intellij.util.Consumer
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType
import org.jetbrains.jps.incremental.ModuleBuildTarget import org.jetbrains.jps.incremental.ModuleBuildTarget
import org.jetbrains.jps.model.java.JavaSourceRootProperties
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.java.JpsJavaModuleType import org.jetbrains.jps.model.java.JpsJavaModuleType
import org.jetbrains.jps.model.library.JpsOrderRootType import org.jetbrains.jps.model.library.JpsOrderRootType
import org.jetbrains.jps.model.module.JpsModule import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.jps.util.JpsPathUtil
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.io.File
import java.util.ArrayList import java.util.ArrayList
import kotlin.platform.platformStatic
class JpsJsModuleUtils private() { object JpsJsModuleUtils {
companion object {
fun getLibraryFilesAndDependencies(target: ModuleBuildTarget): List<String> { fun getLibraryFilesAndDependencies(target: ModuleBuildTarget): List<String> {
val result = ArrayList<String>() val result = ArrayList<String>()
getLibraryFiles(target, result) getLibraryFiles(target, result)
getDependencyModulesAndSources(target, result) getDependencyModulesAndSources(target, result)
return result return result
} }
fun getLibraryFiles(target: ModuleBuildTarget, result: MutableList<String>) { fun getLibraryFiles(target: ModuleBuildTarget, result: MutableList<String>) {
val libraries = JpsUtils.getAllDependencies(target).getLibraries() val libraries = JpsUtils.getAllDependencies(target).getLibraries()
for (library in libraries) { for (library in libraries) {
for (root in library.getRoots(JpsOrderRootType.COMPILED)) { for (root in library.getRoots(JpsOrderRootType.COMPILED)) {
result.add(JpsPathUtil.urlToPath(root.getUrl())) result.add(JpsPathUtil.urlToPath(root.getUrl()))
}
} }
} }
fun getDependencyModulesAndSources(target: ModuleBuildTarget, result: MutableList<String>) {
JpsUtils.getAllDependencies(target).processModules(object : Consumer<JpsModule> {
override fun consume(module: JpsModule) {
if (module == target.getModule() || module.getModuleType() != JpsJavaModuleType.INSTANCE) return
result.add("@" + module.getName())
for (root in module.getSourceRoots<JavaSourceRootProperties>(JavaSourceRootType.SOURCE)) {
result.add(JpsPathUtil.urlToPath(root.getUrl()))
}
}
})
}
} }
fun getDependencyModulesAndSources(target: ModuleBuildTarget, result: MutableList<String>) {
JpsUtils.getAllDependencies(target).processModules(object : Consumer<JpsModule> {
override fun consume(module: JpsModule) {
if (module == target.getModule() || module.getModuleType() != JpsJavaModuleType.INSTANCE) return
val moduleBuildTarget = ModuleBuildTarget(module, JavaModuleBuildTargetType.PRODUCTION)
val outputDir = KotlinBuilderModuleScriptGenerator.getOutputDirSafe(moduleBuildTarget)
val metaInfoFile = getOutputMetaFile(outputDir, module.getName())
result.add(metaInfoFile.getAbsolutePath())
}
})
}
platformStatic
fun getOutputFile(outputDir: File, moduleName: String) = File(outputDir, moduleName + KotlinJavascriptMetadataUtils.JS_EXT)
platformStatic
fun getOutputMetaFile(outputDir: File, moduleName: String) = File(outputDir, moduleName + KotlinJavascriptMetadataUtils.META_JS_SUFFIX)
} }
@@ -399,8 +399,8 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
val outputDir = KotlinBuilderModuleScriptGenerator.getOutputDirSafe(representativeTarget) val outputDir = KotlinBuilderModuleScriptGenerator.getOutputDirSafe(representativeTarget)
val moduleName = representativeTarget.getModule().getName() val moduleName = representativeTarget.getModule().getName()
val outputFile = File(outputDir, "$moduleName.js") val outputFile = JpsJsModuleUtils.getOutputFile(outputDir, moduleName)
val metaInfoFile = File(outputDir, "$moduleName.meta.js") val metaInfoFile = JpsJsModuleUtils.getOutputMetaFile(outputDir, moduleName)
val libraryFiles = JpsJsModuleUtils.getLibraryFilesAndDependencies(representativeTarget) val libraryFiles = JpsJsModuleUtils.getLibraryFilesAndDependencies(representativeTarget)
val compilerSettings = JpsKotlinCompilerSettings.getCompilerSettings(project) val compilerSettings = JpsKotlinCompilerSettings.getCompilerSettings(project)
val k2JsArguments = JpsKotlinCompilerSettings.getK2JsCompilerArguments(project) val k2JsArguments = JpsKotlinCompilerSettings.getK2JsCompilerArguments(project)
@@ -120,14 +120,8 @@ public class LibrarySourcesConfig extends Config {
VirtualFileSystem fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL); VirtualFileSystem fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL);
VirtualFileSystem jarFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.JAR_PROTOCOL); VirtualFileSystem jarFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.JAR_PROTOCOL);
String moduleName = null;
for (String path : files) { for (String path : files) {
VirtualFile file; VirtualFile file;
if (path.charAt(0) == '@') {
moduleName = path.substring(1);
continue;
}
File filePath = new File(path); File filePath = new File(path);
if (!filePath.exists()) { if (!filePath.exists()) {
@@ -149,10 +143,7 @@ public class LibrarySourcesConfig extends Config {
else { else {
String actualModuleName; String actualModuleName;
if (moduleName != null) { if (isOldKotlinJavascriptLibrary(filePath)) {
actualModuleName = moduleName;
}
else if (isOldKotlinJavascriptLibrary(filePath)) {
actualModuleName = LibraryUtils.getKotlinJsModuleName(filePath); actualModuleName = LibraryUtils.getKotlinJsModuleName(filePath);
} }
else if (isKotlinJavascriptLibraryWithMetadata(filePath)) { else if (isKotlinJavascriptLibraryWithMetadata(filePath)) {
@@ -167,7 +158,6 @@ public class LibrarySourcesConfig extends Config {
action.invoke(actualModuleName, file); action.invoke(actualModuleName, file);
} }
} }
moduleName = null;
} }
return false; return false;
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.js.test package org.jetbrains.kotlin.js.test
import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.config.EcmaVersion import org.jetbrains.kotlin.js.config.EcmaVersion
import org.jetbrains.kotlin.js.facade.MainCallParameters import org.jetbrains.kotlin.js.facade.MainCallParameters
import org.jetbrains.kotlin.js.test.rhino.RhinoFunctionResultChecker import org.jetbrains.kotlin.js.test.rhino.RhinoFunctionResultChecker
@@ -52,12 +53,15 @@ public abstract class MultipleModulesTranslationTest(main: String) : BasicTest(m
val fullFilePaths = getAllFilesInDir(pathToDir + File.separator + moduleName) val fullFilePaths = getAllFilesInDir(pathToDir + File.separator + moduleName)
val libraries = ArrayList<String>() val libraries = ArrayList<String>()
for (dependencyName in dependencies) { for (dependencyName in dependencies) {
libraries.add("@" + dependencyName) libraries.add(getMetaInfo(getModuleDirectoryName(dirName, dependencyName)))
libraries.add(pathToDir + File.separator + dependencyName)
} }
generateJavaScriptFiles(fullFilePaths, moduleDirectoryName, MainCallParameters.noCall(), BasicTest.DEFAULT_ECMA_VERSIONS, moduleName, libraries) generateJavaScriptFiles(fullFilePaths, moduleDirectoryName, MainCallParameters.noCall(), BasicTest.DEFAULT_ECMA_VERSIONS, moduleName, libraries)
} }
override fun getMetaInfo(moduleId: String): String? {
return getOutputPath() + moduleId + ".meta" + JavaScript.DOT_EXTENSION
}
override fun additionalJsFiles(ecmaVersion: EcmaVersion): List<String> { override fun additionalJsFiles(ecmaVersion: EcmaVersion): List<String> {
val result = super.additionalJsFiles(ecmaVersion) val result = super.additionalJsFiles(ecmaVersion)
val dirName = getTestName(true) val dirName = getTestName(true)