[K/N] Experimental Char code point constants and functions

Internalize WASM Char code point functions.

As a part of efforts to stabilize Native stdlib.
This commit is contained in:
Abduqodiri Qurbonzoda
2023-04-19 15:19:11 +03:00
committed by Space Team
parent c6eaadb44f
commit b25f3be81b
18 changed files with 153 additions and 49 deletions
@@ -129,7 +129,9 @@ fun main(args: Array<String>) {
addRangesGenerators(nativeGeneratedDir, KotlinTarget.Native)
addOneToOneMappingsGenerators(nativeGeneratedDir, KotlinTarget.Native)
addOneToManyMappingsGenerators(nativeGeneratedDir, KotlinTarget.Native)
stringUppercaseGenerators.add(StringUppercaseGenerator(nativeGeneratedDir.resolve("_StringUppercase.kt"), unicodeDataLines))
stringUppercaseGenerators.add(
StringUppercaseGenerator(nativeGeneratedDir.resolve("_StringUppercase.kt"), unicodeDataLines, KotlinTarget.Native)
)
stringLowercaseGenerators.add(
StringLowercaseGenerator(nativeGeneratedDir.resolve("_StringLowercase.kt"), unicodeDataLines, KotlinTarget.Native)
)
@@ -138,7 +140,9 @@ fun main(args: Array<String>) {
addRangesGenerators(wasmGeneratedDir, KotlinTarget.WASM)
addOneToOneMappingsGenerators(wasmGeneratedDir, KotlinTarget.WASM)
addOneToManyMappingsGenerators(wasmGeneratedDir, KotlinTarget.WASM)
stringUppercaseGenerators.add(StringUppercaseGenerator(wasmGeneratedDir.resolve("_StringUppercase.kt"), unicodeDataLines))
stringUppercaseGenerators.add(
StringUppercaseGenerator(wasmGeneratedDir.resolve("_StringUppercase.kt"), unicodeDataLines, KotlinTarget.WASM)
)
stringLowercaseGenerators.add(
StringLowercaseGenerator(wasmGeneratedDir.resolve("_StringLowercase.kt"), unicodeDataLines, KotlinTarget.WASM)
)
@@ -132,7 +132,7 @@ internal class StringLowercaseGenerator(
}
return low.code
}
""".trimIndent()
""".trimIndent().prependOptInExperimentalNativeApi(target)
private fun isFinalSigmaAt(): String = """
// \p{cased} (\p{case-ignorable})* Sigma !( (\p{case-ignorable})* \p{cased} )
@@ -8,12 +8,14 @@ package generators.unicode.mappings.string
import generators.unicode.SpecialCasingLine
import generators.unicode.UnicodeDataLine
import generators.unicode.writeHeader
import templates.KotlinTarget
import java.io.File
import java.io.FileWriter
internal class StringUppercaseGenerator(
private val outputFile: File,
unicodeDataLines: List<UnicodeDataLine>
unicodeDataLines: List<UnicodeDataLine>,
private val target: KotlinTarget
) : StringCasingGenerator(unicodeDataLines) {
override fun SpecialCasingLine.mapping(): List<String> = uppercaseMapping
@@ -39,7 +41,7 @@ internal class StringUppercaseGenerator(
}
private fun charCount(): String = """
internal fun Int.charCount(): Int = if (this >= Char.MIN_SUPPLEMENTARY_CODE_POINT) 2 else 1
internal fun Int.charCount(): Int = if (this > Char.MAX_VALUE.code) 2 else 1
""".trimIndent()
private fun codePointAt(): String = """
@@ -53,11 +55,11 @@ internal class StringUppercaseGenerator(
}
return high.code
}
""".trimIndent()
""".trimIndent().prependOptInExperimentalNativeApi(target)
private fun appendCodePoint(): String = """
internal fun StringBuilder.appendCodePoint(codePoint: Int) {
if (codePoint < Char.MIN_SUPPLEMENTARY_CODE_POINT) {
if (codePoint <= Char.MAX_VALUE.code) {
append(codePoint.toChar())
} else {
append(Char.MIN_HIGH_SURROGATE + ((codePoint - 0x10000) shr 10))
@@ -101,4 +103,12 @@ internal class StringUppercaseGenerator(
return sb.toString()
}
""".trimIndent()
}
internal fun String.prependOptInExperimentalNativeApi(target: KotlinTarget): String {
return if (target == KotlinTarget.Native) {
"@OptIn(kotlin.experimental.ExperimentalNativeApi::class)\n$this"
} else {
this
}
}