diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt index 1c648b8d3c3..b0cede828f4 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.coneEffects import org.jetbrains.kotlin.fir.contracts.description.ConeCallsEffectDeclaration @@ -73,11 +74,9 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() { ) for ((symbol, leakedPlaces) in leakedSymbols) { - function.contractDescription.source?.let { - reporter.report(FirErrors.LEAKED_IN_PLACE_LAMBDA.on(it, symbol), context) - } + reporter.reportOn(function.contractDescription.source, FirErrors.LEAKED_IN_PLACE_LAMBDA, symbol, context) leakedPlaces.forEach { - reporter.report(FirErrors.LEAKED_IN_PLACE_LAMBDA.on(it, symbol), context) + reporter.reportOn(it, FirErrors.LEAKED_IN_PLACE_LAMBDA, symbol, context) } } @@ -111,10 +110,15 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() { ): Boolean { val foundRange = info[symbol] ?: EventOccurrencesRange.ZERO if (foundRange !in requiredRange) { - function.contractDescription.source?.let { - reporter.report(FirErrors.WRONG_INVOCATION_KIND.on(it, symbol, requiredRange, foundRange), context) - return true - } + reporter.reportOn( + function.contractDescription.source, + FirErrors.WRONG_INVOCATION_KIND, + symbol, + requiredRange, + foundRange, + context + ) + return true } return false } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt index 2a7a6fbf7d0..b268d34555f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt @@ -80,10 +80,8 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec } val kind = info[symbol] ?: EventOccurrencesRange.ZERO if (symbol.fir.isVal && kind.canBeRevisited()) { - node.fir.lValue.source?.let { - reporter.report(FirErrors.VAL_REASSIGNMENT.on(it, symbol), context) - return true - } + reporter.reportOn(node.fir.lValue.source, FirErrors.VAL_REASSIGNMENT, symbol, context) + return true } return false } @@ -109,10 +107,8 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec ): Boolean { val kind = info[symbol] ?: EventOccurrencesRange.ZERO if (!kind.isDefinitelyVisited()) { - node.fir.source?.let { - reporter.report(FirErrors.UNINITIALIZED_VARIABLE.on(it, symbol), context) - return true - } + reporter.reportOn(node.fir.source, FirErrors.UNINITIALIZED_VARIABLE, symbol, context) + return true } return false } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt index bd1f76c1106..d92b1fbe00b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.isSupertypeOf 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.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.coneEffects import org.jetbrains.kotlin.fir.contracts.description.* @@ -63,9 +64,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() { } if (wrongCondition) { - function.contractDescription.source?.let { - reporter.report(FirErrors.WRONG_IMPLIES_CONDITION.on(it), context) - } + reporter.reportOn(function.contractDescription.source, FirErrors.WRONG_IMPLIES_CONDITION, context) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 07b343e54cd..71d959187fd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -567,7 +567,7 @@ fun checkTypeMismatch( if (rValue.isNullLiteral && lValueType.nullability == ConeNullability.NOT_NULL) { reporter.reportOn(rValue.source, FirErrors.NULL_FOR_NONNULL_TYPE, context) } else { - reporter.report(diagnosticFactory.on(source, lValueType, rValueType), context) + reporter.reportOn(source, diagnosticFactory, lValueType, rValueType, context) } } } @@ -617,4 +617,4 @@ fun extractTypeRefAndSourceFromTypeArgument(typeRef: FirTypeRef?, index: Int): P } return null -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt index eddacfb68bc..57ba73c4080 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirClassVarianceChecker.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.extractTypeRefAndSourceFromTypeArgument 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.declarations.* import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toSymbol @@ -116,14 +117,13 @@ object FirClassVarianceChecker : FirClassChecker() { ) { val factory = if (isInAbbreviation) FirErrors.TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE else FirErrors.TYPE_VARIANCE_CONFLICT - reporter.report( - factory.on( - resultSource, - typeParameter.symbol, - typeParameter.variance, - variance, - containingType - ), + reporter.reportOn( + resultSource, + factory, + typeParameter.symbol, + typeParameter.variance, + variance, + containingType, context ) } @@ -167,4 +167,4 @@ object FirClassVarianceChecker : FirClassChecker() { } } } -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirContractChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirContractChecker.kt index 1b0c75b4052..87233a98f76 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirContractChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirContractChecker.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirFunction @@ -30,7 +31,7 @@ object FirContractChecker : FirFunctionChecker() { // TODO: report on fine-grained locations, e.g., ... implies unresolved => report on unresolved, not the entire statement. // but, sometimes, it's just reported on `contract`... - reporter.report(FirErrors.ERROR_IN_CONTRACT_DESCRIPTION.on(statement.source!!, UNEXPECTED_CONSTRUCTION), context) + reporter.reportOn(statement.source, FirErrors.ERROR_IN_CONTRACT_DESCRIPTION, UNEXPECTED_CONSTRUCTION, context) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt index 8b2135c7b96..f3f781af572 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter @@ -23,28 +24,28 @@ object FirInapplicableLateinitChecker : FirPropertyChecker() { when { declaration.isVal -> - reporter.reportOn(declaration.source, "is allowed only on mutable properties", context) + reporter.reportError(declaration.source, "is allowed only on mutable properties", context) declaration.initializer != null -> if (declaration.isLocal) { - reporter.reportOn(declaration.source, "is not allowed on local variables with initializer", context) + reporter.reportError(declaration.source, "is not allowed on local variables with initializer", context) } else { - reporter.reportOn(declaration.source, "is not allowed on properties with initializer", context) + reporter.reportError(declaration.source, "is not allowed on properties with initializer", context) } declaration.delegate != null -> - reporter.reportOn(declaration.source, "is not allowed on delegated properties", context) + reporter.reportError(declaration.source, "is not allowed on delegated properties", context) declaration.isNullable() -> - reporter.reportOn(declaration.source, "is not allowed on properties of a type with nullable upper bound", context) + reporter.reportError(declaration.source, "is not allowed on properties of a type with nullable upper bound", context) declaration.returnTypeRef.coneType.isPrimitiveOrNullablePrimitive -> if (declaration.isLocal) { - reporter.reportOn(declaration.source, "is not allowed on local variables of primitive types", context) + reporter.reportError(declaration.source, "is not allowed on local variables of primitive types", context) } else { - reporter.reportOn(declaration.source, "is not allowed on properties of primitive types", context) + reporter.reportError(declaration.source, "is not allowed on properties of primitive types", context) } declaration.hasGetter() || declaration.hasSetter() -> - reporter.reportOn(declaration.source, "is not allowed on properties with a custom getter or setter", context) + reporter.reportError(declaration.source, "is not allowed on properties with a custom getter or setter", context) } } @@ -56,7 +57,7 @@ object FirInapplicableLateinitChecker : FirPropertyChecker() { private fun FirProperty.hasGetter() = getter != null && getter !is FirDefaultPropertyGetter private fun FirProperty.hasSetter() = setter != null && setter !is FirDefaultPropertySetter - private fun DiagnosticReporter.reportOn(source: FirSourceElement?, target: String, context: CheckerContext) { - source?.let { report(FirErrors.INAPPLICABLE_LATEINIT_MODIFIER.on(it, target), context) } + private fun DiagnosticReporter.reportError(source: FirSourceElement?, target: String, context: CheckerContext) { + reportOn(source, FirErrors.INAPPLICABLE_LATEINIT_MODIFIER, target, context) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberFunctionsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberFunctionsChecker.kt index 701fe180fce..451b8ed3adb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberFunctionsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberFunctionsChecker.kt @@ -41,13 +41,16 @@ object FirMemberFunctionsChecker : FirRegularClassChecker() { val isAbstract = function.isAbstract || hasAbstractModifier if (isAbstract) { if (!containingDeclaration.canHaveAbstractDeclaration) { - reporter.report( - FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(source, function, containingDeclaration), + reporter.reportOn( + source, + FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, + function, + containingDeclaration, context ) } if (function.hasBody) { - reporter.report(FirErrors.ABSTRACT_FUNCTION_WITH_BODY.on(source, function), context) + reporter.reportOn(source, FirErrors.ABSTRACT_FUNCTION_WITH_BODY, function, context) } } val isInsideExpectClass = isInsideExpectClass(containingDeclaration, context) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt index d164dad6716..0fb11bd9faa 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList 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.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.lexer.KtModifierKeywordToken @@ -179,24 +180,24 @@ object FirModifierChecker : FirBasicDeclarationChecker() { private fun DiagnosticReporter.reportRepeatedModifier( modifier: FirModifier<*>, keyword: KtModifierKeywordToken, context: CheckerContext ) { - report(FirErrors.REPEATED_MODIFIER.on(modifier.source, keyword), context) + reportOn(modifier.source, FirErrors.REPEATED_MODIFIER, keyword, context) } private fun DiagnosticReporter.reportRedundantModifier( modifier: FirModifier<*>, firstKeyword: KtModifierKeywordToken, secondKeyword: KtModifierKeywordToken, context: CheckerContext ) { - report(FirErrors.REDUNDANT_MODIFIER.on(modifier.source, firstKeyword, secondKeyword), context) + reportOn(modifier.source, FirErrors.REDUNDANT_MODIFIER, firstKeyword, secondKeyword, context) } private fun DiagnosticReporter.reportDeprecatedModifierPair( modifier: FirModifier<*>, firstKeyword: KtModifierKeywordToken, secondKeyword: KtModifierKeywordToken, context: CheckerContext ) { - report(FirErrors.DEPRECATED_MODIFIER_PAIR.on(modifier.source, firstKeyword, secondKeyword), context) + reportOn(modifier.source, FirErrors.DEPRECATED_MODIFIER_PAIR, firstKeyword, secondKeyword, context) } private fun DiagnosticReporter.reportIncompatibleModifiers( modifier: FirModifier<*>, firstKeyword: KtModifierKeywordToken, secondKeyword: KtModifierKeywordToken, context: CheckerContext ) { - report(FirErrors.INCOMPATIBLE_MODIFIERS.on(modifier.source, firstKeyword, secondKeyword), context) + reportOn(modifier.source, FirErrors.INCOMPATIBLE_MODIFIERS, firstKeyword, secondKeyword, context) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 10e557169f5..4a08424e0ad 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -242,10 +242,8 @@ object FirOverrideChecker : FirClassChecker() { overridden: FirCallableDeclaration<*>, context: CheckerContext ) { - overriding.source?.let { source -> - overridden.containingClass()?.let { containingClass -> - report(FirErrors.OVERRIDING_FINAL_MEMBER.on(source, overridden, containingClass.name), context) - } + overridden.containingClass()?.let { containingClass -> + reportOn(overriding.source, FirErrors.OVERRIDING_FINAL_MEMBER, overridden, containingClass.name, context) } } @@ -254,7 +252,7 @@ object FirOverrideChecker : FirClassChecker() { overridden: FirMemberDeclaration, context: CheckerContext ) { - overriding.source?.let { report(FirErrors.VAR_OVERRIDDEN_BY_VAL.on(it, overriding, overridden), context) } + reportOn(overriding.source, FirErrors.VAR_OVERRIDDEN_BY_VAL, overriding, overridden, context) } private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt index 735a4d02f65..31fc0a0f01c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirFunctionReturnTypeMismatchChecker.kt @@ -35,7 +35,6 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() { val returnExpressionType = resultExpression.typeRef.coneTypeSafe() ?: return if (!isSubtypeForTypeMismatch(typeContext, subtype = returnExpressionType, supertype = functionReturnType)) { - val returnExpressionSource = resultExpression.source ?: return if (resultExpression.isNullLiteral && functionReturnType.nullability == ConeNullability.NOT_NULL) { reporter.reportOn(resultExpression.source, NULL_FOR_NONNULL_TYPE, context) } else { @@ -51,12 +50,16 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() { context ) } else { - reporter.report( - RETURN_TYPE_MISMATCH.on(returnExpressionSource, functionReturnType, returnExpressionType, targetElement), + reporter.reportOn( + resultExpression.source, + RETURN_TYPE_MISMATCH, + functionReturnType, + returnExpressionType, + targetElement, context ) } } } } -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt index 0a5bd2ff499..b9ae5e81991 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt @@ -16,6 +16,7 @@ abstract class DiagnosticReporter { abstract fun report(diagnostic: FirDiagnostic<*>?, context: CheckerContext) } +@OptIn(InternalDiagnosticFactoryMethod::class) fun

DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory0

, @@ -24,6 +25,7 @@ fun

DiagnosticReporter.reportOn( source?.let { report(factory.on(it), context) } } +@OptIn(InternalDiagnosticFactoryMethod::class) fun

DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory1, @@ -33,6 +35,7 @@ fun

DiagnosticReporter.reportOn( source?.let { report(factory.on(it, a), context) } } +@OptIn(InternalDiagnosticFactoryMethod::class) fun

DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory2, @@ -43,6 +46,7 @@ fun

DiagnosticReporter.reportOn( source?.let { report(factory.on(it, a, b), context) } } +@OptIn(InternalDiagnosticFactoryMethod::class) fun

DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory3, @@ -54,6 +58,7 @@ fun

DiagnosticReporter.reportOn( source?.let { report(factory.on(it, a, b, c), context) } } +@OptIn(InternalDiagnosticFactoryMethod::class) fun

DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory4, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt index 09bf47a9735..693522b3dab 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt @@ -16,6 +16,9 @@ import org.jetbrains.kotlin.fir.FirLightSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirSourceElement +@RequiresOptIn("Please use DiagnosticReporter.reportOn method if possible") +annotation class InternalDiagnosticFactoryMethod + sealed class AbstractFirDiagnosticFactory, P : PsiElement>( override val name: String, override val severity: Severity, @@ -44,6 +47,7 @@ class FirDiagnosticFactory0

( ) : AbstractFirDiagnosticFactory, P>(name, severity, positioningStrategy) { override val firRenderer: FirDiagnosticRenderer> = SimpleFirDiagnosticRenderer("") + @InternalDiagnosticFactoryMethod fun on(element: FirSourceElement): FirSimpleDiagnostic<*> { return when (element) { is FirPsiSourceElement<*> -> FirPsiSimpleDiagnostic( @@ -65,6 +69,7 @@ class FirDiagnosticFactory1

( FirDiagnosticRenderers.TO_STRING ) + @InternalDiagnosticFactoryMethod fun on(element: FirSourceElement, a: A): FirDiagnosticWithParameters1<*, A> { return when (element) { is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters1( @@ -87,6 +92,7 @@ class FirDiagnosticFactory2

( FirDiagnosticRenderers.TO_STRING ) + @InternalDiagnosticFactoryMethod fun on(element: FirSourceElement, a: A, b: B): FirDiagnosticWithParameters2<*, A, B> { return when (element) { is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters2( @@ -110,6 +116,7 @@ class FirDiagnosticFactory3

( FirDiagnosticRenderers.TO_STRING ) + @InternalDiagnosticFactoryMethod fun on(element: FirSourceElement, a: A, b: B, c: C): FirDiagnosticWithParameters3<*, A, B, C> { return when (element) { is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters3( @@ -134,6 +141,7 @@ class FirDiagnosticFactory4

( FirDiagnosticRenderers.TO_STRING ) + @InternalDiagnosticFactoryMethod fun on(element: FirSourceElement, a: A, b: B, c: C, d: D): FirDiagnosticWithParameters4<*, A, B, C, D> { return when (element) { is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters4( @@ -149,16 +157,19 @@ private fun incorrectElement(element: FirSourceElement): Nothing { throw IllegalArgumentException("Unknown element type: ${element::class}") } +@InternalDiagnosticFactoryMethod fun

FirDiagnosticFactory0

.on(element: FirSourceElement?): FirSimpleDiagnostic<*>? { return element?.let { on(it) } } +@InternalDiagnosticFactoryMethod fun

FirDiagnosticFactory1.on( element: FirSourceElement?, a: A ): FirDiagnosticWithParameters1<*, A>? { return element?.let { on(it, a) } } +@InternalDiagnosticFactoryMethod fun

FirDiagnosticFactory2.on( element: FirSourceElement?, a: A, @@ -167,6 +178,7 @@ fun

FirDiagnosticFactory2.on( return element?.let { on(it, a, b) } } +@InternalDiagnosticFactoryMethod fun

FirDiagnosticFactory3.on( element: FirSourceElement?, a: A, @@ -176,6 +188,7 @@ fun

FirDiagnosticFactory3.on( return element?.let { on(it, a, b, c) } } +@InternalDiagnosticFactoryMethod fun

FirDiagnosticFactory4.on( element: FirSourceElement?, a: A, @@ -184,4 +197,4 @@ fun

FirDiagnosticFactory4.on( d: D ): FirDiagnosticWithParameters4<*, A, B, C, D>? { return element?.let { on(it, a, b, c, d) } -} \ No newline at end of file +} 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 6f50e18654d..b2fff2217db 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 @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance import org.jetbrains.kotlin.utils.addToStdlib.safeAs +@OptIn(InternalDiagnosticFactoryMethod::class) private fun ConeDiagnostic.toFirDiagnostic( source: FirSourceElement, qualifiedAccessSource: FirSourceElement? @@ -73,7 +74,7 @@ private fun ConeDiagnostic.toFirDiagnostic( FirErrors.NO_TYPE_ARGUMENTS_ON_RHS.on(qualifiedAccessSource ?: source, this.desiredCount, this.type) is ConeSimpleDiagnostic -> when (source.kind) { is FirFakeSourceElementKind -> null - else -> this.getFactory(source)?.on(qualifiedAccessSource ?: source) + else -> this.getFactory(source).on(qualifiedAccessSource ?: source) } is ConeInstanceAccessBeforeSuperCall -> FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL.on(source, this.target) is ConeStubDiagnostic -> null @@ -97,6 +98,7 @@ fun ConeDiagnostic.toFirDiagnostics( } } +@OptIn(InternalDiagnosticFactoryMethod::class) private fun mapUnsafeCallError( candidate: Candidate, rootCause: UnsafeCall, @@ -146,6 +148,7 @@ private fun mapUnsafeCallError( } } +@OptIn(InternalDiagnosticFactoryMethod::class) private fun mapInapplicableCandidateError( diagnostic: ConeInapplicableCandidateError, source: FirSourceElement, @@ -200,7 +203,7 @@ private fun mapInapplicableCandidateError( } } -@OptIn(ExperimentalStdlibApi::class) +@OptIn(ExperimentalStdlibApi::class, InternalDiagnosticFactoryMethod::class) private fun mapSystemHasContradictionError( diagnostic: ConeConstraintSystemHasContradiction, source: FirSourceElement, @@ -244,6 +247,7 @@ private fun mapSystemHasContradictionError( } } +@OptIn(InternalDiagnosticFactoryMethod::class) private fun ConstraintSystemError.toDiagnostic( source: FirSourceElement, qualifiedAccessSource: FirSourceElement?, @@ -327,7 +331,7 @@ private fun ConstraintSystemError.toDiagnostic( private val NewConstraintError.lowerConeType: ConeKotlinType get() = lowerType as ConeKotlinType private val NewConstraintError.upperConeType: ConeKotlinType get() = upperType as ConeKotlinType -private fun ConeSimpleDiagnostic.getFactory(source: FirSourceElement): FirDiagnosticFactory0<*>? { +private fun ConeSimpleDiagnostic.getFactory(source: FirSourceElement): FirDiagnosticFactory0<*> { @Suppress("UNCHECKED_CAST") return when (kind) { DiagnosticKind.Syntax -> FirErrors.SYNTAX diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt index f81957c75c6..46bf950fe93 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt @@ -111,6 +111,7 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes return metaInfo } + @OptIn(InternalDiagnosticFactoryMethod::class) private fun collectSyntaxDiagnostics( testFile: TestFile, firFile: FirFile,