From 987867fe12999e90047f3abee77ba8215bd13c0c Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 17 Jul 2023 16:20:36 +0200 Subject: [PATCH] [FIR2IR] Fix crash caused by unresolved annotation argument in deserialized class #KT-60181 Fixed --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 6 ++++++ .../org/jetbrains/kotlin/gradle/K2Tests.kt | 17 +++++++++++++++++ .../build.gradle.kts | 14 ++++++++++++++ .../src/main/kotlin/Main.kt | 18 ++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/src/main/kotlin/Main.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index f73cdfe0175..f4624b9a835 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.types.impl.IrErrorClassImpl import org.jetbrains.kotlin.ir.types.impl.IrErrorTypeImpl import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.defaultConstructor @@ -1414,6 +1415,11 @@ class Fir2IrVisitor( } is FirClassReferenceExpression -> { (argument.classTypeRef.coneType.lowerBoundIfFlexible() as? ConeClassLikeType)?.toIrClassSymbol() + // A null value means we have some unresolved code, possibly in a binary dependency that's missing a transitive dependency, + // see KT-60181. + // Returning null will lead to convertToIrExpression(argument) being called below which leads to a crash. + // Instead, we return an error symbol. + ?: IrErrorClassImpl.symbol } else -> null } 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 3ad2f69e91e..3ab540fee13 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 @@ -120,4 +120,21 @@ class CustomK2Tests : KGPBaseTest() { } } } + + @GradleTest + @DisplayName("Java binary dependency class contains unresolved annotation argument. KT-60181") + fun kt60181JavaDependencyAnnotatedWithUnresolved(gradleVersion: GradleVersion) { + with( + project( + "k2-java-dep-unresolved-annotation-argument", + gradleVersion, + buildOptions = defaultBuildOptions.copy(languageVersion = "2.0"), + ) + ) { + val taskToExecute = ":compileKotlin" + build(taskToExecute) { + assertTasksExecuted(taskToExecute) + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/build.gradle.kts new file mode 100644 index 00000000000..8355cd0c1a6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/build.gradle.kts @@ -0,0 +1,14 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-actuator-autoconfigure:2.7.12") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/src/main/kotlin/Main.kt new file mode 100644 index 00000000000..f911ece122b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-java-dep-unresolved-annotation-argument/src/main/kotlin/Main.kt @@ -0,0 +1,18 @@ +import org.springframework.beans.factory.ObjectProvider +import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration +import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthIndicatorProperties +import org.springframework.boot.actuate.health.HealthContributor +import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider +import javax.sql.DataSource + +class MyDataSourceHealthContributorAutoConfiguration( + metadataProviders: ObjectProvider, +) : DataSourceHealthContributorAutoConfiguration(metadataProviders) { + override fun dbHealthContributor( + dataSources: MutableMap, + dataSourceHealthIndicatorProperties: DataSourceHealthIndicatorProperties, + ): HealthContributor? { + return super.dbHealthContributor(dataSources, dataSourceHealthIndicatorProperties) + } +} +