diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 3a973296ccd..ff02f120695 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3575,6 +3575,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS) { firDiagnostic -> ExplicitTypeArgumentsInPropertyAccessImpl( + firDiagnostic.a, firDiagnostic as KtPsiDiagnostic, token, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 0be47a7c7e2..b06e9efbb79 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2514,6 +2514,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { interface ExplicitTypeArgumentsInPropertyAccess : KtFirDiagnostic { override val diagnosticClass get() = ExplicitTypeArgumentsInPropertyAccess::class + val kind: String } interface LateinitIntrinsicCallOnNonLiteral : KtFirDiagnostic { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 1da6b1d3381..991a428f0b9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3024,6 +3024,7 @@ internal class LocalVariableWithTypeParametersImpl( ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.LocalVariableWithTypeParameters internal class ExplicitTypeArgumentsInPropertyAccessImpl( + override val kind: String, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.ExplicitTypeArgumentsInPropertyAccess diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/propertyAccessWithExplicitTypeArguments.kt b/compiler/fir/analysis-tests/testData/resolve/expresssions/propertyAccessWithExplicitTypeArguments.kt index 2bcfcc3a844..54d8c29398e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/propertyAccessWithExplicitTypeArguments.kt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/propertyAccessWithExplicitTypeArguments.kt @@ -6,19 +6,19 @@ fun f1(x: Int) { val y = 5 val s = "hello" - x - x - y - y - s - s + x + x + y + y + s + s } // Case 2: Simple property val property: Int = 10 fun f2() { - property + property } // Case 3: Simple property with getter @@ -26,7 +26,7 @@ val property2: Int get() = 10 fun f3() { - property2 + property2 } // Case 4: Property with extension and/or context receiver @@ -51,26 +51,26 @@ fun f4() { val receiver = Receiver() receiver.hello1 - receiver.hello1 + receiver.hello1 receiver.hello1() - receiver.hello1 - receiver.hello1 - receiver.hello1 + receiver.hello1 + receiver.hello1 + receiver.hello1 with (ContextImpl()) { hello2 - hello2 + hello2 hello2() - hello2 - hello2 - hello2 + hello2 + hello2 + hello2 receiver.hello3 - receiver.hello3 + receiver.hello3 receiver.hello3() - receiver.hello3 - receiver.hello3 - receiver.hello3 + receiver.hello3 + receiver.hello3 + receiver.hello3 } } @@ -81,6 +81,6 @@ inline val Receiver.helloReified: String fun f5() { val receiver = Receiver() receiver.helloReified - receiver.helloReified - receiver.helloReified + receiver.helloReified + receiver.helloReified } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index c66bcb99825..1fffa1e7187 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1229,7 +1229,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error(PositioningStrategy.ABSTRACT_MODIFIER) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning(PositioningStrategy.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error(PositioningStrategy.TYPE_PARAMETERS_LIST) - val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) + val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) { + parameter("kind") + } val LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL by error() val LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT by error() diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 08888bfbdcd..f4085341987 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -645,7 +645,7 @@ object FirErrors { val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS: KtDiagnosticFactory0 by error0(SourceElementPositioningStrategies.ABSTRACT_MODIFIER) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING: KtDiagnosticFactory0 by warning0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS: KtDiagnosticFactory0 by error0(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) - val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS: KtDiagnosticFactory0 by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) + val EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS: KtDiagnosticFactory1 by error1(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL: KtDiagnosticFactory0 by error0() val LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT: KtDiagnosticFactory0 by error0() val LATEINIT_INTRINSIC_CALL_IN_INLINE_FUNCTION: KtDiagnosticFactory0 by error0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirPropertyAccessTypeArgumentsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirPropertyAccessTypeArgumentsChecker.kt index b182e151a2e..52337d055bb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirPropertyAccessTypeArgumentsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirPropertyAccessTypeArgumentsChecker.kt @@ -20,7 +20,7 @@ object FirPropertyAccessTypeArgumentsChecker : FirPropertyAccessExpressionChecke if (expression.calleeReference !is FirErrorNamedReference) { val hasExplicitTypeArgument = expression.typeArguments.any { it.source != null } if (hasExplicitTypeArgument) { - reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, context) + reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Property", context) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirStandaloneQualifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirStandaloneQualifierChecker.kt index 4ed09dea4e9..230c8616ebf 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirStandaloneQualifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirStandaloneQualifierChecker.kt @@ -27,7 +27,7 @@ object FirStandaloneQualifierChecker : FirResolvedQualifierChecker() { // Note: if it's real Unit, it will be filtered by ClassKind.OBJECT check below in reportErrorOn if (!expression.resolvedType.isUnit) { if (expression.typeArguments.any { it.source != null }) { - reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, context) + reporter.reportOn(expression.source, FirErrors.EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Object", context) } return } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 52386892d8d..146dba950c8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -1979,7 +1979,7 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "Property in primary constructor cannot be declared as abstract.") map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING, "Type parameters for local variables are deprecated.") map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables cannot have type parameters.") - map.put(EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "Property access cannot have explicit type arguments.") + map.put(EXPLICIT_TYPE_ARGUMENTS_IN_PROPERTY_ACCESS, "{0} access cannot have explicit type arguments.", STRING) map.put(LATEINIT_INTRINSIC_CALL_ON_NON_LITERAL, "This declaration can only be called on a property literal (e.g. 'Foo::bar').") map.put(LATEINIT_INTRINSIC_CALL_ON_NON_LATEINIT, "This declaration can only be called on a reference to a 'lateinit' property.") diff --git a/compiler/testData/diagnostics/tests/incompleteCode/incompleteConstructorCall.fir.kt b/compiler/testData/diagnostics/tests/incompleteCode/incompleteConstructorCall.fir.kt index 87885b622f0..ae8e7f42daa 100644 --- a/compiler/testData/diagnostics/tests/incompleteCode/incompleteConstructorCall.fir.kt +++ b/compiler/testData/diagnostics/tests/incompleteCode/incompleteConstructorCall.fir.kt @@ -15,11 +15,11 @@ class Outer { object Obj } -val test = Outer +val test = Outer -val test2 = Outer.Nested +val test2 = Outer.Nested -val test3 = Outer.Inner +val test3 = Outer.Inner val test4 = Outer.Obj