Skip to content

Commit a57872d

Browse files
committed
Add minimal stdlib for jvm-ir and fix for running function synthetyzed
1 parent 86ee639 commit a57872d

File tree

16 files changed

+814
-144
lines changed

16 files changed

+814
-144
lines changed

compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,11 +1300,14 @@ open class IrFileSerializer(
13001300
(field.initializer?.expression !is IrConst))
13011301
) {
13021302
val initializer = field.initializer?.expression
1303-
if (field.correspondingPropertySymbol?.owner?.isConst == true)
1303+
if (field.correspondingPropertySymbol?.owner?.isConst == true) {
1304+
if (initializer !is IrConst) {
1305+
println("l")
1306+
}
13041307
require(initializer is IrConst) {
13051308
"This is a compiler bug, please report it to https://kotl.in/issue : const val property must have a const initializer:\n${field.render()}"
13061309
}
1307-
1310+
}
13081311
if (initializer != null) {
13091312
proto.initializer = serializeIrExpressionBody(initializer)
13101313
}

compiler/ir/serialization.jklib/src/org/jetbrains/kotlin/ir/backend/jklib/JKlibIrLinker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class JKlibIrLinker(
108108
}
109109
return symbol
110110
}
111-
111+
112112
val funName = idSig.nameSegments.last()
113113
for (declaration in mappedClassSymbols.values.flatMap { it.owner.declarations }) {
114114
if (declaration.getNameWithAssert().asString() == funName) {

compiler/tests-against-klib/build.gradle.kts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,17 @@ val syncStdlib = tasks.register<Sync>("copyStdlib") {
5757
rename { name ->
5858
when {
5959
name.contains("js") && name.endsWith(".klib") -> "stdlib-js.klib"
60-
name.endsWith(".klib") -> "stdlib.klib"
60+
!name.contains("js") && name.endsWith(".klib") -> "stdlib.klib"
6161
name.endsWith(".jar") -> "stdlib.jar"
6262
else -> name
6363
}
6464
}
6565
}
6666

6767
dependencies {
68-
stdlibJvmIr(project(":kotlin-stdlib-jvm-ir-for-test", configuration = "distJKlib"))
68+
//stdlibJvmIr(project(":kotlin-stdlib-jvm-ir-for-test", configuration = "distJKlib"))
69+
stdlibJvmIr(project(":kotlin-stdlib-jvm-ir-for-test", configuration = "distMinimalJKlib"))
70+
6971
stdlibJs(project(":kotlin-stdlib", configuration = "distJsKlib"))
7072
testRuntimeOnly(files(syncStdlib))
7173
}
@@ -83,8 +85,8 @@ tasks.withType<Test>().configureEach {
8385

8486
val stdlibDir = layout.buildDirectory.dir("stdlib-for-test")
8587
doFirst {
86-
systemProperty("kotlin.stdlib.jvm.ir.klib", stdlibDir.get().file("stdlib-js.klib").asFile.absolutePath)
87-
// systemProperty("kotlin.stdlib.jvm.ir.klib", stdlibDir.get().file("stdlib.klib").asFile.absolutePath)
88+
//systemProperty("kotlin.stdlib.jvm.ir.klib", stdlibDir.get().file("stdlib-js.klib").asFile.absolutePath)
89+
systemProperty("kotlin.stdlib.jvm.ir.klib", stdlibDir.get().file("stdlib.klib").asFile.absolutePath)
8890
systemProperty("kotlin.stdlib.jvm.ir.jar", stdlibDir.get().file("stdlib.jar").asFile.absolutePath)
8991
}
9092
}

compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ class KlibMetadataModuleDescriptorFactoryImpl(
5858
storageManager = storageManager,
5959
moduleDescriptor = moduleDescriptor,
6060
configuration = KlibCompilerDeserializationConfiguration(languageVersionSettings),
61-
compositePackageFragmentAddend = runIf(library.isAnyPlatformStdlib) {
62-
functionInterfacePackageFragmentProvider(storageManager, moduleDescriptor)
63-
},
61+
compositePackageFragmentAddend = functionInterfacePackageFragmentProvider(storageManager, moduleDescriptor),
6462
lookupTracker = lookupTracker
6563
)
6664

libraries/stdlib/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ tasks {
643643
archiveAppendix.set("metadata")
644644
}
645645
val jvmJar by existing(Jar::class) {
646-
duplicatesStrategy = DuplicatesStrategy.FAIL
646+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
647647
archiveAppendix.set(null as String?)
648648
manifestAttributes(manifest, "Main", multiRelease = true)
649649
manifest.attributes(mapOf("Implementation-Title" to "kotlin-stdlib"))

libraries/stdlib/jvm-ir-for-test/build.gradle.kts

Lines changed: 148 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ val copySources by tasks.registering(Sync::class) {
4646
}
4747
from(stdlibProjectDir.resolve("jvm/runtime")) {
4848
include("**/*")
49-
exclude("kotlin/jvm/functions/Functions.kt")
5049
into("jvm/runtime")
5150
}
5251
from(stdlibProjectDir.resolve("jvm/builtins")) {
@@ -69,6 +68,120 @@ val copySources by tasks.registering(Sync::class) {
6968

7069
val outputKlib = layout.buildDirectory.file("libs/kotlin-stdlib-jvm-ir.klib")
7170

71+
val copyMinimalSources by tasks.registering(Sync::class) {
72+
dependsOn(":prepare:build.version:writeStdlibVersion")
73+
into(layout.buildDirectory.dir("src/genesis-minimal"))
74+
75+
from("src/stubs/jvm/builtins") {
76+
include("**")
77+
into("jvm/builtins")
78+
}
79+
80+
from("src/stubs") {
81+
include("kotlin/**")
82+
into("common/src")
83+
}
84+
85+
// Common Sources - mirroring jvm-minimal-for-test
86+
from(stdlibProjectDir.resolve("src")) {
87+
include(
88+
"kotlin/Annotation.kt",
89+
"kotlin/Any.kt",
90+
"kotlin/Array.kt",
91+
"kotlin/ArrayIntrinsics.kt",
92+
"kotlin/Arrays.kt",
93+
"kotlin/Boolean.kt",
94+
//"kotlin/Char.kt", // Used via stub in src/stubs/kotlin/Char.kt
95+
"kotlin/CharSequence.kt",
96+
//"kotlin/Collections.kt",
97+
"kotlin/Comparable.kt",
98+
"kotlin/Enum.kt",
99+
"kotlin/Enum.kt",
100+
//"kotlin/enums/EnumEntries.kt", // Used via stub in src/stubs/kotlin/enums/EnumEntries.kt
101+
"kotlin/Function.kt",
102+
"kotlin/Function.kt",
103+
"kotlin/Iterator.kt",
104+
"kotlin/Library.kt",
105+
"kotlin/Nothing.kt",
106+
"kotlin/Number.kt",
107+
//"kotlin/Primitives.kt", // Used via stub in src/stubs/kotlin/Primitives.kt
108+
"kotlin/String.kt",
109+
"kotlin/Throwable.kt",
110+
"kotlin/Unit.kt",
111+
"kotlin/util/Standard.kt",
112+
"kotlin/annotations/Multiplatform.kt",
113+
"kotlin/annotations/WasExperimental.kt",
114+
"kotlin/annotations/ReturnValue.kt",
115+
"kotlin/internal/Annotations.kt",
116+
"kotlin/internal/AnnotationsBuiltin.kt",
117+
"kotlin/concurrent/atomics/AtomicArrays.common.kt",
118+
"kotlin/concurrent/atomics/Atomics.common.kt",
119+
"kotlin/contextParameters/Context.kt",
120+
"kotlin/contextParameters/ContextOf.kt",
121+
"kotlin/contracts/ContractBuilder.kt",
122+
"kotlin/contracts/Effect.kt",
123+
"kotlin/Annotations.kt", // Defines SinceKotlin, Deprecated, etc.
124+
)
125+
into("common/src")
126+
}
127+
128+
129+
from(stdlibProjectDir.resolve("common/src")) {
130+
include(
131+
"kotlin/ExceptionsH.kt",
132+
)
133+
into("common/common")
134+
}
135+
136+
// JVM Sources - mirroring jvm-minimal-for-test
137+
from(stdlibProjectDir.resolve("jvm/runtime")) {
138+
include(
139+
"kotlin/NoWhenBranchMatchedException.kt",
140+
"kotlin/UninitializedPropertyAccessException.kt",
141+
"kotlin/TypeAliases.kt",
142+
"kotlin/text/TypeAliases.kt",
143+
)
144+
into("jvm/runtime")
145+
}
146+
from(stdlibProjectDir.resolve("jvm/src")) {
147+
include(
148+
"kotlin/ArrayIntrinsics.kt",
149+
"kotlin/Unit.kt",
150+
"kotlin/collections/TypeAliases.kt",
151+
"kotlin/enums/EnumEntriesJVM.kt",
152+
"kotlin/io/Serializable.kt",
153+
)
154+
into("jvm/src")
155+
}
156+
157+
from(stdlibProjectDir.resolve("jvm/builtins")) {
158+
include("*.kt")
159+
exclude("Char.kt")
160+
exclude("Primitives.kt")
161+
exclude("Collections.kt")
162+
into("jvm/builtins")
163+
}
164+
165+
166+
167+
// Stub sources - include if they are needed for minimal too, or maybe not?
168+
// jvm-minimal-for-test includes 'jvm-src/minimalAtomics.kt' etc. which are LOCAL to that project.
169+
// jvm-ir-for-test has 'src/stubs/kotlin/jvm/internal/Functions.kt' etc.
170+
// The user said "same srcs", implying the ones from jvm-minimal-for-test?
171+
// Or just the stdlib subset?
172+
// jvm-minimal-for-test has local sources: "jvm-src" and "common-src".
173+
// We probably need to include THOSE local sources from jvm-minimal-for-test if checking "same srcs".
174+
// BUT jvm-ir-for-test might not have access to jvm-minimal-for-test sources easily without path hacking or duplication.
175+
// User said "We can use the full stdlib in the classpath... jvm-minimal only contains kt classes".
176+
// Let's assume for now we just want the subset of STDLIB sources.
177+
// If we need the local stubs from jvm-minimal-for-test, we might need to copy them or reference them.
178+
// Let's copy the stdlib subset first.
179+
180+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
181+
}
182+
183+
val outputMinimalKlib = layout.buildDirectory.file("libs/kotlin-stdlib-jvm-minimal-ir.klib")
184+
72185
// Helper to separate Java compilation
73186
fun createJavaCompilationTask(sourceTask: TaskProvider<Sync>): TaskProvider<Jar> {
74187
val variantName = sourceTask.name.replaceFirstChar { it.uppercase() }
@@ -114,7 +227,8 @@ val jarJava = createJavaCompilationTask(copySources)
114227
fun JavaExec.configureJklibCompilation(
115228
sourceTask: TaskProvider<Sync>,
116229
klibOutput: Provider<RegularFile>,
117-
classpathJar: Provider<RegularFile>
230+
classpathJar: Provider<RegularFile>,
231+
extraClasspath: FileCollection = project.files()
118232
) {
119233
dependsOn(sourceTask)
120234

@@ -148,13 +262,14 @@ fun JavaExec.configureJklibCompilation(
148262

149263
doFirst {
150264
val allFiles = inputs.files.files.filter { it.extension == "kt" }
151-
val jvmFiles = allFiles.filter { it.path.contains("/jvm/") }
152-
val commonFiles = allFiles.filter { it.path.contains("/common/")}
265+
val commonFiles = allFiles.filter { it.path.contains("/common/") }
266+
val jvmFiles = allFiles.filter { !it.path.contains("/common/") }
153267

154268
val jvmSourceFiles = jvmFiles.map { it.absolutePath }
155269
val commonSourceFiles = commonFiles.map { it.absolutePath }
156270

157271
logger.lifecycle("Compiling ${jvmSourceFiles.size} JVM files and ${commonSourceFiles.size} Common files, total ${allFiles.size}")
272+
logger.lifecycle("Running K2JKlibCompiler with Java version: ${System.getProperty("java.version")}")
158273

159274
val outputPath = outputs.files.singleFile.absolutePath
160275

@@ -178,11 +293,12 @@ fun JavaExec.configureJklibCompilation(
178293
"-Xoutput-builtins-metadata",
179294
)
180295

181-
// Add separate Java compilation output and kotlin-reflect to classpath
296+
182297
val kotlinReflectJar = kotlinReflectFileCollection.singleOrNull()
183298
val fullClasspath = listOfNotNull(
184299
classpathJar.get().asFile.absolutePath,
185-
kotlinReflectJar?.absolutePath
300+
kotlinReflectJar?.absolutePath,
301+
extraClasspath.asPath
186302
).joinToString(File.pathSeparator)
187303

188304
args("-classpath", fullClasspath)
@@ -193,18 +309,44 @@ fun JavaExec.configureJklibCompilation(
193309
}
194310

195311
val compileStdlib by tasks.registering(JavaExec::class) {
312+
val javaToolchains = project.extensions.getByType(JavaToolchainService::class.java)
313+
javaLauncher.set(javaToolchains.launcherFor {
314+
languageVersion.set(JavaLanguageVersion.of(8))
315+
})
196316
configureJklibCompilation(copySources, outputKlib, jarJava.flatMap { it.archiveFile })
197317
}
198318

319+
val compileMinimalStdlib by tasks.registering(JavaExec::class) {
320+
val javaToolchains = project.extensions.getByType(JavaToolchainService::class.java)
321+
javaLauncher.set(javaToolchains.launcherFor {
322+
languageVersion.set(JavaLanguageVersion.of(8))
323+
})
324+
// Use the SAME jarJava (full stdlib Java classes) as classpath, as requested.
325+
configureJklibCompilation(copyMinimalSources, outputMinimalKlib, jarJava.flatMap { it.archiveFile }, project.files({ project.findProject(":kotlin-stdlib")?.tasks?.getByName("jvmJar")?.outputs?.files ?: project.files() }))
326+
327+
// Suppress "Actual without expect" errors typical in minimal stdlib (due to missing common sources)
328+
args("-nowarn")
329+
}
330+
199331
// Expose the KLIB artifact
200332
val distJKlib by configurations.creating {
201333
isCanBeConsumed = true
202334
isCanBeResolved = false
203335
}
204336

337+
val distMinimalJKlib by configurations.creating {
338+
isCanBeConsumed = true
339+
isCanBeResolved = false
340+
}
341+
205342
artifacts {
206343
add(distJKlib.name, outputKlib) {
207344
builtBy(compileStdlib)
208345
}
209346
add(distJKlib.name, jarJava)
347+
348+
add(distMinimalJKlib.name, outputMinimalKlib) {
349+
builtBy(compileMinimalStdlib)
350+
}
351+
add(distMinimalJKlib.name, jarJava)
210352
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@file:Suppress("NOTHING_TO_INLINE")
2+
package kotlin
3+
4+
public actual class Char : Comparable<Char> {
5+
public actual companion object {
6+
public actual const val MIN_VALUE: Char = '\u0000'
7+
public actual const val MAX_VALUE: Char = '\uFFFF'
8+
public actual const val MIN_HIGH_SURROGATE: Char = '\uD800'
9+
public actual const val MAX_HIGH_SURROGATE: Char = '\uDBFF'
10+
public actual const val MIN_LOW_SURROGATE: Char = '\uDC00'
11+
public actual const val MAX_LOW_SURROGATE: Char = '\uDFFF'
12+
public actual const val MIN_SURROGATE: Char = '\uD800'
13+
public actual const val MAX_SURROGATE: Char = '\uDFFF'
14+
public actual const val SIZE_BYTES: Int = 2
15+
public actual const val SIZE_BITS: Int = 16
16+
}
17+
public actual override operator fun compareTo(other: Char): Int = 0
18+
public actual override fun equals(other: Any?): Boolean = false
19+
public actual override fun hashCode(): Int = 0
20+
public actual override fun toString(): String = ""
21+
22+
public actual fun toInt(): Int = 0
23+
public actual fun toByte(): Byte = 0.toByte()
24+
public actual fun toShort(): Short = 0.toShort()
25+
public actual fun toLong(): Long = 0L
26+
public actual fun toFloat(): Float = 0.0F
27+
public actual fun toDouble(): Double = 0.0
28+
29+
public actual operator fun plus(other: Int): Char = this
30+
public actual operator fun minus(other: Char): Int = 0
31+
public actual operator fun minus(other: Int): Char = this
32+
public actual operator fun inc(): Char = this
33+
public actual operator fun dec(): Char = this
34+
}

0 commit comments

Comments
 (0)