From 73f8c984a191c8dd5e45e242e28430e57fd487d8 Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Fri, 14 Apr 2023 10:46:52 +0000 Subject: [PATCH] [K/JS TEST] Fix the problem with running JS tests on Windows if the test has a long name --- .../js/test/converters/JsIrBackendFacade.kt | 45 ++++++++++--------- .../kotlin/js/test/utils/RunnerUtils.kt | 3 +- .../overriddenChainNonExportIntermediate.kt | 4 +- ...hainNonExportIntermediateInExportedFile.kt | 4 +- .../overriddenChainNonExportIntermediate.kt | 4 +- ...hainNonExportIntermediateInExportedFile.kt | 4 +- ...rriddenExternalMethodWithSameNameMethod.kt | 4 +- 7 files changed, 37 insertions(+), 31 deletions(-) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt index 34e1203d81f..b7661d879d2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/converters/JsIrBackendFacade.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.backend.js.* import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc -import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.* import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC @@ -36,9 +35,11 @@ import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.model.* -import org.jetbrains.kotlin.test.services.* +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.compilerConfigurationProvider import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName +import org.jetbrains.kotlin.test.services.jsLibraryProvider import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull @@ -163,16 +164,17 @@ class JsIrBackendFacade( module.directives[JsEnvironmentConfigurationDirectives.MODULE_KIND].contains(ModuleKind.ES) val outputFile = - File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL_DEV) + module.kind.extension) + File( + JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, TranslationMode.FULL_DEV) + .finalizePath(module.kind) + ) val transformer = IrModuleToJsTransformer( loweredIr.context, mainArguments, moduleToName = runIf(isEsModules) { loweredIr.allModules.associateWith { - "./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".run { - if (isWindows) minify() else this - } + "./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".minifyIfNeed() } } ?: emptyMap() ) @@ -231,14 +233,14 @@ class JsIrBackendFacade( if (dontSkipRegularMode) { for ((mode, output) in compilerResult.outputs.entries) { val outputFile = if (firstTimeCompilation) { - File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + moduleKind.extension) + File(JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode).finalizePath(moduleKind)) } else { File( JsEnvironmentConfigurator.getRecompiledJsModuleArtifactPath( testServices, module.name, mode - ) + moduleKind.extension + ).finalizePath(moduleKind) ) } output.writeTo(outputFile, moduleId, moduleKind) @@ -307,8 +309,6 @@ val TestModule.kind: ModuleKind get() = directives.moduleKind fun String.augmentWithModuleName(moduleName: String): String { - val shouldMinimize = isWindows && moduleName.isPath() - val normalizedName = moduleName.run { if (shouldMinimize) minify() else this } val suffix = when { endsWith(ESM_EXTENSION) -> ESM_EXTENSION endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION @@ -316,26 +316,31 @@ fun String.augmentWithModuleName(moduleName: String): String { } return if (suffix == ESM_EXTENSION) { - replaceAfterLast(File.separator, normalizedName.replace("./", "")).removeSuffix(suffix) + suffix + replaceAfterLast(File.separator, moduleName.minifyIfNeed().replace("./", "")).removeSuffix(suffix) + suffix } else { - return removeSuffix("_v5$suffix") + "-${normalizedName}_v5$suffix" + return removeSuffix("_v5$suffix") + "-${moduleName}_v5$suffix" } } +fun String.finalizePath(moduleKind: ModuleKind): String { + return plus(moduleKind.extension).minifyIfNeed() +} + // D8 ignores Windows settings related to extending of maximum path symbols count // The hack should be deleted when D8 fixes the bug. // The issue is here: https://bugs.chromium.org/p/v8/issues/detail?id=13318 -fun String.minify(): String { - if (length <= 80) return this - - val directoryPath = substringBeforeLast('/') - val fileFullName = substringAfterLast('/') +fun String.minifyIfNeed(): String { + if (!isWindows) return this + val delimiter = if (contains('\\')) '\\' else '/' + val directoryPath = substringBeforeLast(delimiter) + val fileFullName = substringAfterLast(delimiter) val fileName = fileFullName.substringBeforeLast('.') + + if (fileName.length <= 80) return this + val fileExtension = fileFullName.substringAfterLast('.') - return "$directoryPath/${fileName.cityHash64().toULong().toString(16)}.$fileExtension" + return "$directoryPath$delimiter${fileName.cityHash64().toULong().toString(16)}.$fileExtension" } -private fun String.isPath(): Boolean = contains("/") - fun File.augmentWithModuleName(moduleName: String): File = File(absolutePath.augmentWithModuleName(moduleName)) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt index 6324c15ddd0..7dc59d13c1e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.js.JavaScript import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName +import org.jetbrains.kotlin.js.test.converters.finalizePath import org.jetbrains.kotlin.js.test.converters.kind import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION import org.jetbrains.kotlin.js.testOld.* @@ -135,7 +136,7 @@ fun testWithModuleSystem(testServices: TestServices): Boolean { } fun getModeOutputFilePath(testServices: TestServices, module: TestModule, mode: TranslationMode): String { - return JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode) + module.kind.extension + return JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, mode).finalizePath(module.kind) } fun getAllFilesForRunner( diff --git a/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediate.kt b/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediate.kt index 7c5e05bac0c..b7cb3fc9e87 100644 --- a/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediate.kt +++ b/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediate.kt @@ -2,7 +2,7 @@ // EXPECTED_REACHABLE_NODES: 1252 // ES_MODULES -// MODULE: overriden_chain_non_export_intermediate +// MODULE: intermediate // FILE: lib.kt @JsExport abstract class A { @@ -27,7 +27,7 @@ class C : B() { // FILE: entry.mjs // ENTRY_ES_MODULE -import { C } from "./overriddenChainNonExportIntermediate-overriden_chain_non_export_intermediate_v5.mjs"; +import { C } from "./overriddenChainNonExportIntermediate-intermediate_v5.mjs"; export function box() { const c = new C() diff --git a/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediateInExportedFile.kt b/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediateInExportedFile.kt index bbc13901c2b..910ddcfcd91 100644 --- a/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediateInExportedFile.kt +++ b/js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediateInExportedFile.kt @@ -2,7 +2,7 @@ // DONT_TARGET_EXACT_BACKEND: JS // ES_MODULES -// MODULE: overriden_chain_non_export_intermediate +// MODULE: intermediate // FILE: not_exported.kt abstract class B : A() { abstract fun baz(): String @@ -29,7 +29,7 @@ class C : B() { // FILE: main.mjs // ENTRY_ES_MODULE -import { C } from "./overriddenChainNonExportIntermediateInExportedFile-overriden_chain_non_export_intermediate_v5.mjs" +import { C } from "./overriddenChainNonExportIntermediateInExportedFile-intermediate_v5.mjs" export function box() { var c = new C(); diff --git a/js/js.translator/testData/box/export/overriddenChainNonExportIntermediate.kt b/js/js.translator/testData/box/export/overriddenChainNonExportIntermediate.kt index 06a21e6f193..b7548f35fbb 100644 --- a/js/js.translator/testData/box/export/overriddenChainNonExportIntermediate.kt +++ b/js/js.translator/testData/box/export/overriddenChainNonExportIntermediate.kt @@ -3,7 +3,7 @@ // RUN_PLAIN_BOX_FUNCTION // INFER_MAIN_MODULE -// MODULE: overriden_chain_non_export_intermediate +// MODULE: intermediate // FILE: lib.kt @JsExport abstract class A { @@ -29,7 +29,7 @@ class C : B() { // FILE: test.js function box() { - return test(new this["overriden_chain_non_export_intermediate"].C()); + return test(new this["intermediate"].C()); } function test(c) { diff --git a/js/js.translator/testData/box/export/overriddenChainNonExportIntermediateInExportedFile.kt b/js/js.translator/testData/box/export/overriddenChainNonExportIntermediateInExportedFile.kt index 59b65d4bc4d..9250dd60fb8 100644 --- a/js/js.translator/testData/box/export/overriddenChainNonExportIntermediateInExportedFile.kt +++ b/js/js.translator/testData/box/export/overriddenChainNonExportIntermediateInExportedFile.kt @@ -3,7 +3,7 @@ // RUN_PLAIN_BOX_FUNCTION // INFER_MAIN_MODULE -// MODULE: overriden_chain_non_export_intermediate +// MODULE: intermediate // FILE: not_exported.kt abstract class B : A() { abstract fun baz(): String @@ -31,7 +31,7 @@ class C : B() { // FILE: test.js function box() { - return test(new this["overriden_chain_non_export_intermediate"].C()); + return test(new this["intermediate"].C()); } function test(c) { diff --git a/js/js.translator/testData/box/export/overriddenExternalMethodWithSameNameMethod.kt b/js/js.translator/testData/box/export/overriddenExternalMethodWithSameNameMethod.kt index bdd4e54336a..fe98c617444 100644 --- a/js/js.translator/testData/box/export/overriddenExternalMethodWithSameNameMethod.kt +++ b/js/js.translator/testData/box/export/overriddenExternalMethodWithSameNameMethod.kt @@ -3,7 +3,7 @@ // RUN_PLAIN_BOX_FUNCTION // INFER_MAIN_MODULE -// MODULE: overriden_external_method_with_same_name_method +// MODULE: lib // FILE: lib.kt external abstract class Foo { abstract fun o(): String @@ -31,7 +31,7 @@ Foo.prototype.k = function() { } function box() { - return test(new this["overriden_external_method_with_same_name_method"].Baz()); + return test(new this["lib"].Baz()); } function test(foo) {