[K/JS] Throw error when a module contains file with the same name and package (ignoring case)
This commit is contained in:
+16
-1
@@ -15,9 +15,24 @@ import org.jetbrains.kotlin.ir.declarations.path
|
|||||||
private const val EXPORTER_FILE_POSTFIX = ".export"
|
private const val EXPORTER_FILE_POSTFIX = ".export"
|
||||||
|
|
||||||
class ModuleFragmentToExternalName(private val jsOutputNamesMapping: Map<IrModuleFragment, String>) {
|
class ModuleFragmentToExternalName(private val jsOutputNamesMapping: Map<IrModuleFragment, String>) {
|
||||||
|
private val externalNameToItsFile = hashMapOf<String, IrFile>()
|
||||||
|
|
||||||
fun getExternalNameFor(file: IrFile, granularity: JsGenerationGranularity): String {
|
fun getExternalNameFor(file: IrFile, granularity: JsGenerationGranularity): String {
|
||||||
assert(granularity == JsGenerationGranularity.PER_FILE) { "This method should be used only for PER_FILE granularity" }
|
assert(granularity == JsGenerationGranularity.PER_FILE) { "This method should be used only for PER_FILE granularity" }
|
||||||
return file.module.getJsOutputName().getExternalModuleNameForPerFile(file)
|
return file.module.getJsOutputName().getExternalModuleNameForPerFile(file).also {
|
||||||
|
val alreadyReservedBy = externalNameToItsFile.putIfAbsent(it.lowercase(), file)
|
||||||
|
|
||||||
|
if (alreadyReservedBy != null && alreadyReservedBy != file) {
|
||||||
|
error(
|
||||||
|
"""
|
||||||
|
|There are two files in module '${file.module.name}' that have the similar package and file names.
|
||||||
|
| - Package "${file.packageFqName.asString()}" and path "${file.path}"
|
||||||
|
| - Package "${alreadyReservedBy.packageFqName.asString()}" and path "${alreadyReservedBy.path}"
|
||||||
|
|Note, that if the difference is only in letter cases, it also could lead to a clash of the compiled artifacts
|
||||||
|
""".trimMargin()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getExternalNameForExporterFile(file: IrFile, granularity: JsGenerationGranularity): String {
|
fun getExternalNameForExporterFile(file: IrFile, granularity: JsGenerationGranularity): String {
|
||||||
|
|||||||
+21
@@ -359,6 +359,27 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DisplayName("per-file with the declarations validation")
|
||||||
|
@GradleTest
|
||||||
|
fun testPerFileProjectWithResultFilesClash(gradleVersion: GradleVersion) {
|
||||||
|
project("kotlin-js-invalid-per-file-project", gradleVersion) {
|
||||||
|
buildAndFail("compileDevelopmentExecutableKotlinJs") {
|
||||||
|
assertTasksFailed(":compileDevelopmentExecutableKotlinJs")
|
||||||
|
assertOutputContains("""
|
||||||
|
|There are two files in module '<kotlin-js-invalid-per-file-project>' that have the similar package and file names.
|
||||||
|
| - Package "com.example" and
|
||||||
|
""".trimMargin())
|
||||||
|
}
|
||||||
|
buildAndFail("compileProductionExecutableKotlinJs") {
|
||||||
|
assertTasksFailed(":compileProductionExecutableKotlinJs")
|
||||||
|
assertOutputContains("""
|
||||||
|
|There are two files in module '<kotlin-js-invalid-per-file-project>' that have the similar package and file names.
|
||||||
|
| - Package "com.example" and path
|
||||||
|
""".trimMargin())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@DisplayName("fully qualified names can be used in the sourcemap")
|
@DisplayName("fully qualified names can be used in the sourcemap")
|
||||||
@GradleTest
|
@GradleTest
|
||||||
fun testKotlinJsSourceMapGenerateFqNames(gradleVersion: GradleVersion) {
|
fun testKotlinJsSourceMapGenerateFqNames(gradleVersion: GradleVersion) {
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
plugins {
|
||||||
|
kotlin("js")
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
js(IR) {
|
||||||
|
useEsModules()
|
||||||
|
binaries.executable()
|
||||||
|
nodejs()
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
kotlin.tests.individualTaskReports=true
|
||||||
|
kotlin.js.ir.output.granularity=per-file
|
||||||
|
kotlin.incremental=false
|
||||||
|
kotlin.incremental.js=false
|
||||||
|
kotlin.incremental.js.ir=false
|
||||||
|
kotlin.incremental.js.klib=false
|
||||||
|
kotlin.incremental.multiplatform=false
|
||||||
|
kotlin.incremental.useClasspathSnapshot=false
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
fun best(): Int {
|
||||||
|
return 42
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
fun simpleBest(): Int {
|
||||||
|
return 73
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
public val foo = 44
|
||||||
+1
@@ -24,6 +24,7 @@ internal const val MINIMIZED_MEMBER_NAMES = "-Xir-minimized-member-names"
|
|||||||
|
|
||||||
internal const val KLIB_MODULE_NAME = "-Xir-module-name"
|
internal const val KLIB_MODULE_NAME = "-Xir-module-name"
|
||||||
|
|
||||||
|
internal const val PER_FILE = "-Xir-per-file"
|
||||||
internal const val PER_MODULE = "-Xir-per-module"
|
internal const val PER_MODULE = "-Xir-per-module"
|
||||||
internal const val PER_MODULE_OUTPUT_NAME = "-Xir-per-module-output-name"
|
internal const val PER_MODULE_OUTPUT_NAME = "-Xir-per-module-output-name"
|
||||||
|
|
||||||
|
|||||||
+7
-3
@@ -7,7 +7,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
|
|||||||
|
|
||||||
enum class KotlinJsIrOutputGranularity {
|
enum class KotlinJsIrOutputGranularity {
|
||||||
WHOLE_PROGRAM,
|
WHOLE_PROGRAM,
|
||||||
PER_MODULE;
|
PER_MODULE,
|
||||||
|
PER_FILE;
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun byArgument(argument: String): KotlinJsIrOutputGranularity? =
|
fun byArgument(argument: String): KotlinJsIrOutputGranularity? =
|
||||||
@@ -17,6 +18,9 @@ enum class KotlinJsIrOutputGranularity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun KotlinJsIrOutputGranularity.toCompilerArgument(): String {
|
fun KotlinJsIrOutputGranularity.toCompilerArgument(): String {
|
||||||
val perModule = this == KotlinJsIrOutputGranularity.PER_MODULE
|
return when (this) {
|
||||||
return "$PER_MODULE=$perModule"
|
KotlinJsIrOutputGranularity.PER_FILE -> PER_FILE
|
||||||
|
KotlinJsIrOutputGranularity.PER_MODULE -> PER_MODULE
|
||||||
|
KotlinJsIrOutputGranularity.WHOLE_PROGRAM -> ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user