From 18f617a582c2c79a7d786e814a2de5caa45df719 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Thu, 6 May 2021 00:06:33 +0000 Subject: [PATCH] FIR: Make FirAnnotationArgumentChecker a FirAnnotationCallChecker, to run on all annotation calls, including those inside type annotations. --- .../FirAnnotationArgumentChecker.kt | 21 ++++++++----------- .../fir/checkers/CommonDeclarationCheckers.kt | 1 - .../fir/checkers/CommonExpressionCheckers.kt | 1 + .../modifierApplicability.fir.kt | 4 ++-- 4 files changed, 12 insertions(+), 15 deletions(-) rename compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/{declaration => expression}/FirAnnotationArgumentChecker.kt (76%) 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/expression/FirAnnotationArgumentChecker.kt similarity index 76% rename from compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationArgumentChecker.kt rename to compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationArgumentChecker.kt index 079c9f7413f..0bd9ea62ac2 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/expression/FirAnnotationArgumentChecker.kt @@ -1,11 +1,10 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.fir.analysis.checkers.declaration +package org.jetbrains.kotlin.fir.analysis.checkers.expression -import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.ConstantArgumentKind import org.jetbrains.kotlin.fir.analysis.checkers.checkConstantArguments @@ -14,19 +13,17 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory0 import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn -import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.psi.KtExpression -object FirAnnotationArgumentChecker : FirBasicDeclarationChecker() { - override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { - if (declaration !is FirAnnotationContainer) return - for (declarationOfAnnotation in declaration.annotations) { - for ((arg, _) in declarationOfAnnotation.argumentMapping ?: continue) { - val expression = (arg as? FirNamedArgumentExpression)?.expression ?: arg +object FirAnnotationArgumentChecker : FirAnnotationCallChecker() { + override fun check(expression: FirAnnotationCall, context: CheckerContext, reporter: DiagnosticReporter) { + expression.argumentMapping?.let { + for ((arg, _) in it) { + val argExpression = (arg as? FirNamedArgumentExpression)?.expression ?: arg - checkAnnotationArgumentWithSubElements(expression, context.session, reporter, context) - ?.let { reporter.reportOn(expression.source, it, context) } + checkAnnotationArgumentWithSubElements(argExpression, context.session, reporter, context) + ?.let { reporter.reportOn(argExpression.source, it, context) } } } } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt index 50ea96cf571..15535a6fa66 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirReservedUndersco object CommonDeclarationCheckers : DeclarationCheckers() { override val basicDeclarationCheckers: Set get() = setOf( - FirAnnotationArgumentChecker, FirModifierChecker, FirConflictsChecker, FirConflictingProjectionChecker, diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt index 581bfb529f0..f1e535f3960 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonExpressionCheckers.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirAnonymousFunctionSyn object CommonExpressionCheckers : ExpressionCheckers() { override val annotationCallCheckers: Set get() = setOf( + FirAnnotationArgumentChecker, FirAnnotationUsedAsAnnotationArgumentChecker, ) diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/modifierApplicability.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/modifierApplicability.fir.kt index 3960cbf4e6a..59bfdfb2288 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/modifierApplicability.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/modifierApplicability.fir.kt @@ -22,8 +22,8 @@ typealias Test15 = (@A() suspend () -> Unit)? typealias Test16 = (@A suspend () -> Unit)? typealias Test17 = @A suspend RS.() -> Unit typealias Test18 = (suspend () -> Unit)? -typealias Test19 = (@A({ val x: suspend String? = null; "" }()) suspend () -> Unit)? -typealias Test20 = (@A("".let { val x: suspend String? = null; it }) suspend () -> Unit)? +typealias Test19 = (@A({ val x: suspend String? = null; "" }()) suspend () -> Unit)? +typealias Test20 = (@A("".let { val x: suspend String? = null; it }) suspend () -> Unit)? interface Supertype1 : suspend () -> Unit {