Capitalize/decapitalize only ASCII characters across project

Use {de,}capitalizeAsciiOnly and to{Lower,Upper}CaseAsciiOnly where
possible, and stdlib's functions with Locale.US everywhere else.

Otherwise, if the default system locale is Turkish, the capital latin
letter "I" is transformed in toLowerCase to "ı" (see
https://github.com/JetBrains/kotlin/blob/66bc142f92085047a1ca64f9a291f0496e33dd98/libraries/stdlib/jvm/test/text/StringJVMTest.kt#L119),
which for example breaks the codegen for `intArrayOf` in
KT-25400/KT-43405.

Similarly, lower case latin letter "i" is transformed to "İ".

 #KT-13631 Fixed
 #KT-25400 Fixed
 #KT-43405 Fixed
This commit is contained in:
Alexander Udalov
2020-11-17 20:26:19 +01:00
parent 5d4b0b19d4
commit 77a9d14f93
53 changed files with 173 additions and 121 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
open class FirJvmMangleComputer(
@@ -210,7 +211,7 @@ open class FirJvmMangleComputer(
is ConeStarProjection -> appendSignature(MangleConstant.STAR_MARK)
is ConeKotlinTypeProjection -> {
if (arg.kind != ProjectionKind.INVARIANT) {
appendSignature(arg.kind.name.toLowerCase())
appendSignature(arg.kind.name.toLowerCaseAsciiOnly())
appendSignature(MangleConstant.VARIANCE_SEPARATOR)
}
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance.*
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import java.lang.Deprecated
import java.lang.annotation.Documented
@@ -140,7 +141,7 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement(
val primitiveType = type
val kotlinPrimitiveName = when (val javaName = primitiveType?.typeName?.asString()) {
null -> "Unit"
else -> javaName.capitalize()
else -> javaName.capitalizeAsciiOnly()
}
val classId = StandardClassIds.byName(kotlinPrimitiveName)
@@ -194,7 +195,7 @@ private fun JavaArrayType.toConeKotlinTypeWithoutEnhancement(
)
}
} else {
val javaComponentName = componentType.type?.typeName?.asString()?.capitalize() ?: error("Array of voids")
val javaComponentName = componentType.type?.typeName?.asString()?.capitalizeAsciiOnly() ?: error("Array of voids")
val classId = StandardClassIds.byName(javaComponentName + "Array")
if (forAnnotationValueParameter) {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticNamesProvider
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeAsciiOnly
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
@NoMutableState
@@ -91,7 +92,7 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() {
else -> return emptyList()
}
val withoutPrefix = identifier.removePrefix(prefix)
val withoutPrefixName = Name.identifier(withoutPrefix.decapitalize())
val withoutPrefixName = Name.identifier(withoutPrefix.decapitalizeAsciiOnly())
return if (prefix == SETTER_PREFIX) {
listOf(withoutPrefixName, Name.identifier(IS_PREFIX + withoutPrefix))
} else {
@@ -99,4 +100,3 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() {
}
}
}
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -226,7 +227,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
}
private fun FirMemberDeclaration.modalityAsString(): String {
return modality?.name?.toLowerCase() ?: run {
return modality?.name?.toLowerCaseAsciiOnly() ?: run {
if (this is FirCallableMemberDeclaration<*> && this.isOverride) {
"open?"
} else {
@@ -343,7 +344,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
declaration.renderPhaseIfNeeded()
print(
when (declaration) {
is FirRegularClass -> declaration.classKind.name.toLowerCase().replace("_", " ")
is FirRegularClass -> declaration.classKind.name.toLowerCaseAsciiOnly().replace("_", " ")
is FirTypeAlias -> "typealias"
is FirSimpleFunction -> "fun"
is FirProperty -> {