From f6629084403739036efc1b50b1cf56ab00ad2a0b Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 13 Apr 2023 14:39:38 +0200 Subject: [PATCH] KTIJ-25232 [FIR IDE] Do not shorten properties with non-trivial receiver If property call receiver is something real (like another property or a function call), then it should not be shortened because the semantics might change ^KTIJ-25232 Fixed --- .../api/fir/components/KtFirReferenceShortener.kt | 4 ++++ ...urceModuleReferenceShortenerTestGenerated.java | 12 ++++++++++++ ...urceModuleReferenceShortenerTestGenerated.java | 12 ++++++++++++ .../referenceShortener/selfPropertyChain.kt | 15 +++++++++++++++ .../referenceShortener/selfPropertyChain.txt | 8 ++++++++ .../referenceShortener/selfPropertyChain1.kt | 15 +++++++++++++++ .../referenceShortener/selfPropertyChain1.txt | 8 ++++++++ 7 files changed, 74 insertions(+) create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.txt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt index a65ee884f5a..51f5811c474 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt @@ -874,6 +874,10 @@ private class ElementsToShortenCollector( val availableCallables = shorteningContext.findPropertiesInScopes(scopes, callableSymbol.name) val firPropertyAccess = qualifiedProperty.getOrBuildFir(firResolveSession) as? FirQualifiedAccessExpression ?: return + + // if explicit receiver is a property access or a function call, we cannot shorten it + if (firPropertyAccess.explicitReceiver !is FirResolvedQualifier) return + if (availableCallables.isNotEmpty() && shortenIfAlreadyImported(firPropertyAccess, callableSymbol, referenceExpression)) { addElementToShorten(ShortenQualifier(qualifiedProperty)) return diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java index 80c1a6562f1..0e8f01d5dbd 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java @@ -298,6 +298,18 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/sameTypeNamesWithinSameScopes.kt"); } + @Test + @TestMetadata("selfPropertyChain.kt") + public void testSelfPropertyChain() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt"); + } + + @Test + @TestMetadata("selfPropertyChain1.kt") + public void testSelfPropertyChain1() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt"); + } + @Test @TestMetadata("shortenAlreadyImportedClass.kt") public void testShortenAlreadyImportedClass() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java index de2f13a3ce4..35644ea3e2a 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java @@ -298,6 +298,18 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/sameTypeNamesWithinSameScopes.kt"); } + @Test + @TestMetadata("selfPropertyChain.kt") + public void testSelfPropertyChain() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt"); + } + + @Test + @TestMetadata("selfPropertyChain1.kt") + public void testSelfPropertyChain1() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt"); + } + @Test @TestMetadata("shortenAlreadyImportedClass.kt") public void testShortenAlreadyImportedClass() throws Exception { diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt new file mode 100644 index 00000000000..e92d43b8d59 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.kt @@ -0,0 +1,15 @@ +// FILE: main.kt +package foo + +class Foo { + val self = this + + fun selfFun(): Foo = this + + + fun check() { + self.self + selfFun().self + } + +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.txt new file mode 100644 index 00000000000..d46b1545802 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain.txt @@ -0,0 +1,8 @@ +Before shortening: fun check() { + self.self + selfFun().self + } +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +with SHORTEN_AND_STAR_IMPORT: diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt new file mode 100644 index 00000000000..1fac88e0815 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.kt @@ -0,0 +1,15 @@ +// FILE: main.kt +package foo + +object Foo { + val self = this + + fun selfFun(): Foo = this + + + fun check() { + self.self + selfFun().self + } + +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.txt new file mode 100644 index 00000000000..d46b1545802 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/selfPropertyChain1.txt @@ -0,0 +1,8 @@ +Before shortening: fun check() { + self.self + selfFun().self + } +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +with SHORTEN_AND_STAR_IMPORT: