From 1d041b7ef421b2065831ab4ceccb97a9e8cb5e5a Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 7 Dec 2022 10:41:39 +0100 Subject: [PATCH] [Gradle] Replace deprecated String::capitalize with capitalizeAsciiOnly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should prevent issues when ascii characters are uppercased or lowercased on users machines with their locales. For example in Turkish locale: * 'i' uppercases to 'İ' * 'I' lowercases to 'ı' ^KT-38712 Verification Pending --- .../jetbrains/kotlin/gradle/plugin/KotlinJsCompilerType.kt | 4 +++- .../kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt | 3 ++- .../gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt | 5 +++-- .../gradle/scripting/internal/ScriptingGradleSubplugin.kt | 3 ++- .../kotlin/gradle/targets/js/KotlinJsTargetPreset.kt | 3 ++- .../kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt | 3 ++- .../kotlin/gradle/targets/native/DefaultCInteropSettings.kt | 5 +++-- .../gradle/targets/native/KotlinNativeTargetConfigurator.kt | 5 +++-- .../gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt | 5 +++-- .../kotlin/gradle/testing/internal/KotlinTestsRegistry.kt | 3 ++- .../kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt | 3 ++- 11 files changed, 27 insertions(+), 15 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsCompilerType.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsCompilerType.kt index 42a3147cd14..05079d9110c 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsCompilerType.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsCompilerType.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.gradle.plugin +import java.util.* + enum class KotlinJsCompilerType { LEGACY, IR, @@ -33,5 +35,5 @@ fun String.removeJsCompilerSuffix(compilerType: KotlinJsCompilerType): String { return truncatedString } - return removeSuffix(compilerType.lowerName.capitalize()) + return removeSuffix(compilerType.lowerName.capitalize(Locale.ENGLISH)) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt index bf0ab827816..09f09bdacd6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt @@ -13,6 +13,7 @@ import org.gradle.api.plugins.ExtensionAware import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import javax.inject.Inject /* @@ -164,7 +165,7 @@ abstract class KotlinNativeBinaryContainer @Inject constructor( return if (name == suffix) "" else - name.substringBeforeLast(suffix.capitalize()) + name.substringBeforeLast(suffix.capitalizeAsciiOnly()) } // TODO: Remove in 1.3.50. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index 21e0e639d80..168cd4afa16 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.configuration.* import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.io.ByteArrayOutputStream import java.io.File import java.io.ObjectOutputStream @@ -75,7 +76,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To fun getKaptConfigurationName(sourceSetName: String): String { return if (sourceSetName != SourceSet.MAIN_SOURCE_SET_NAME) - "$MAIN_KAPT_CONFIGURATION_NAME${sourceSetName.capitalize()}" + "$MAIN_KAPT_CONFIGURATION_NAME${sourceSetName.capitalizeAsciiOnly()}" else MAIN_KAPT_CONFIGURATION_NAME } @@ -599,7 +600,7 @@ internal fun registerGeneratedJavaSource(kaptTask: TaskProvider, j internal fun Configuration.getNamedDependencies(): List = allDependencies.filter { it.group != null } private val ANNOTATION_PROCESSOR = "annotationProcessor" -private val ANNOTATION_PROCESSOR_CAP = ANNOTATION_PROCESSOR.capitalize() +private val ANNOTATION_PROCESSOR_CAP = ANNOTATION_PROCESSOR.capitalizeAsciiOnly() internal fun checkAndroidAnnotationProcessorDependencyUsage(project: Project) { if (project.hasProperty("kapt.dont.warn.annotationProcessor.dependencies")) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt index a87ab28d191..d6164017ac4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:" @@ -94,7 +95,7 @@ private const val RESULTS_CONFIGURATION_SUFFIX = "Extensions" private fun getDiscoveryClasspathConfigurationName(sourceSetName: String): String = when (sourceSetName) { "main" -> MAIN_CONFIGURATION_NAME - else -> "$sourceSetName${MAIN_CONFIGURATION_NAME.capitalize()}" + else -> "$sourceSetName${MAIN_CONFIGURATION_NAME.capitalizeAsciiOnly()}" } private fun getDiscoveryResultsConfigurationName(sourceSetName: String): String = diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index f86f82aa5c9..a0e46a8750b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated import org.jetbrains.kotlin.statistics.metrics.StringMetrics +import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly open class KotlinJsTargetPreset( project: Project @@ -117,7 +118,7 @@ class KotlinJsSingleTargetPreset( irPreset?.let { super.provideTargetDisambiguationClassifier(target) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY)) - ?.decapitalize() + ?.decapitalizeAsciiOnly() } override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 88d5526c111..99d1b07d1fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated import org.jetbrains.kotlin.statistics.metrics.StringMetrics +import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly open class KotlinJsIrTargetPreset( project: Project @@ -92,7 +93,7 @@ class KotlinJsIrSingleTargetPreset( return if (mixedMode!!) { super.provideTargetDisambiguationClassifier(target) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.IR)) - ?.decapitalize() + ?.decapitalizeAsciiOnly() } else { null } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt index 2adb4079f08..7dec43c7e4b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/DefaultCInteropSettings.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropIdentifier import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.property +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.io.File import javax.inject.Inject @@ -149,7 +150,7 @@ internal class DefaultCInteropSettingsFactory(private val compilation: KotlinCom val params = DefaultCInteropSettings.Params( name = name, identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name), - dependencyConfigurationName = compilation.disambiguateName("${name.capitalize()}CInterop"), + dependencyConfigurationName = compilation.disambiguateName("${name.capitalizeAsciiOnly()}CInterop"), interopProcessingTaskName = lowerCamelCaseName( "cinterop", compilation.name.takeIf { it != "main" }.orEmpty(), @@ -169,7 +170,7 @@ internal class GradleKpmDefaultCInteropSettingsFactory(private val compilation: val params = DefaultCInteropSettings.Params( name = name, identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name), - dependencyConfigurationName = compilation.owner.disambiguateName("${name.capitalize()}CInterop"), + dependencyConfigurationName = compilation.owner.disambiguateName("${name.capitalizeAsciiOnly()}CInterop"), interopProcessingTaskName = lowerCamelCaseName( "cinterop", compilation.compilationPurpose.takeIf { it != "main" }.orEmpty(), diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 1ed8a8bde2d..e3e9bd06102 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.io.File open class KotlinNativeTargetConfigurator : AbstractKotlinTargetConfigurator( @@ -144,7 +145,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl fun configureFatFramework() { val fatFrameworkConfigurationName = lowerCamelCaseName(binary.name, binary.target.konanTarget.family.name.toLowerCase(), "fat") - val fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalize()}" + val fatFrameworkTaskName = "link${fatFrameworkConfigurationName.capitalizeAsciiOnly()}" val fatFrameworkTask = if (fatFrameworkTaskName in tasks.names) { tasks.named(fatFrameworkTaskName, FatFrameworkTask::class.java) @@ -567,7 +568,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl val realProducingTask: TaskProvider<*> // TODO: Someone remove this HACK PLEASE! val realArtifactFile = if (copy) { - realProducingTask = project.project.registerTask("copy${producingTask.name.capitalize()}") { + realProducingTask = project.project.registerTask("copy${producingTask.name.capitalizeAsciiOnly()}") { val targetSubDirectory = compilationInfo.targetDisambiguationClassifier?.let { "$it/" }.orEmpty() it.destinationDir = project.project.buildDir.resolve("libs/$targetSubDirectory${compilationInfo.compilationName}") it.from(artifactFile) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index 39756f31be9..a8081fb0571 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget.* +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.utils.addToStdlib.cast import java.io.File @@ -653,7 +654,7 @@ open class KotlinCocoapodsPlugin : Plugin { task.outputDir = cocoapodsExtension.publishDir task.buildType = buildType task.baseName = cocoapodsExtension.podFrameworkName - task.description = "Produces ${buildType.getName().capitalize()} XCFramework for all requested targets" + task.description = "Produces ${buildType.getName().capitalizeAsciiOnly()} XCFramework for all requested targets" task.group = TASK_GROUP } } @@ -667,7 +668,7 @@ open class KotlinCocoapodsPlugin : Plugin { with(project) { val task = tasks.register(lowerCamelCaseName(POD_FRAMEWORK_PREFIX, "spec", buildType.getName()), PodspecTask::class.java) { task -> - task.description = "Generates podspec for ${buildType.getName().capitalize()} XCFramework publishing" + task.description = "Generates podspec for ${buildType.getName().capitalizeAsciiOnly()} XCFramework publishing" task.outputDir.set(xcFrameworkTask.map { it.outputDir.resolve(it.buildType.getName()) }) task.needPodspec = provider { true } task.publishing.set(true) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt index 9a463cd2a41..aa4ce88172b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.utils.readSystemPropertyAtConfigurationTime +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly /** * Internal service for creating aggregated test tasks and registering all test tasks. @@ -111,7 +112,7 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = " private fun cleanTaskName(taskName: String): String { check(taskName.isNotEmpty()) - return "clean" + taskName.capitalize() + return "clean" + taskName.capitalizeAsciiOnly() } private val Project.cleanAllTestTask: TaskProvider<*> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt index 52e505ca5ef..7120575b533 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.utils +import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.util.* internal fun lowerCamelCaseName(vararg nameParts: String?): String { @@ -12,7 +13,7 @@ internal fun lowerCamelCaseName(vararg nameParts: String?): String { return nonEmptyParts.drop(1).joinToString( separator = "", prefix = nonEmptyParts.firstOrNull().orEmpty(), - transform = String::capitalize + transform = String::capitalizeAsciiOnly ) }