[JS TEST] Refactor test runner a bit

Build IC cache for library right after its compilation
This commit is contained in:
Roman Artemev
2021-07-20 19:40:38 +03:00
committed by teamcityserver
parent 0310f7cb0b
commit f768d5b453
2 changed files with 53 additions and 32 deletions
@@ -27,6 +27,7 @@ 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.ic.SerializedIcData
import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.backend.JsToStringGenerationVisitor
import org.jetbrains.kotlin.js.backend.ast.*
@@ -190,6 +191,7 @@ abstract class BasicBoxTest(
}
val testModuleName = if (runPlainBoxFunction) null else mainModuleName
val mainModule = modules[mainModuleName] ?: error("No module with name \"$mainModuleName\"")
val icCache = mutableMapOf<String, SerializedIcData>()
val generatedJsFiles = orderedModules.asReversed().mapNotNull { module ->
val dependencies = module.dependenciesSymbols.map { modules[it]?.outputFileName(outputDir) + ".meta.js" }
@@ -230,7 +232,8 @@ abstract class BasicBoxTest(
safeExternalBoolean,
safeExternalBooleanDiagnostic,
skipMangleVerification,
abiVersion
abiVersion,
icCache
)
when {
@@ -487,7 +490,8 @@ abstract class BasicBoxTest(
safeExternalBoolean: Boolean,
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
skipMangleVerification: Boolean,
abiVersion: KotlinAbiVersion
abiVersion: KotlinAbiVersion,
icCache: MutableMap<String, SerializedIcData>
) {
val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") }
val testFiles = kotlinFiles.map { it.fileName }
@@ -541,7 +545,8 @@ abstract class BasicBoxTest(
safeExternalBoolean,
safeExternalBooleanDiagnostic,
skipMangleVerification,
abiVersion
abiVersion,
icCache
)
if (incrementalCompilationChecksEnabled && module.hasFilesToRecompile) {
@@ -639,7 +644,8 @@ abstract class BasicBoxTest(
safeExternalBoolean = false,
safeExternalBooleanDiagnostic = null,
skipMangleVerification = false,
abiVersion = KotlinAbiVersion.CURRENT
abiVersion = KotlinAbiVersion.CURRENT,
mutableMapOf()
)
val originalOutput = FileUtil.loadFile(outputFile)
@@ -722,7 +728,8 @@ abstract class BasicBoxTest(
safeExternalBoolean: Boolean,
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
skipMangleVerification: Boolean,
abiVersion: KotlinAbiVersion
abiVersion: KotlinAbiVersion,
icCache: MutableMap<String, SerializedIcData>
) {
val translator = K2JSTranslator(config, false)
val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters)
@@ -89,7 +89,6 @@ abstract class BasicIrBoxTest(
override val testChecker get() = if (runTestInNashorn) NashornIrJsTestChecker() else V8IrJsTestChecker
@Suppress("ConstantConditionIf")
override fun translateFiles(
units: List<TranslationUnit>,
outputFile: File,
@@ -111,7 +110,8 @@ abstract class BasicIrBoxTest(
safeExternalBoolean: Boolean,
safeExternalBooleanDiagnostic: RuntimeDiagnostic?,
skipMangleVerification: Boolean,
abiVersion: KotlinAbiVersion
abiVersion: KotlinAbiVersion,
icCache: MutableMap<String, SerializedIcData>
) {
val filesToCompile = units.map { (it as TranslationUnit.SourceFile).file }
@@ -125,6 +125,8 @@ abstract class BasicIrBoxTest(
val klibPath = outputFile.absolutePath.replace("_v5.js", "/")
prepareRuntimePirCaches(config, icCache)
if (isMainModule && klibMainModule) {
generateKLib(
project = config.project,
@@ -173,29 +175,6 @@ abstract class BasicIrBoxTest(
}
if (!skipRegularMode) {
val icCache: Map<String, SerializedIcData> = if (!runIcMode) emptyMap() else {
val map = mutableMapOf<String, SerializedIcData>()
for (path in allKlibPaths) {
val icData = predefinedKlibHasIcCache[path] ?: prepareSingleLibraryIcCache(
project = project,
analyzer = AnalyzerWithCompilerReport(config.configuration),
configuration = config.configuration,
libPath = path,
dependencies = allKlibPaths,
icCache = map
)
if (path in predefinedKlibHasIcCache) {
predefinedKlibHasIcCache[path] = icData
}
map[path] = icData
}
map
}
val irFactory = if (lowerPerModule) PersistentIrFactory() else IrFactoryImpl
val compiledModule = compile(
project = config.project,
@@ -269,12 +248,47 @@ abstract class BasicIrBoxTest(
null
)
if (runIcMode) {
icCache[actualOutputFile] = createPirCache(actualOutputFile, allKlibPaths + actualOutputFile, config, icCache)
}
logger.logFile("Output klib", File(actualOutputFile))
compilationCache[outputFile.name.replace(".js", ".meta.js")] = actualOutputFile
}
}
private fun createPirCache(path: String, allKlibPaths: Collection<String>, config: JsConfig, icCache: Map<String, SerializedIcData>): SerializedIcData {
val icData = predefinedKlibHasIcCache[path] ?: prepareSingleLibraryIcCache(
project = project,
analyzer = AnalyzerWithCompilerReport(config.configuration),
configuration = config.configuration,
libPath = path,
dependencies = allKlibPaths,
icCache = icCache
)
if (path in predefinedKlibHasIcCache) {
predefinedKlibHasIcCache[path] = icData
}
return icData
}
private fun prepareRuntimePirCaches(config: JsConfig, icCache: MutableMap<String, SerializedIcData>) {
if (!runIcMode) return
val defaultRuntimePath = File(defaultRuntimeKlib).canonicalPath
icCache[defaultRuntimePath] = createPirCache(defaultRuntimePath, listOf(defaultRuntimePath), config, icCache)
val fullRuntimePath = File(fullRuntimeKlib).canonicalPath
icCache[fullRuntimePath] = createPirCache(fullRuntimePath, listOf(fullRuntimePath), config, icCache)
val testKlibPath = File(kotlinTestKLib).canonicalPath
icCache[testKlibPath] = createPirCache(testKlibPath, listOf(fullRuntimePath, testKlibPath), config, icCache)
}
private fun fromSysPropertyOrAll(key: String, all: Set<AnyNamedPhase>): Set<AnyNamedPhase> {
val phases = System.getProperty(key)?.split(',')?.toSet() ?: emptySet()
if (phases.isEmpty()) return all
@@ -290,10 +304,10 @@ abstract class BasicIrBoxTest(
val dependencyPaths = mutableListOf<String>()
dependencies.forEach { (moduleId, outputs) ->
val wrappedCode = wrapWithModuleEmulationMarkers(outputs.jsCode, config.moduleKind, moduleId)
val moduleWrappedCode = wrapWithModuleEmulationMarkers(outputs.jsCode, config.moduleKind, moduleId)
val dependencyPath = outputFile.absolutePath.replace("_v5.js", "-${moduleId}_v5.js")
dependencyPaths += dependencyPath
File(dependencyPath).write(wrappedCode)
File(dependencyPath).write(moduleWrappedCode)
}
cachedDependencies[outputFile.absolutePath] = dependencyPaths