JS IR: support kotlin.test

This commit is contained in:
Anton Bannykh
2019-03-26 19:00:07 +03:00
parent b0ed688986
commit b7ffdb9fde
24 changed files with 632 additions and 325 deletions
+5 -1
View File
@@ -71,7 +71,11 @@ sourceSets {
fun Test.setUpBoxTests(jsEnabled: Boolean, jsIrEnabled: Boolean) {
dependsOn(":dist")
if (jsEnabled) dependsOn(testJsRuntime)
if (jsIrEnabled) dependsOn(":compiler:ir.serialization.js:generateIrRuntimeKlib")
if (jsIrEnabled) {
dependsOn(":compiler:ir.serialization.js:generateFullRuntimeKLib")
dependsOn(":compiler:ir.serialization.js:generateReducedRuntimeKLib")
dependsOn(":compiler:ir.serialization.js:generateKotlinTestKLib")
}
if (jsEnabled && !jsIrEnabled) exclude("org/jetbrains/kotlin/js/test/ir/semantics/*")
if (!jsEnabled && jsIrEnabled) include("org/jetbrains/kotlin/js/test/ir/semantics/*")
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.incremental.js.IncrementalDataProviderImpl
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumerImpl
import org.jetbrains.kotlin.incremental.js.TranslationResultValue
import org.jetbrains.kotlin.ir.backend.js.JsIrTestRuntime
import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.backend.JsToStringGenerationVisitor
import org.jetbrains.kotlin.js.backend.ast.*
@@ -110,11 +109,7 @@ abstract class BasicBoxTest(
fileContent = fileContent.replace("COROUTINES_PACKAGE", coroutinesPackage)
}
val runtimeType =
if (KJS_WITH_FULL_RUNTIME.matcher(fileContent).find())
JsIrTestRuntime.FULL
else
JsIrTestRuntime.DEFAULT
val needsFullIrRuntime = KJS_WITH_FULL_RUNTIME.matcher(fileContent).find()
val actualMainCallParameters = if (CALL_MAIN_PATTERN.matcher(fileContent).find()) MainCallParameters.mainWithArguments(listOf("testArg")) else mainCallParameters
@@ -150,7 +145,7 @@ abstract class BasicBoxTest(
file.parent, module, outputFileName, dependencies, allDependencies, friends, modules.size > 1,
!SKIP_SOURCEMAP_REMAPPING.matcher(fileContent).find(),
outputPrefixFile, outputPostfixFile, actualMainCallParameters, testPackage, testFunction,
runtimeType, isMainModule
needsFullIrRuntime, isMainModule
)
when {
@@ -333,7 +328,7 @@ abstract class BasicBoxTest(
mainCallParameters: MainCallParameters,
testPackage: String?,
testFunction: String,
runtime: JsIrTestRuntime,
needsFullIrRuntime: Boolean,
isMainModule: Boolean
) {
val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") }
@@ -356,13 +351,13 @@ abstract class BasicBoxTest(
val incrementalData = IncrementalData()
translateFiles(
psiFiles.map(TranslationUnit::SourceFile), outputFile, config, outputPrefixFile, outputPostfixFile,
mainCallParameters, incrementalData, remap, testPackage, testFunction, runtime, isMainModule
mainCallParameters, incrementalData, remap, testPackage, testFunction, needsFullIrRuntime, isMainModule
)
if (incrementalCompilationChecksEnabled && module.hasFilesToRecompile) {
checkIncrementalCompilation(
sourceDirs, module, kotlinFiles, dependencies, allDependencies, friends, multiModule, remap,
outputFile, outputPrefixFile, outputPostfixFile, mainCallParameters, incrementalData, testPackage, testFunction, runtime
outputFile, outputPrefixFile, outputPostfixFile, mainCallParameters, incrementalData, testPackage, testFunction, needsFullIrRuntime
)
}
}
@@ -383,7 +378,7 @@ abstract class BasicBoxTest(
incrementalData: IncrementalData,
testPackage: String?,
testFunction: String,
runtime: JsIrTestRuntime
needsFullIrRuntime: Boolean
) {
val sourceToTranslationUnit = hashMapOf<File, TranslationUnit>()
for (testFile in kotlinFiles) {
@@ -405,7 +400,7 @@ abstract class BasicBoxTest(
translateFiles(
translationUnits, recompiledOutputFile, recompiledConfig, outputPrefixFile, outputPostfixFile,
mainCallParameters, incrementalData, remap, testPackage, testFunction, runtime, false
mainCallParameters, incrementalData, remap, testPackage, testFunction, needsFullIrRuntime, false
)
val originalOutput = FileUtil.loadFile(outputFile)
@@ -470,7 +465,7 @@ abstract class BasicBoxTest(
remap: Boolean,
testPackage: String?,
testFunction: String,
runtime: JsIrTestRuntime,
needsFullIrRuntime: Boolean,
isMainModule: Boolean
) {
val translator = K2JSTranslator(config, false)
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.js.test
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.KlibModuleRef
import org.jetbrains.kotlin.ir.backend.js.compile
import org.jetbrains.kotlin.ir.backend.js.generateKLib
import org.jetbrains.kotlin.ir.backend.js.jsPhases
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.JsConfig
import org.jetbrains.kotlin.js.facade.MainCallParameters
@@ -15,13 +18,9 @@ import org.jetbrains.kotlin.js.facade.TranslationUnit
import org.jetbrains.kotlin.test.TargetBackend
import java.io.File
private val fullRuntimeKlibPath = "js/js.translator/testData/out/klibs/runtimeFull/"
private val defaultRuntimeKlibPath = "js/js.translator/testData/out/klibs/runtimeDefault/"
private val JS_IR_RUNTIME_MODULE_NAME = "JS_IR_RUNTIME"
private val fullRuntimeKlib = KlibModuleRef(JS_IR_RUNTIME_MODULE_NAME, fullRuntimeKlibPath)
private val defaultRuntimeKlib = KlibModuleRef(JS_IR_RUNTIME_MODULE_NAME, defaultRuntimeKlibPath)
private val fullRuntimeKlib = KlibModuleRef("JS_IR_RUNTIME", "compiler/ir/serialization.js/build/fullRuntime/klib")
private val defaultRuntimeKlib = KlibModuleRef("JS_IR_RUNTIME", "compiler/ir/serialization.js/build/reducedRuntime/klib")
private val kotlinTestKLib = KlibModuleRef("kotlin.test", "compiler/ir/serialization.js/build/kotlin.test/klib")
abstract class BasicIrBoxTest(
pathToTestDir: String,
@@ -53,10 +52,6 @@ abstract class BasicIrBoxTest(
override val testChecker get() = if (runTestInNashorn) NashornIrJsTestChecker() else V8IrJsTestChecker
private val runtimes = mapOf(
JsIrTestRuntime.DEFAULT to defaultRuntimeKlib,
JsIrTestRuntime.FULL to fullRuntimeKlib)
override fun translateFiles(
units: List<TranslationUnit>,
outputFile: File,
@@ -68,7 +63,7 @@ abstract class BasicIrBoxTest(
remap: Boolean,
testPackage: String?,
testFunction: String,
runtime: JsIrTestRuntime,
needsFullIrRuntime: Boolean,
isMainModule: Boolean
) {
val filesToCompile = units
@@ -76,35 +71,20 @@ abstract class BasicIrBoxTest(
// TODO: split input files to some parts (global common, local common, test)
.filterNot { it.virtualFilePath.contains(BasicBoxTest.COMMON_FILES_DIR_PATH) }
// config.configuration.put(CommonConfigurationKeys.EXCLUDED_ELEMENTS_FROM_DUMPING, setOf("<JS_IR_RUNTIME>"))
// config.configuration.put(
// CommonConfigurationKeys.PHASES_TO_VALIDATE_AFTER,
// setOf(
// "RemoveInlineFunctionsWithReifiedTypeParametersLowering",
// "InnerClassConstructorCallsLowering",
// "InlineClassLowering", "ConstLowering"
// )
// )
val runtimeKlib = runtimes[runtime]!!
val runtimeKlibs = if (needsFullIrRuntime) listOf(fullRuntimeKlib, kotlinTestKLib) else listOf(defaultRuntimeKlib)
val libraries = config.configuration[JSConfigurationKeys.LIBRARIES]!!.map { File(it).name }
val transitiveLibraries = config.configuration[JSConfigurationKeys.TRANSITIVE_LIBRARIES]!!.map { File(it).name }
// TODO: Add proper depencencies
val dependencies = listOf(runtimeKlib) + libraries.map {
val dependencies = runtimeKlibs + libraries.map {
compilationCache[it] ?: error("Can't find compiled module for dependency $it")
}
val allDependencies = listOf(runtimeKlib) + transitiveLibraries.map {
val allDependencies = runtimeKlibs + transitiveLibraries.map {
compilationCache[it] ?: error("Can't find compiled module for dependency $it")
}
// config.configuration.put(CommonConfigurationKeys.PHASES_TO_DUMP_STATE, setOf("UnitMaterializationLowering"))
// config.configuration.put(CommonConfigurationKeys.PHASES_TO_DUMP_STATE_BEFORE, setOf("ReturnableBlockLowering"))
// config.configuration.put(CommonConfigurationKeys.PHASES_TO_DUMP_STATE_AFTER, setOf("MultipleCatchesLowering"))
// config.configuration.put(CommonConfigurationKeys.PHASES_TO_VALIDATE, setOf("ALL"))
val actualOutputFile = outputFile.absolutePath.let {
if (!isMainModule) it.replace("_v5.js", "/") else it
}