From 1a0be3ee4053c95ea20d6e5ab0e4cb1b4b9ba4cb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 17 Feb 2021 11:13:59 +0300 Subject: [PATCH] Fix FirAnnotationArgumentChecker (String + ... case) #KT-44995 Fixed --- .../nonConstValInAnnotationArgument.fir.txt | 15 +++++++++++++++ .../nonConstValInAnnotationArgument.kt | 8 ++++++++ .../declaration/FirAnnotationArgumentChecker.kt | 3 ++- .../kotlin/fir/symbols/StandardClassIds.kt | 1 + .../collectionLiteralsWithConstants.kt | 1 - 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.fir.txt index fb134019b74..475470bd1dd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.fir.txt @@ -17,3 +17,18 @@ FILE: nonConstValInAnnotationArgument.kt public get(): R|kotlin/Int| @R|Ann|((R|/foo|, R|/foo|.R|kotlin/String.plus|(R|/cnst|.R|kotlin/Any.toString|()))) public final fun test(): R|kotlin/Unit| { } + public final const val A: R|kotlin/String| = String(foo) + public get(): R|kotlin/String| + public final const val B: R|kotlin/Int| = Int(100) + public get(): R|kotlin/Int| + public final annotation class S : R|kotlin/Annotation| { + public constructor(s: R|kotlin/String|): R|S| { + super() + } + + public final val s: R|kotlin/String| = R|/s| + public get(): R|kotlin/String| + + } + @R|S|(R|/A|.R|kotlin/String.plus|(R|/B|)) public final fun foo(): R|kotlin/Unit| { + } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.kt index ae88b8599f9..8a9dfbb7c40 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/nonConstValInAnnotationArgument.kt @@ -11,3 +11,11 @@ const val cnst = 2 ) ) fun test() {} + +const val A = "foo" +const val B = 100 + +annotation class S(val s: String) + +@S(A + B) +fun foo() {} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationArgumentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationArgumentChecker.kt index c0465b574f3..c6648eb6e3f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationArgumentChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationArgumentChecker.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall import org.jetbrains.kotlin.fir.symbols.StandardClassIds +import org.jetbrains.kotlin.fir.symbols.StandardClassIds.primitiveTypesAndString import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.Name @@ -168,7 +169,7 @@ object FirAnnotationArgumentChecker : FirBasicDeclarationChecker() { if (calleeReference.name == PLUS && expClassId != receiverClassId - && (expClassId !in StandardClassIds.primitiveTypes || receiverClassId !in StandardClassIds.primitiveTypes) + && (expClassId !in primitiveTypesAndString || receiverClassId !in primitiveTypesAndString) ) return FirErrors.ANNOTATION_ARGUMENT_MUST_BE_CONST diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt index 6b66168a79a..bf07f94a11f 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt @@ -71,6 +71,7 @@ object StandardClassIds { Byte, Short, Int, Long, Float, Double ) + val primitiveTypesAndString = primitiveTypes + String val primitiveArrayTypeByElementType = primitiveTypes.associate { id -> id to id.shortClassName.primitiveArrayId() } val elementTypeByPrimitiveArrayType = primitiveArrayTypeByElementType.inverseMap() diff --git a/compiler/testData/codegen/box/collectionLiterals/collectionLiteralsWithConstants.kt b/compiler/testData/codegen/box/collectionLiterals/collectionLiteralsWithConstants.kt index 3b1c07084ef..c565aab7244 100644 --- a/compiler/testData/codegen/box/collectionLiterals/collectionLiteralsWithConstants.kt +++ b/compiler/testData/codegen/box/collectionLiterals/collectionLiteralsWithConstants.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR_DIAGNOSTICS // WITH_REFLECT // TARGET_BACKEND: JVM -- GitLab