From f768d5b4531039950e44a2348c05b7566dcd90cc Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Tue, 20 Jul 2021 19:40:38 +0300 Subject: [PATCH] [JS TEST] Refactor test runner a bit Build IC cache for library right after its compilation --- .../jetbrains/kotlin/js/test/BasicBoxTest.kt | 17 +++-- .../kotlin/js/test/BasicIrBoxTest.kt | 68 +++++++++++-------- 2 files changed, 53 insertions(+), 32 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index f310fc18cdf..35e7a07f413 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -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() 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 ) { 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 ) { val translator = K2JSTranslator(config, false) val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt index 05f8e38ae9a..80a2efd6d6e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt @@ -89,7 +89,6 @@ abstract class BasicIrBoxTest( override val testChecker get() = if (runTestInNashorn) NashornIrJsTestChecker() else V8IrJsTestChecker - @Suppress("ConstantConditionIf") override fun translateFiles( units: List, outputFile: File, @@ -111,7 +110,8 @@ abstract class BasicIrBoxTest( safeExternalBoolean: Boolean, safeExternalBooleanDiagnostic: RuntimeDiagnostic?, skipMangleVerification: Boolean, - abiVersion: KotlinAbiVersion + abiVersion: KotlinAbiVersion, + icCache: MutableMap ) { 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 = if (!runIcMode) emptyMap() else { - val map = mutableMapOf() - 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, config: JsConfig, icCache: Map): 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) { + 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): Set { val phases = System.getProperty(key)?.split(',')?.toSet() ?: emptySet() if (phases.isEmpty()) return all @@ -290,10 +304,10 @@ abstract class BasicIrBoxTest( val dependencyPaths = mutableListOf() 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