[K/JS TEST] Fix the problem with running JS tests on Windows if the test has a long name
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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(
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
js/js.translator/testData/box/esModules/export/overriddenChainNonExportIntermediateInExportedFile.kt
Vendored
+2
-2
@@ -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();
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user