diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationUsedAsAnnotationArgumentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationUsedAsAnnotationArgumentChecker.kt index 5814f0beae1..9ff6c90b968 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationUsedAsAnnotationArgumentChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationUsedAsAnnotationArgumentChecker.kt @@ -10,12 +10,13 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression object FirAnnotationUsedAsAnnotationArgumentChecker : FirAnnotationCallChecker() { override fun check(expression: FirAnnotationCall, context: CheckerContext, reporter: DiagnosticReporter) { val args = expression.argumentList.arguments for (arg in args) { - for (ann in arg.annotations) { + for (ann in ((arg as? FirWrappedArgumentExpression)?.expression ?: arg).annotations) { reporter.reportOn(ann.source, FirErrors.ANNOTATION_USED_AS_ANNOTATION_ARGUMENT, context) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index e106c06d059..bfc45a2a4fe 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -63,6 +63,7 @@ private fun ConeDiagnostic.toFirDiagnostic( is ConeContractDescriptionError -> FirErrors.ERROR_IN_CONTRACT_DESCRIPTION.on(source, this.reason) is ConeTypeParameterSupertype -> FirErrors.SUPERTYPE_NOT_A_CLASS_OR_INTERFACE.on(source, this.reason) is ConeTypeParameterInQualifiedAccess -> null // reported in various checkers instead + is ConeNotAnnotationContainer -> null else -> throw IllegalArgumentException("Unsupported diagnostic type: ${this.javaClass}") } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index d4232082652..5e1485a1ef0 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildAnonymousFunction import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.diagnostics.ConeNotAnnotationContainer import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* @@ -411,10 +412,10 @@ class ExpressionsConverter( } } - return firExpression?.also { - require(it is FirAnnotationContainer) - (it.annotations as MutableList) += firAnnotationList - } ?: buildErrorExpression(null, ConeSimpleDiagnostic("Strange annotated expression: ${firExpression?.render()}", DiagnosticKind.Syntax)) + val result = firExpression ?: buildErrorExpression(null, ConeNotAnnotationContainer(firExpression?.render() ?: "???")) + require(result is FirAnnotationContainer) + (result.annotations as MutableList) += firAnnotationList + return result } /** diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 4a59b7a55af..0e34ba955fb 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter +import org.jetbrains.kotlin.fir.diagnostics.ConeNotAnnotationContainer import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* @@ -2083,15 +2084,10 @@ open class RawFirBuilder( override fun visitAnnotatedExpression(expression: KtAnnotatedExpression, data: Unit): FirElement { val rawResult = expression.baseExpression?.accept(this, data) -// return rawResult ?: buildErrorExpression( -// expression.toFirSourceElement(), -// FirSimpleDiagnostic("Strange annotated expression: ${rawResult?.render()}", DiagnosticKind.Syntax), -// ) - // TODO !!!!!!!! val result = rawResult as? FirAnnotationContainer - ?: return buildErrorExpression( + ?: buildErrorExpression( expression.toFirSourceElement(), - ConeSimpleDiagnostic("Strange annotated expression: ${rawResult?.render()}", DiagnosticKind.Syntax), + ConeNotAnnotationContainer(rawResult?.render() ?: "???") ) expression.extractAnnotationsTo(result.annotations as MutableList) return result diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt index bd2463f8a1b..3fb4a00f289 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt @@ -27,11 +27,13 @@ import org.jetbrains.kotlin.fir.visitors.* @FirBuilderDsl class FirErrorExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { override var source: FirSourceElement? = null + override val annotations: MutableList = mutableListOf() lateinit var diagnostic: ConeDiagnostic override fun build(): FirErrorExpression { return FirErrorExpressionImpl( source, + annotations, diagnostic, ) } @@ -43,9 +45,6 @@ class FirErrorExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBu set(_) { throw IllegalStateException() } - - @Deprecated("Modification of 'annotations' has no impact for FirErrorExpressionBuilder", level = DeprecationLevel.HIDDEN) - override val annotations: MutableList = mutableListOf() } @OptIn(ExperimentalContracts::class) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt index 736fe174eff..0ce7f7ea082 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt @@ -21,21 +21,24 @@ import org.jetbrains.kotlin.fir.visitors.* internal class FirErrorExpressionImpl( override val source: FirSourceElement?, + override val annotations: MutableList, override val diagnostic: ConeDiagnostic, ) : FirErrorExpression() { override var typeRef: FirTypeRef = FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic)) - override val annotations: List get() = emptyList() override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } } override fun transformChildren(transformer: FirTransformer, data: D): FirErrorExpressionImpl { typeRef = typeRef.transform(transformer, data) + transformAnnotations(transformer, data) return this } override fun transformAnnotations(transformer: FirTransformer, data: D): FirErrorExpressionImpl { + annotations.transformInplace(transformer, data) return this } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt index 1d5d6e92df3..eea8e6e36ad 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt @@ -28,7 +28,7 @@ internal class FirErrorLoopImpl( override val diagnostic: ConeDiagnostic, ) : FirErrorLoop() { override var block: FirBlock = FirEmptyExpressionBlock() - override var condition: FirExpression = FirErrorExpressionImpl(source, ConeStubDiagnostic(diagnostic)) + override var condition: FirExpression = FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic)) override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt index b28f54636f3..b1fa3b9a7d3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt @@ -7,6 +7,10 @@ package org.jetbrains.kotlin.fir.diagnostics class ConeSimpleDiagnostic(override val reason: String, val kind: DiagnosticKind = DiagnosticKind.Other) : ConeDiagnostic() +class ConeNotAnnotationContainer(val text: String) : ConeDiagnostic() { + override val reason: String get() = "Strange annotated expression: $text" +} + enum class DiagnosticKind { Syntax, ExpressionExpected, diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 7266595914c..e0df248bf6a 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -128,7 +128,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(errorLoop) { default("block", "FirEmptyExpressionBlock()") - default("condition", "FirErrorExpressionImpl(source, ConeStubDiagnostic(diagnostic))") + default("condition", "FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic))") useTypes(emptyExpressionBlock, coneStubDiagnosticType) } @@ -394,7 +394,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } impl(errorExpression) { - defaultEmptyList("annotations") default("typeRef", "FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic))") useTypes(errorTypeRefImpl, coneStubDiagnosticType) } diff --git a/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.fir.kt b/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.fir.kt deleted file mode 100644 index 03e91388a2e..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -// SKIP_ERRORS_BEFORE - -annotation class X(val value: Y, val y: Y) -annotation class Y() - -@X(@Y(), y = Y()) -fun foo1() { -} -@X(@Y(), y = @Y()) -fun foo2() { -} diff --git a/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.kt b/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.kt index 83e660b68f6..bce44170943 100644 --- a/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.kt +++ b/compiler/testData/diagnostics/tests/annotations/annotatedExpressionInsideAnnotation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // SKIP_ERRORS_BEFORE annotation class X(val value: Y, val y: Y)