From aa4ebe199161159965bd16c69606866191f406f8 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Fri, 16 Jun 2023 16:14:41 +0200 Subject: [PATCH] [FIR2IR] Fix NPE on missing built-ins when using old stdlib Specifically, this code was throwing when trying to get the symbol for IntrinsicConstEvaluation which is only available since 1.7. #KT-59151 Fixed --- .../fir/backend/Fir2IrClassifierStorage.kt | 6 ++-- .../org/jetbrains/kotlin/gradle/K2Tests.kt | 11 +++++++ .../k2-mpp-js-old-stdlib/build.gradle.kts | 32 +++++++++++++++++++ .../k2-mpp-js-old-stdlib/gradle.properties | 1 + .../src/jsMain/kotlin/main.kt | 1 + 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/src/jsMain/kotlin/main.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index bd8a400ee81..1e867a50209 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -72,14 +72,16 @@ class Fir2IrClassifierStorage( fun preCacheBuiltinClasses() { for ((classId, irBuiltinSymbol) in typeConverter.classIdToSymbolMap) { - val firClass = classId.toSymbol(session)!!.fir as FirRegularClass + // toSymbol() can return null when using an old stdlib that's missing some types + val firClass = classId.toSymbol(session)?.fir as FirRegularClass? ?: continue val irClass = irBuiltinSymbol.owner classCache[firClass] = irClass processClassHeader(firClass, irClass) declarationStorage.preCacheBuiltinClassMembers(firClass, irClass) } for ((primitiveClassId, primitiveArrayId) in StandardClassIds.primitiveArrayTypeByElementType) { - val firClass = primitiveArrayId.toLookupTag().toSymbol(session)!!.fir as FirRegularClass + // toSymbol() can return null when using an old stdlib that's missing some types + val firClass = primitiveArrayId.toLookupTag().toSymbol(session)?.fir as FirRegularClass? ?: continue val irType = typeConverter.classIdToTypeMap[primitiveClassId] val irClass = irBuiltIns.primitiveArrayForType[irType]!!.owner classCache[firClass] = irClass diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt index 1740dd565b3..bb12e413224 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt @@ -63,6 +63,17 @@ class CustomK2Tests : KGPBaseTest() { } } + @GradleTest + @DisplayName("HMPP compilation with JS target and old stdlib. KT-59151") + fun testHmppCompilationWithJsAndOldStdlib(gradleVersion: GradleVersion) { + with(project("k2-mpp-js-old-stdlib", gradleVersion, buildOptions = defaultBuildOptions.copy(languageVersion = "2.0"))) { + val taskToExecute = ":compileKotlinJs" + build(taskToExecute) { + assertTasksExecuted(taskToExecute) + } + } + } + @GradleTest @DisplayName("Native metadata of intermediate with reference to internal in common. KT-58219") fun nativeMetadataOfIntermediateWithReferenceToInternalInCommon(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/build.gradle.kts new file mode 100644 index 00000000000..91f66110820 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/build.gradle.kts @@ -0,0 +1,32 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask + +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + js { + nodejs() + browser() + } + + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common", "1.6.21")) + } + } + + val jsMain by getting { + dependencies { + implementation(kotlin("stdlib-js", "1.6.21")) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/gradle.properties new file mode 100644 index 00000000000..0480fdcf3dd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/gradle.properties @@ -0,0 +1 @@ +kotlin.stdlib.default.dependency=false \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/src/jsMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/src/jsMain/kotlin/main.kt new file mode 100644 index 00000000000..78e3db2779f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-mpp-js-old-stdlib/src/jsMain/kotlin/main.kt @@ -0,0 +1 @@ +fun main() {} \ No newline at end of file