From 093842932fb6434817882c6e5201f02d989de784 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Wed, 25 Oct 2017 16:22:07 +0300 Subject: [PATCH] Filter some characters out of module names passed to Kotlin from Gradle This addresses the cases when a module name contains a slash (e.g. when the Gradle project name was set this way to point Gradle to the directory), which led to Kotlin module file being placed under a subdirectory of META-INF and thus undiscoverable for the compiler and reflect. Additionally, this fix removes characters \n, \r, \t whose presence in a module name caused compilation failures. Issue #KT-20608 Fixed --- .../kotlin/gradle/KotlinGradlePluginIT.kt | 14 ++++++++++++++ .../org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt index 7d3600f84c0..53fc2efd95f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinGradlePluginIT.kt @@ -771,4 +771,18 @@ class KotlinGradleIT : BaseGradleIT() { } } } + + @Test + fun testModuleNameFiltering() = with(Project("typeAlias")) { // Use a Project with a top-level typealias + setupWorkingDir() + + gradleBuildScript().appendText("\n" + """archivesBaseName = 'a/really\\tricky\n\rmodule\tname'""") + build("classes") { + assertSuccessful() + + val metaInfDir = File(projectDir, kotlinClassesDir() + "META-INF") + assertNotNull(metaInfDir.listFiles().singleOrNull { it.name.endsWith(".kotlin_module") }) + } + } + } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index d079f56dcf9..c08b6073d8f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -164,7 +164,7 @@ abstract class AbstractKotlinCompile() : AbstractKo val baseName = project.convention.findPlugin(BasePluginConvention::class.java)?.archivesBaseName ?: project.name val suffix = if (sourceSetName == "main") "" else "_$sourceSetName" - return "$baseName$suffix" + return filterModuleName("${baseName}_$suffix") } @Suppress("UNCHECKED_CAST") @@ -538,6 +538,11 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile(), } } +private val invalidModuleNameCharactersRegex = """[\\/\r\n\t]""".toRegex() + +private fun filterModuleName(moduleName: String): String = + moduleName.replace(invalidModuleNameCharactersRegex, "_") + private fun Task.getGradleVersion(): ParsedGradleVersion? { val gradleVersion = project.gradle.gradleVersion val result = ParsedGradleVersion.parse(gradleVersion)