From ebe96ec79a22ea9c35fd980dace7aea9017e2d96 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 10 Aug 2021 20:39:21 +0200 Subject: [PATCH] FIR IDE: fix reference resolve with invalid number of type args --- .../coneDiagnosticToFirDiagnostic.kt | 2 +- .../fir/resolve/diagnostics/FirDiagnostics.kt | 17 ++++++++++------- .../references/FirReferenceResolveHelper.kt | 2 +- .../WrongNumberOfTypeArguments3.kt | 2 +- .../WrongNumberOfTypeArguments4.kt | 9 +++++++++ .../WrongNumberOfTypeArguments4.txt | 2 ++ .../api/ReferenceResolveTestGenerated.java | 6 ++++++ 7 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.kt create mode 100644 idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.txt 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 d372f1780d5..0fcbd0057d5 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 @@ -76,7 +76,7 @@ private fun ConeDiagnostic.toFirDiagnostic( is ConeOuterClassArgumentsRequired -> FirErrors.OUTER_CLASS_ARGUMENTS_REQUIRED.createOn(qualifiedAccessSource ?: source, this.symbol) is ConeNoTypeArgumentsOnRhsError -> - FirErrors.NO_TYPE_ARGUMENTS_ON_RHS.createOn(qualifiedAccessSource ?: source, this.desiredCount, this.type) + FirErrors.NO_TYPE_ARGUMENTS_ON_RHS.createOn(qualifiedAccessSource ?: source, this.desiredCount, this.symbol) is ConeSimpleDiagnostic -> when { source.kind is FirFakeSourceElementKind && source.kind != FirFakeSourceElementKind.ReferenceInAtomicQualifiedAccess -> null else -> this.getFactory(source).createOn(qualifiedAccessSource ?: source) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt index d46bbc88722..ebb8da3a224 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/diagnostics/FirDiagnostics.kt @@ -108,20 +108,23 @@ class ConeIllegalAnnotationError(val name: Name) : ConeDiagnostic() { override val reason: String get() = "Not a legal annotation: $name" } -abstract class ConeUnmatchedTypeArgumentsError(val desiredCount: Int, val type: FirClassLikeSymbol<*>) : ConeDiagnostic() +interface ConeUnmatchedTypeArgumentsError { + val desiredCount: Int + val symbol: FirClassLikeSymbol<*> +} class ConeWrongNumberOfTypeArgumentsError( - val desiredCount: Int, - val symbol: FirRegularClassSymbol, + override val desiredCount: Int, + override val symbol: FirRegularClassSymbol, source: FirSourceElement -) : ConeDiagnosticWithSource(source) { +) : ConeDiagnosticWithSource(source), ConeUnmatchedTypeArgumentsError { override val reason: String get() = "Wrong number of type arguments" } class ConeNoTypeArgumentsOnRhsError( - desiredCount: Int, - type: FirClassLikeSymbol<*> -) : ConeUnmatchedTypeArgumentsError(desiredCount, type) { + override val desiredCount: Int, + override val symbol: FirClassLikeSymbol<*> +) : ConeDiagnostic(), ConeUnmatchedTypeArgumentsError { override val reason: String get() = "No type arguments on RHS" } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 72163cf4850..e56381b4d5a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -55,7 +55,7 @@ internal object FirReferenceResolveHelper { val symbol = resolvedSymbol ?: run { val diagnostic = (this as? FirErrorTypeRef)?.diagnostic - (diagnostic as? ConeUnmatchedTypeArgumentsError)?.type + (diagnostic as? ConeUnmatchedTypeArgumentsError)?.symbol } return symbol?.fir?.buildSymbol(symbolBuilder) diff --git a/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments3.kt b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments3.kt index 111db916f43..d0074ea4c03 100644 --- a/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments3.kt +++ b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments3.kt @@ -3,7 +3,7 @@ package foo class CC class DD -val v1 = DDC> +val v1 = DD diff --git a/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.kt b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.kt new file mode 100644 index 00000000000..5d27525af5b --- /dev/null +++ b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.kt @@ -0,0 +1,9 @@ +package foo + +class CC +class DD + +val v1 = DDC> + + + diff --git a/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.txt b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.txt new file mode 100644 index 00000000000..adf8eab4c53 --- /dev/null +++ b/idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in foo) class CC diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/ReferenceResolveTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/ReferenceResolveTestGenerated.java index 1ca10cfec5a..13a9c0f7bfc 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/ReferenceResolveTestGenerated.java +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/ReferenceResolveTestGenerated.java @@ -576,6 +576,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest runTest("idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments3.kt"); } + @Test + @TestMetadata("WrongNumberOfTypeArguments4.kt") + public void testWrongNumberOfTypeArguments4() throws Exception { + runTest("idea/idea-frontend-fir/testData/referenceResolve/WrongNumberOfTypeArguments4.kt"); + } + @Test @TestMetadata("WrongNumberOfTypeArgumentsInSupertype.kt") public void testWrongNumberOfTypeArgumentsInSupertype() throws Exception {