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 f14be1f04e3..8e7b450d7b8 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
@@ -102,6 +102,7 @@ internal class KtFirReferenceShortener(
//TODO: collect all usages of available symbols in the file and prevent importing symbols that could introduce name clashes, which
// may alter the meaning of existing code.
val collector = ElementsToShortenCollector(
+ shortenOptions,
context,
towerContext,
selection,
@@ -404,6 +405,7 @@ private class ShortenKDocQualifier(
) : ElementToShorten()
private class ElementsToShortenCollector(
+ private val shortenOptions: ShortenOptions,
private val shorteningContext: FirShorteningContext,
private val towerContextProvider: FirTowerContextProvider,
private val selection: TextRange,
@@ -1138,11 +1140,13 @@ private class ElementsToShortenCollector(
}
private fun canBePossibleToDropReceiver(qualifiedAccess: FirQualifiedAccessExpression): Boolean {
- // we can remove receiver only if it is a qualifier
- if (qualifiedAccess.explicitReceiver !is FirResolvedQualifier) return false
+ return when {
+ qualifiedAccess.explicitReceiver is FirThisReceiverExpression -> shortenOptions.removeThis
- // if there is no extension receiver necessary, then it can be removed
- return qualifiedAccess.extensionReceiver == null
+ qualifiedAccess.explicitReceiver is FirResolvedQualifier -> qualifiedAccess.extensionReceiver == null
+
+ else -> false
+ }
}
private fun findUnambiguousReferencedCallableId(namedReference: FirNamedReference): FirCallableSymbol<*>? {
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerated.java
index ff23be4666d..a2b62c5ab26 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerated.java
@@ -72,6 +72,16 @@ public class FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerat
}
}
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class ThisReference {
+ @Test
+ public void testAllFilesPresentInThisReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference"), Pattern.compile("^(.+)\\.kts$"), null, true);
+ }
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/typeParameters")
@TestDataPath("$PROJECT_ROOT")
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 cd51f691621..9b09e017aaa 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
@@ -816,6 +816,94 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
}
}
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class ThisReference {
+ @Test
+ public void testAllFilesPresentInThisReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("this_extensionFunction_fromExtensionFunction.kt")
+ public void testThis_extensionFunction_fromExtensionFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt")
+ public void testThis_extensionFunction_fromExtensionFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberFunction_fromMemberFunction.kt")
+ public void testThis_memberFunction_fromMemberFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberFunction_fromMemberFunction_conflictWithLocal.kt")
+ public void testThis_memberFunction_fromMemberFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromInit.kt")
+ public void testThis_memberProperty_fromInit() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromInit_conflictWithParameter.kt")
+ public void testThis_memberProperty_fromInit_conflictWithParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction.kt")
+ public void testThis_memberProperty_fromMemberFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunctionWithContextReceiver.kt")
+ public void testThis_memberProperty_fromMemberFunctionWithContextReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_conflictWithLocal.kt")
+ public void testThis_memberProperty_fromMemberFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_conflictWithParameter.kt")
+ public void testThis_memberProperty_fromMemberFunction_conflictWithParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_noConflictWithLocal.kt")
+ public void testThis_memberProperty_fromMemberFunction_noConflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_nullableReceiver.kt")
+ public void testThis_nullableReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("this_safeCall.kt")
+ public void testThis_safeCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.kt");
+ }
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/typeParameters")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceShortenerTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceShortenerTest.kt
index 81c30296360..beeb240fa44 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceShortenerTest.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceShortenerTest.kt
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references
+import org.jetbrains.kotlin.analysis.api.components.ShortenOptions
import org.jetbrains.kotlin.analysis.api.components.ShortenStrategy
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.ShorteningResultsRenderer.renderShorteningResults
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedSingleModuleTest
@@ -30,6 +31,7 @@ abstract class AbstractReferenceShortenerTest : AbstractAnalysisApiBasedSingleMo
ShortenStrategy.values().map { option ->
val shorteningsForOption = collectPossibleReferenceShorteningsInElement(
element,
+ shortenOptions = ShortenOptions.ALL_ENABLED,
classShortenStrategy = { option },
callableShortenStrategy = { option }
)
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 142e614a7c2..627ae598b4a 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
@@ -816,6 +816,94 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
}
}
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class ThisReference {
+ @Test
+ public void testAllFilesPresentInThisReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("this_extensionFunction_fromExtensionFunction.kt")
+ public void testThis_extensionFunction_fromExtensionFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt")
+ public void testThis_extensionFunction_fromExtensionFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberFunction_fromMemberFunction.kt")
+ public void testThis_memberFunction_fromMemberFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberFunction_fromMemberFunction_conflictWithLocal.kt")
+ public void testThis_memberFunction_fromMemberFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromInit.kt")
+ public void testThis_memberProperty_fromInit() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromInit_conflictWithParameter.kt")
+ public void testThis_memberProperty_fromInit_conflictWithParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction.kt")
+ public void testThis_memberProperty_fromMemberFunction() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunctionWithContextReceiver.kt")
+ public void testThis_memberProperty_fromMemberFunctionWithContextReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_conflictWithLocal.kt")
+ public void testThis_memberProperty_fromMemberFunction_conflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_conflictWithParameter.kt")
+ public void testThis_memberProperty_fromMemberFunction_conflictWithParameter() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.kt");
+ }
+
+ @Test
+ @TestMetadata("this_memberProperty_fromMemberFunction_noConflictWithLocal.kt")
+ public void testThis_memberProperty_fromMemberFunction_noConflictWithLocal() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.kt");
+ }
+
+ @Test
+ @TestMetadata("this_nullableReceiver.kt")
+ public void testThis_nullableReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("this_safeCall.kt")
+ public void testThis_safeCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.kt");
+ }
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/typeParameters")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.kt
new file mode 100644
index 00000000000..fa3d4c89a78
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo
+
+fun Foo.one() {}
+
+fun Foo.usage() {
+ this.one()
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.txt
new file mode 100644
index 00000000000..6f432647ff5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one()
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one()
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt
new file mode 100644
index 00000000000..a3bfec5e456
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.kt
@@ -0,0 +1,11 @@
+package test
+
+class Foo
+
+fun Foo.one() {}
+
+fun Foo.usage() {
+ fun one() {}
+
+ this.one()
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.txt
new file mode 100644
index 00000000000..70bd352fbb8
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_extensionFunction_fromExtensionFunction_conflictWithLocal.txt
@@ -0,0 +1,5 @@
+Before shortening: this.one()
+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/thisReference/this_memberFunction_fromMemberFunction.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.kt
new file mode 100644
index 00000000000..f7bcbd6c95b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo {
+ fun one() {}
+
+ fun usage() {
+ this.one()
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.txt
new file mode 100644
index 00000000000..6f432647ff5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one()
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one()
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.kt
new file mode 100644
index 00000000000..37643364069
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.kt
@@ -0,0 +1,11 @@
+package test
+
+class Foo {
+ fun one() {}
+
+ fun usage() {
+ fun one() {}
+
+ this.one()
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.txt
new file mode 100644
index 00000000000..70bd352fbb8
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberFunction_fromMemberFunction_conflictWithLocal.txt
@@ -0,0 +1,5 @@
+Before shortening: this.one()
+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/thisReference/this_memberProperty_fromInit.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.kt
new file mode 100644
index 00000000000..0d6031f795c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo {
+ val one: Int
+
+ init {
+ this.one = 10
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.txt
new file mode 100644
index 00000000000..b234471393f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.kt
new file mode 100644
index 00000000000..308e3bfca0c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo(one: Int) {
+ val one: Int
+
+ init {
+ this.one = one
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.txt
new file mode 100644
index 00000000000..1299a1d7d1a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromInit_conflictWithParameter.txt
@@ -0,0 +1,5 @@
+Before shortening: this.one
+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/thisReference/this_memberProperty_fromMemberFunction.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.kt
new file mode 100644
index 00000000000..9db3547ca7f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo {
+ val one: Int = 10
+
+ fun usage() {
+ this.one
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.txt
new file mode 100644
index 00000000000..b234471393f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.kt
new file mode 100644
index 00000000000..8f775107043
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.kt
@@ -0,0 +1,14 @@
+package test
+
+class Foo {
+ val one: Int = 10
+
+ context(Context)
+ fun usage() {
+ this.one
+ }
+}
+
+class Context {
+ val one: Int = 20
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.txt
new file mode 100644
index 00000000000..b234471393f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunctionWithContextReceiver.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.kt
new file mode 100644
index 00000000000..2cc29f32f85
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.kt
@@ -0,0 +1,11 @@
+package test
+
+class Foo {
+ val one: Int = 10
+
+ fun usage() {
+ val one = 20
+
+ this.one
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.txt
new file mode 100644
index 00000000000..1299a1d7d1a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithLocal.txt
@@ -0,0 +1,5 @@
+Before shortening: this.one
+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/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.kt
new file mode 100644
index 00000000000..80e61492fcc
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo {
+ val one: Int = 10
+
+ fun usage(one: Int) {
+ this.one
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.txt
new file mode 100644
index 00000000000..1299a1d7d1a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_conflictWithParameter.txt
@@ -0,0 +1,5 @@
+Before shortening: this.one
+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/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.kt
new file mode 100644
index 00000000000..d1e37839d0b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.kt
@@ -0,0 +1,11 @@
+package test
+
+class Foo {
+ val one: Int = 10
+
+ fun usage() {
+ this.one
+
+ val one = 20
+ }
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.txt
new file mode 100644
index 00000000000..b234471393f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_memberProperty_fromMemberFunction_noConflictWithLocal.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.kt
new file mode 100644
index 00000000000..c7838341263
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo
+
+fun Foo?.one() {}
+
+fun Foo?.usage() {
+ this.one()
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.txt
new file mode 100644
index 00000000000..6f432647ff5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_nullableReceiver.txt
@@ -0,0 +1,8 @@
+Before shortening: this.one()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[qualifier] this.one()
+with SHORTEN_AND_IMPORT:
+[qualifier] this.one()
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] this.one()
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.kt
new file mode 100644
index 00000000000..53068cfea6c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.kt
@@ -0,0 +1,9 @@
+package test
+
+class Foo
+
+fun Foo.one() {}
+
+fun Foo?.usage() {
+ this?.one()
+}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.txt
new file mode 100644
index 00000000000..43cf983b23b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/this_safeCall.txt
@@ -0,0 +1,5 @@
+Before shortening: this?.one()
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+with SHORTEN_AND_STAR_IMPORT: