diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnderscoreChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnderscoreChecker.kt index b80e6198042..da40e3e5543 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnderscoreChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnderscoreChecker.kt @@ -10,16 +10,19 @@ import org.jetbrains.kotlin.fir.analysis.checkers.checkUnderscoreDiagnostics import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.isUnderscore import org.jetbrains.kotlin.fir.diagnostics.ConeUnderscoreUsageWithoutBackticks -import org.jetbrains.kotlin.fir.expressions.FirResolvable -import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier -import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.references.toResolvedSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol object FirUnderscoreChecker : FirBasicExpressionChecker() { override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) { when (expression) { is FirResolvable -> { - checkUnderscoreDiagnostics(expression.calleeReference.source, context, reporter, true) + if (diagnosticsCheckNeeded(expression)) { + checkUnderscoreDiagnostics(expression.calleeReference.source, context, reporter, true) + } } is FirResolvedQualifier -> { for (reservedUnderscoreDiagnostic in expression.nonFatalDiagnostics) { @@ -30,4 +33,12 @@ object FirUnderscoreChecker : FirBasicExpressionChecker() { } } } -} \ No newline at end of file + + private fun diagnosticsCheckNeeded(expression: FirResolvable): Boolean { + return when (expression) { + is FirImplicitInvokeCall -> expression.calleeReference.name.asString().isUnderscore + is FirCall -> expression.calleeReference.toResolvedSymbol>()?.callableId?.callableName?.asString()?.isUnderscore == true + else -> true + } + } +} diff --git a/compiler/testData/diagnostics/tests/Underscore.fir.kt b/compiler/testData/diagnostics/tests/Underscore.fir.kt index 0bb33044ab6..181aa579a69 100644 --- a/compiler/testData/diagnostics/tests/Underscore.fir.kt +++ b/compiler/testData/diagnostics/tests/Underscore.fir.kt @@ -2,7 +2,7 @@ import kotlin.Deprecated as ___ -@___("") data class Pair(val x: Int, val y: Int) +@___("") data class Pair(val x: Int, val y: Int) class _<________> val ______ = _() diff --git a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt index 666e2be1836..96f5778df16 100644 --- a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt @@ -54,8 +54,8 @@ fun test() { x10 as _ x10 as Foo<_> - val x12: Foo<@_ Int>? = null - val x13: Foo<@_() Int>? = null + val x12: Foo<@_ Int>? = null + val x13: Foo<@_() Int>? = null val x14: Foo<@Anno(_) Int>? = null val x15: _<_>? = null