[FIR IDE] Properly handle generic types qualifiers
In code like `foo.Bar<Bazz>`, `Bar<Bazz>` is considered to be `KtCallExpression` from the PSI point ^KT-52779 Fixed
This commit is contained in:
+9
-5
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression
|
import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability
|
import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability
|
||||||
import org.jetbrains.kotlin.resolve.ImportPath
|
import org.jetbrains.kotlin.resolve.ImportPath
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
internal class KtFirImportOptimizer(
|
internal class KtFirImportOptimizer(
|
||||||
@@ -323,11 +324,14 @@ private sealed interface TypeQualifier {
|
|||||||
|
|
||||||
private val dotQualifier: KtDotQualifiedExpression? = qualifier as? KtDotQualifiedExpression
|
private val dotQualifier: KtDotQualifiedExpression? = qualifier as? KtDotQualifiedExpression
|
||||||
|
|
||||||
private val typeNameReference: KtNameReferenceExpression = when (qualifier) {
|
private val typeNameReference: KtNameReferenceExpression = run {
|
||||||
is KtDotQualifiedExpression -> qualifier.selectorExpression as? KtNameReferenceExpression
|
require(qualifier is KtNameReferenceExpression || qualifier is KtDotQualifiedExpression || qualifier is KtCallExpression) {
|
||||||
is KtNameReferenceExpression -> qualifier
|
"Unexpected qualifier '${qualifier.text}' of type '${qualifier::class}'"
|
||||||
else -> null
|
}
|
||||||
} ?: error("Cannot get referenced name from '${qualifier.text}'")
|
|
||||||
|
qualifier.getCalleeExpressionIfAny() as? KtNameReferenceExpression
|
||||||
|
?: error("Cannot get referenced name from '${qualifier.text}'")
|
||||||
|
}
|
||||||
|
|
||||||
override val referencedByName: Name
|
override val referencedByName: Name
|
||||||
get() = typeNameReference.getReferencedNameAsName()
|
get() = typeNameReference.getReferencedNameAsName()
|
||||||
|
|||||||
+12
@@ -58,6 +58,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener
|
|||||||
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedFunctionImports.kt");
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedFunctionImports.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unusedGenericTypeQualifier.kt")
|
||||||
|
public void testUnusedGenericTypeQualifier() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedGenericTypeQualifier.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("unusedInvokeOperatorImport.kt")
|
@TestMetadata("unusedInvokeOperatorImport.kt")
|
||||||
public void testUnusedInvokeOperatorImport() throws Exception {
|
public void testUnusedInvokeOperatorImport() throws Exception {
|
||||||
@@ -82,6 +88,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener
|
|||||||
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedFunctionImport.kt");
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedFunctionImport.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("usedGenericTypeQualifier.kt")
|
||||||
|
public void testUsedGenericTypeQualifier() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedGenericTypeQualifier.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("usedInvokeOperatorAliasedImport.kt")
|
@TestMetadata("usedInvokeOperatorAliasedImport.kt")
|
||||||
public void testUsedInvokeOperatorAliasedImport() throws Exception {
|
public void testUsedInvokeOperatorAliasedImport() throws Exception {
|
||||||
|
|||||||
+12
@@ -58,6 +58,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe
|
|||||||
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedFunctionImports.kt");
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedFunctionImports.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unusedGenericTypeQualifier.kt")
|
||||||
|
public void testUnusedGenericTypeQualifier() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedGenericTypeQualifier.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("unusedInvokeOperatorImport.kt")
|
@TestMetadata("unusedInvokeOperatorImport.kt")
|
||||||
public void testUnusedInvokeOperatorImport() throws Exception {
|
public void testUnusedInvokeOperatorImport() throws Exception {
|
||||||
@@ -82,6 +88,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe
|
|||||||
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedFunctionImport.kt");
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedFunctionImport.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("usedGenericTypeQualifier.kt")
|
||||||
|
public void testUsedGenericTypeQualifier() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedGenericTypeQualifier.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("usedInvokeOperatorAliasedImport.kt")
|
@TestMetadata("usedInvokeOperatorAliasedImport.kt")
|
||||||
public void testUsedInvokeOperatorAliasedImport() throws Exception {
|
public void testUsedInvokeOperatorAliasedImport() throws Exception {
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
dependency.Bar
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// FILE: main.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
import dependency.Bar
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
|
||||||
|
fun usage() {
|
||||||
|
val a = dependency.Bar<MyClass>::foo
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: dependency.kt
|
||||||
|
package dependency
|
||||||
|
|
||||||
|
class Bar<T> {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedGenericTypeQualifier.kt
Vendored
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// FILE: main.kt
|
||||||
|
package test
|
||||||
|
|
||||||
|
import dependency.Bar
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
|
||||||
|
fun usage() {
|
||||||
|
val a = Bar<MyClass>::foo
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: dependency.kt
|
||||||
|
package dependency
|
||||||
|
|
||||||
|
class Bar<T> {
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user