From 31291fc8fa411eea0267bb0d48222072fecc8c04 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 4 Jan 2024 00:56:58 +0100 Subject: [PATCH] KTIJ-28385 [AA] Support SAM constructors in `computeImportableName` This allows to properly report them as used in `KtFirImportOptimizer` This change will also be important for properly fixing KTIJ-28167, since `computeImportableName` is also used in reference shortener ^KTIJ-28385 Fixed --- .../kotlin/analysis/api/fir/utils/firUtils.kt | 3 +++ ...leAnalysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ ...leAnalysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ ...edSamInterface_constructorCall.importsAnalysis | 6 ++++++ .../usedNestedSamInterface_constructorCall.kt | 15 +++++++++++++++ ...Interface_constructorReference.importsAnalysis | 6 ++++++ ...usedNestedSamInterface_constructorReference.kt | 15 +++++++++++++++ 7 files changed, 69 insertions(+) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.importsAnalysis create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.importsAnalysis create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt index f158399567b..57d28795bde 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt @@ -57,6 +57,9 @@ internal fun KtTypeNullability.toConeNullability() = when (this) { internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSession): FqName? { if (callableId.isLocal) return null + // SAM constructors are synthetic, but can be imported + if (origin is FirDeclarationOrigin.SamConstructor) return callableId.asSingleFqName() + // if classId == null, callable is topLevel val containingClassId = callableId.classId ?: return callableId.asSingleFqName() 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 c7531051772..730d992bf96 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 @@ -232,6 +232,18 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedInvokeOperatorImport.kt"); } + @Test + @TestMetadata("usedNestedSamInterface_constructorCall.kt") + public void testUsedNestedSamInterface_constructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt"); + } + + @Test + @TestMetadata("usedNestedSamInterface_constructorReference.kt") + public void testUsedNestedSamInterface_constructorReference() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt"); + } + @Test @TestMetadata("usedObject_invokeOperator.kt") public void testUsedObject_invokeOperator() 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 9689955467c..ac844fa808e 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 @@ -232,6 +232,18 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedInvokeOperatorImport.kt"); } + @Test + @TestMetadata("usedNestedSamInterface_constructorCall.kt") + public void testUsedNestedSamInterface_constructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt"); + } + + @Test + @TestMetadata("usedNestedSamInterface_constructorReference.kt") + public void testUsedNestedSamInterface_constructorReference() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt"); + } + @Test @TestMetadata("usedObject_invokeOperator.kt") public void testUsedObject_invokeOperator() throws Exception { diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.importsAnalysis b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.importsAnalysis new file mode 100644 index 00000000000..c7eca6bcf2d --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.importsAnalysis @@ -0,0 +1,6 @@ +USED DECLARATIONS: + +Declaration: dependency.Outer.NestedSAM +By names: [NestedSAM] + +UNRESOLVED NAMES: diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt new file mode 100644 index 00000000000..ebb58ab5705 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorCall.kt @@ -0,0 +1,15 @@ +// FILE: main.kt +package test + +import dependency.Outer.NestedSAM + +val handler = NestedSAM {} + +// FILE: dependency.kt +package dependency + +class Outer { + fun interface NestedSAM { + fun method() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.importsAnalysis b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.importsAnalysis new file mode 100644 index 00000000000..c7eca6bcf2d --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.importsAnalysis @@ -0,0 +1,6 @@ +USED DECLARATIONS: + +Declaration: dependency.Outer.NestedSAM +By names: [NestedSAM] + +UNRESOLVED NAMES: diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt new file mode 100644 index 00000000000..1073632c1aa --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedNestedSamInterface_constructorReference.kt @@ -0,0 +1,15 @@ +// FILE: main.kt +package test + +import dependency.Outer.NestedSAM + +val handler = ::NestedSAM + +// FILE: dependency.kt +package dependency + +class Outer { + fun interface NestedSAM { + fun method() + } +} \ No newline at end of file