From bccd7bc04ac4e84e2dbca980d5c7c2a01f4667c2 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 19 Jun 2023 17:18:42 +0200 Subject: [PATCH] KTIJ-25341 [Analysis API] Visit component calls in import optimizer N.B. K2 does not require resolved `componentX` functions for the placeholder variables (`_`), see KT-59504 ^KTIJ-25341 Fixed --- .../fir/components/KtFirImportOptimizer.kt | 5 +++++ ...alysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ ...alysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ ...xtensionFunction_componentOperator.imports | 2 ++ ...usedExtensionFunction_componentOperator.kt | 19 +++++++++++++++++++ ...xtensionFunction_componentOperator.imports | 0 ...usedExtensionFunction_componentOperator.kt | 17 +++++++++++++++++ 7 files changed, 67 insertions(+) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt index 972ce8acdb2..f89aa67dddd 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt @@ -124,6 +124,11 @@ internal class KtFirImportOptimizer( super.visitImplicitInvokeCall(implicitInvokeCall) } + override fun visitComponentCall(componentCall: FirComponentCall) { + processFunctionCall(componentCall) + super.visitComponentCall(componentCall) + } + override fun visitPropertyAccessExpression(propertyAccessExpression: FirPropertyAccessExpression) { processPropertyAccessExpression(propertyAccessExpression) super.visitPropertyAccessExpression(propertyAccessExpression) diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index 094ee81de1c..2553a560bdd 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -64,6 +64,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunctionFromObject_implicitReceiver.kt"); } + @Test + @TestMetadata("unusedExtensionFunction_componentOperator.kt") + public void testUnusedExtensionFunction_componentOperator() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt"); + } + @Test @TestMetadata("unusedFunctionImportedFromObjectSuperClass.kt") public void testUnusedFunctionImportedFromObjectSuperClass() throws Exception { @@ -112,6 +118,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunctionFromObject_implicitReceiver.kt"); } + @Test + @TestMetadata("usedExtensionFunction_componentOperator.kt") + public void testUsedExtensionFunction_componentOperator() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt"); + } + @Test @TestMetadata("usedExtensionFunction_objectReceiver.kt") public void testUsedExtensionFunction_objectReceiver() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index 627177268b6..b733966811a 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -64,6 +64,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunctionFromObject_implicitReceiver.kt"); } + @Test + @TestMetadata("unusedExtensionFunction_componentOperator.kt") + public void testUnusedExtensionFunction_componentOperator() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt"); + } + @Test @TestMetadata("unusedFunctionImportedFromObjectSuperClass.kt") public void testUnusedFunctionImportedFromObjectSuperClass() throws Exception { @@ -112,6 +118,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunctionFromObject_implicitReceiver.kt"); } + @Test + @TestMetadata("usedExtensionFunction_componentOperator.kt") + public void testUsedExtensionFunction_componentOperator() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt"); + } + @Test @TestMetadata("usedExtensionFunction_objectReceiver.kt") public void testUsedExtensionFunction_objectReceiver() throws Exception { diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.imports new file mode 100644 index 00000000000..2f072d9eaff --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.imports @@ -0,0 +1,2 @@ +dependency.component2 +dependency.component3 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt new file mode 100644 index 00000000000..46d5c4cefb8 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedExtensionFunction_componentOperator.kt @@ -0,0 +1,19 @@ +// FILE: main.kt +package test + +import dependency.component1 +import dependency.component2 +import dependency.component3 + +fun usage(target: dependency.Target) { + val (c1, _) = target +} + +// FILE: dependency.kt +package dependency + +class Target + +operator fun Target.component1(): Int = 1 +operator fun Target.component2(): Int = 2 +operator fun Target.component3(): Int = 2 diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.imports new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt new file mode 100644 index 00000000000..ccc4e624718 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedExtensionFunction_componentOperator.kt @@ -0,0 +1,17 @@ +// FILE: main.kt +package test + +import dependency.component1 +import dependency.component2 + +fun usage(target: dependency.Target) { + val (c1, с2) = target +} + +// FILE: dependency.kt +package dependency + +class Target + +operator fun Target.component1(): Int = 1 +operator fun Target.component2(): Int = 2