From c2529a4abb877f5d9634a25b0f1fe2e4e589d1bd Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Sat, 28 Aug 2021 06:40:47 +0000 Subject: [PATCH] HL API: Handle resolve case when source for FirResolvedQualifier is a KtCallExpression. --- .../kotlin/idea/references/FirReferenceResolveHelper.kt | 9 +++------ .../referenceResolve/ResolveClassNameInCallExpression.kt | 6 ++++++ .../ResolveClassNameInCallExpression.txt | 2 ++ .../fir/frontend/api/ReferenceResolveTestGenerated.java | 6 ++++++ 4 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.kt create mode 100644 idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.txt 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 b9caa913b4a..2f4b7b97a38 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 @@ -399,13 +399,10 @@ internal object FirReferenceResolveHelper { val referencedClass = referencedSymbol.fir val referencedSymbolsByFir = listOfNotNull(symbolBuilder.buildSymbol(referencedClass)) val firSourcePsi = fir.source.psi ?: referencedSymbolsByFir - // The source of an `FirResolvedQualifier` is either a KtNamedReferenceExpression or a KtDotQualifiedExpression. In the former case, - // it implies the qualifier is an atomic reference and therefore, it should be identical with the `expression`. In the latter case, - // we need to manually break up the qualified access and resolve individual parts of it because in FIR, the entire qualified access - // is one element. - if (firSourcePsi === expression) return referencedSymbolsByFir - require(firSourcePsi is KtDotQualifiedExpression) + if (firSourcePsi !is KtDotQualifiedExpression) return referencedSymbolsByFir + // When the source of an `FirResolvedQualifier` is a KtDotQualifiedExpression, we need to manually break up the qualified access and + // resolve individual parts of it because in FIR, the entire qualified access is one element. if (referencedClass.isLocal) { // TODO: handle local classes after KT-47135 is fixed return referencedSymbolsByFir diff --git a/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.kt b/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.kt new file mode 100644 index 00000000000..78eb4a5681e --- /dev/null +++ b/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.kt @@ -0,0 +1,6 @@ +class Test + +// The lack of `()` in the constructor call is intentional. The addition of type arguments is also needed so we have a KtCallExpression. +// We want to test finding the symbol for a FirResolvedQualifier (and not a FirFunctionCall) whose source is a KtCallExpression +// (and not a KtSimpleNameExpression). +val t = Test diff --git a/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.txt b/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.txt new file mode 100644 index 00000000000..ddacf7fe83e --- /dev/null +++ b/idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) class Test \ No newline at end of file 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 d842acfc152..696e268932b 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 @@ -378,6 +378,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest runTest("idea/idea-frontend-fir/testData/referenceResolve/ResolveClass.kt"); } + @Test + @TestMetadata("ResolveClassNameInCallExpression.kt") + public void testResolveClassNameInCallExpression() throws Exception { + runTest("idea/idea-frontend-fir/testData/referenceResolve/ResolveClassNameInCallExpression.kt"); + } + @Test @TestMetadata("ResolvePackageInProperty.kt") public void testResolvePackageInProperty() throws Exception {