diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt index bdf88326a8a..0bb3ba472ec 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirAnnotationSerializer.kt @@ -5,10 +5,13 @@ package org.jetbrains.kotlin.fir.serialization +import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.constant.AnnotationValue import org.jetbrains.kotlin.constant.ConstantValue +import org.jetbrains.kotlin.constant.ErrorValue import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.serialization.constant.ConstValueProvider @@ -50,7 +53,17 @@ class FirAnnotationSerializer( } for ((name, argument) in argumentsMapping) { - addArgument(argument, name) + if (argument !is ErrorValue) { + addArgument(argument, name) + continue + } + + if (!session.languageVersionSettings.getFlag(AnalysisFlags.metadataCompilation)) { + error( + (argument as? ErrorValue.ErrorValueWithMessage)?.message + ?: "Error value after conversion of expression of $name argument" + ) + } } }.build() } diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/ConstantValueUtils.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/ConstantValueUtils.kt index a70826b3d38..cb2ab608b3c 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/ConstantValueUtils.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/constant/ConstantValueUtils.kt @@ -5,18 +5,22 @@ package org.jetbrains.kotlin.fir.serialization.constant +import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.constant.AnnotationValue import org.jetbrains.kotlin.constant.ConstantValue +import org.jetbrains.kotlin.constant.ErrorValue import org.jetbrains.kotlin.constant.KClassValue import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.addToStdlib.runIf internal fun Map.convertToConstantValues( session: FirSession, @@ -25,6 +29,9 @@ internal fun Map.convertToConstantValues( return this.map { (name, firExpression) -> val constantValue = constValueProvider?.findConstantValueFor(firExpression) ?: firExpression.toConstantValue(session, constValueProvider) + ?: runIf(session.languageVersionSettings.getFlag(AnalysisFlags.metadataCompilation)) { + ErrorValue.ErrorValueWithMessage("Constant conversion can be ignored in metadata compilation mode") + } ?: error("Cannot convert expression ${firExpression.render()} to constant") name to constantValue }.toMap() diff --git a/compiler/testData/cli/metadata/kt58139.args b/compiler/testData/cli/metadata/kt58139.args new file mode 100644 index 00000000000..5b28c78e2a3 --- /dev/null +++ b/compiler/testData/cli/metadata/kt58139.args @@ -0,0 +1,7 @@ +$TESTDATA_DIR$/kt58139/common.kt +$TESTDATA_DIR$/kt58139/platform.kt +-Xcommon-sources=$TESTDATA_DIR$/kt58139/common.kt +-language-version +2.0 +-d +$TEMP_DIR$ \ No newline at end of file diff --git a/compiler/testData/cli/metadata/kt58139.out b/compiler/testData/cli/metadata/kt58139.out new file mode 100644 index 00000000000..86ca0241885 --- /dev/null +++ b/compiler/testData/cli/metadata/kt58139.out @@ -0,0 +1,2 @@ +warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features +OK diff --git a/compiler/testData/cli/metadata/kt58139/common.kt b/compiler/testData/cli/metadata/kt58139/common.kt new file mode 100644 index 00000000000..e0d7209916e --- /dev/null +++ b/compiler/testData/cli/metadata/kt58139/common.kt @@ -0,0 +1,8 @@ +// ISSUE: KT-58139 + +annotation class AnnKlass(val arg: String) + +@AnnKlass("lhs" + "rhs") +fun foo() {} + +const val BATCH_SIZE: Int = 16 * 1024 diff --git a/compiler/testData/cli/metadata/kt58139/platform.kt b/compiler/testData/cli/metadata/kt58139/platform.kt new file mode 100644 index 00000000000..6594306309b --- /dev/null +++ b/compiler/testData/cli/metadata/kt58139/platform.kt @@ -0,0 +1,6 @@ +const val DOUBLE_BATCH_SIZE = 2 * BATCH_SIZE + +annotation class A(val value: Int) + +@A(BATCH_SIZE) +fun bar() {} \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index 8fe05509b33..12247798afa 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -1599,6 +1599,11 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/metadata/kotlinPackageWithFir.args"); } + @TestMetadata("kt58139.args") + public void testKt58139() throws Exception { + runTest("compiler/testData/cli/metadata/kt58139.args"); + } + @TestMetadata("lambdaWithReceiver.args") public void testLambdaWithReceiver() throws Exception { runTest("compiler/testData/cli/metadata/lambdaWithReceiver.args");