[Gradle] Replace deprecated String::capitalize with capitalizeAsciiOnly

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
This commit is contained in:
Anton Lakotka
2022-12-07 10:41:39 +01:00
committed by Space Team
parent 7ef858b2fe
commit 1d041b7ef4
11 changed files with 27 additions and 15 deletions
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.gradle.plugin package org.jetbrains.kotlin.gradle.plugin
import java.util.*
enum class KotlinJsCompilerType { enum class KotlinJsCompilerType {
LEGACY, LEGACY,
IR, IR,
@@ -33,5 +35,5 @@ fun String.removeJsCompilerSuffix(compilerType: KotlinJsCompilerType): String {
return truncatedString return truncatedString
} }
return removeSuffix(compilerType.lowerName.capitalize()) return removeSuffix(compilerType.lowerName.capitalize(Locale.ENGLISH))
} }
@@ -13,6 +13,7 @@ import org.gradle.api.plugins.ExtensionAware
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import javax.inject.Inject import javax.inject.Inject
/* /*
@@ -164,7 +165,7 @@ abstract class KotlinNativeBinaryContainer @Inject constructor(
return if (name == suffix) return if (name == suffix)
"" ""
else else
name.substringBeforeLast(suffix.capitalize()) name.substringBeforeLast(suffix.capitalizeAsciiOnly())
} }
// TODO: Remove in 1.3.50. // TODO: Remove in 1.3.50.
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.tasks.configuration.* import org.jetbrains.kotlin.gradle.tasks.configuration.*
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import java.io.ObjectOutputStream import java.io.ObjectOutputStream
@@ -75,7 +76,7 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
fun getKaptConfigurationName(sourceSetName: String): String { fun getKaptConfigurationName(sourceSetName: String): String {
return if (sourceSetName != SourceSet.MAIN_SOURCE_SET_NAME) return if (sourceSetName != SourceSet.MAIN_SOURCE_SET_NAME)
"$MAIN_KAPT_CONFIGURATION_NAME${sourceSetName.capitalize()}" "$MAIN_KAPT_CONFIGURATION_NAME${sourceSetName.capitalizeAsciiOnly()}"
else else
MAIN_KAPT_CONFIGURATION_NAME MAIN_KAPT_CONFIGURATION_NAME
} }
@@ -599,7 +600,7 @@ internal fun registerGeneratedJavaSource(kaptTask: TaskProvider<out KaptTask>, j
internal fun Configuration.getNamedDependencies(): List<Dependency> = allDependencies.filter { it.group != null } internal fun Configuration.getNamedDependencies(): List<Dependency> = allDependencies.filter { it.group != null }
private val ANNOTATION_PROCESSOR = "annotationProcessor" 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) { internal fun checkAndroidAnnotationProcessorDependencyUsage(project: Project) {
if (project.hasProperty("kapt.dont.warn.annotationProcessor.dependencies")) { if (project.hasProperty("kapt.dont.warn.annotationProcessor.dependencies")) {
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:" 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) { private fun getDiscoveryClasspathConfigurationName(sourceSetName: String): String = when (sourceSetName) {
"main" -> MAIN_CONFIGURATION_NAME "main" -> MAIN_CONFIGURATION_NAME
else -> "$sourceSetName${MAIN_CONFIGURATION_NAME.capitalize()}" else -> "$sourceSetName${MAIN_CONFIGURATION_NAME.capitalizeAsciiOnly()}"
} }
private fun getDiscoveryResultsConfigurationName(sourceSetName: String): String = private fun getDiscoveryResultsConfigurationName(sourceSetName: String): String =
@@ -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.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated
import org.jetbrains.kotlin.statistics.metrics.StringMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics
import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly
open class KotlinJsTargetPreset( open class KotlinJsTargetPreset(
project: Project project: Project
@@ -117,7 +118,7 @@ class KotlinJsSingleTargetPreset(
irPreset?.let { irPreset?.let {
super.provideTargetDisambiguationClassifier(target) super.provideTargetDisambiguationClassifier(target)
?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY)) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY))
?.decapitalize() ?.decapitalizeAsciiOnly()
} }
override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator() override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator()
@@ -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.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated
import org.jetbrains.kotlin.statistics.metrics.StringMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics
import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly
open class KotlinJsIrTargetPreset( open class KotlinJsIrTargetPreset(
project: Project project: Project
@@ -92,7 +93,7 @@ class KotlinJsIrSingleTargetPreset(
return if (mixedMode!!) { return if (mixedMode!!) {
super.provideTargetDisambiguationClassifier(target) super.provideTargetDisambiguationClassifier(target)
?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.IR)) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.IR))
?.decapitalize() ?.decapitalizeAsciiOnly()
} else { } else {
null null
} }
@@ -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.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.newInstance
import org.jetbrains.kotlin.gradle.utils.property import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import java.io.File import java.io.File
import javax.inject.Inject import javax.inject.Inject
@@ -149,7 +150,7 @@ internal class DefaultCInteropSettingsFactory(private val compilation: KotlinCom
val params = DefaultCInteropSettings.Params( val params = DefaultCInteropSettings.Params(
name = name, name = name,
identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name), identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name),
dependencyConfigurationName = compilation.disambiguateName("${name.capitalize()}CInterop"), dependencyConfigurationName = compilation.disambiguateName("${name.capitalizeAsciiOnly()}CInterop"),
interopProcessingTaskName = lowerCamelCaseName( interopProcessingTaskName = lowerCamelCaseName(
"cinterop", "cinterop",
compilation.name.takeIf { it != "main" }.orEmpty(), compilation.name.takeIf { it != "main" }.orEmpty(),
@@ -169,7 +170,7 @@ internal class GradleKpmDefaultCInteropSettingsFactory(private val compilation:
val params = DefaultCInteropSettings.Params( val params = DefaultCInteropSettings.Params(
name = name, name = name,
identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name), identifier = CInteropIdentifier(CInteropIdentifier.Scope.create(compilation), name),
dependencyConfigurationName = compilation.owner.disambiguateName("${name.capitalize()}CInterop"), dependencyConfigurationName = compilation.owner.disambiguateName("${name.capitalizeAsciiOnly()}CInterop"),
interopProcessingTaskName = lowerCamelCaseName( interopProcessingTaskName = lowerCamelCaseName(
"cinterop", "cinterop",
compilation.compilationPurpose.takeIf { it != "main" }.orEmpty(), compilation.compilationPurpose.takeIf { it != "main" }.orEmpty(),
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.konan.target.HostManager 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 java.io.File import java.io.File
open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotlinTargetConfigurator<T>( open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotlinTargetConfigurator<T>(
@@ -144,7 +145,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
fun configureFatFramework() { fun configureFatFramework() {
val fatFrameworkConfigurationName = lowerCamelCaseName(binary.name, binary.target.konanTarget.family.name.toLowerCase(), "fat") 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) { val fatFrameworkTask = if (fatFrameworkTaskName in tasks.names) {
tasks.named(fatFrameworkTaskName, FatFrameworkTask::class.java) tasks.named(fatFrameworkTaskName, FatFrameworkTask::class.java)
@@ -567,7 +568,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
val realProducingTask: TaskProvider<*> val realProducingTask: TaskProvider<*>
// TODO: Someone remove this HACK PLEASE! // TODO: Someone remove this HACK PLEASE!
val realArtifactFile = if (copy) { val realArtifactFile = if (copy) {
realProducingTask = project.project.registerTask<Copy>("copy${producingTask.name.capitalize()}") { realProducingTask = project.project.registerTask<Copy>("copy${producingTask.name.capitalizeAsciiOnly()}") {
val targetSubDirectory = compilationInfo.targetDisambiguationClassifier?.let { "$it/" }.orEmpty() val targetSubDirectory = compilationInfo.targetDisambiguationClassifier?.let { "$it/" }.orEmpty()
it.destinationDir = project.project.buildDir.resolve("libs/$targetSubDirectory${compilationInfo.compilationName}") it.destinationDir = project.project.buildDir.resolve("libs/$targetSubDirectory${compilationInfo.compilationName}")
it.from(artifactFile) it.from(artifactFile)
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.HostManager 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.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 org.jetbrains.kotlin.utils.addToStdlib.cast
import java.io.File import java.io.File
@@ -653,7 +654,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
task.outputDir = cocoapodsExtension.publishDir task.outputDir = cocoapodsExtension.publishDir
task.buildType = buildType task.buildType = buildType
task.baseName = cocoapodsExtension.podFrameworkName 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 task.group = TASK_GROUP
} }
} }
@@ -667,7 +668,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
with(project) { with(project) {
val task = val task =
tasks.register(lowerCamelCaseName(POD_FRAMEWORK_PREFIX, "spec", buildType.getName()), PodspecTask::class.java) { 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.outputDir.set(xcFrameworkTask.map { it.outputDir.resolve(it.buildType.getName()) })
task.needPodspec = provider { true } task.needPodspec = provider { true }
task.publishing.set(true) task.publishing.set(true)
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.tasks.locateTask
import org.jetbrains.kotlin.gradle.utils.readSystemPropertyAtConfigurationTime 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. * 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 { private fun cleanTaskName(taskName: String): String {
check(taskName.isNotEmpty()) check(taskName.isNotEmpty())
return "clean" + taskName.capitalize() return "clean" + taskName.capitalizeAsciiOnly()
} }
private val Project.cleanAllTestTask: TaskProvider<*> private val Project.cleanAllTestTask: TaskProvider<*>
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.utils package org.jetbrains.kotlin.gradle.utils
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import java.util.* import java.util.*
internal fun lowerCamelCaseName(vararg nameParts: String?): String { internal fun lowerCamelCaseName(vararg nameParts: String?): String {
@@ -12,7 +13,7 @@ internal fun lowerCamelCaseName(vararg nameParts: String?): String {
return nonEmptyParts.drop(1).joinToString( return nonEmptyParts.drop(1).joinToString(
separator = "", separator = "",
prefix = nonEmptyParts.firstOrNull().orEmpty(), prefix = nonEmptyParts.firstOrNull().orEmpty(),
transform = String::capitalize transform = String::capitalizeAsciiOnly
) )
} }