diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceShortener.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceShortener.kt index 3a002fdb06d..014b43f2f9b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceShortener.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceShortener.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtThisExpression internal class KtFe10ReferenceShortener( override val analysisSession: KtFe10AnalysisSession, @@ -41,6 +42,7 @@ internal class KtFe10ReferenceShortener( override val starImportsToAdd: Set get() = emptySet() override val listOfTypeToShortenInfo: List get() = emptyList() override val listOfQualifierToShortenInfo: List get() = emptyList() + override val thisLabelsToShorten: List = emptyList() override val kDocQualifiersToShorten: List> get() = emptyList() override val isEmpty: Boolean get() = true 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 5bdca67275e..7736da70de9 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 @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpressio import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.builder.buildSimpleNamedReference import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError @@ -91,6 +92,7 @@ internal class KtFirReferenceShortener( starImportsToAdd = emptySet(), listOfTypeToShortenInfo = emptyList(), listOfQualifierToShortenInfo = emptyList(), + thisLabelsToShorten = emptyList(), kDocQualifiersToShorten = emptyList(), ) @@ -132,8 +134,8 @@ internal class KtFirReferenceShortener( additionalImports.simpleImports, additionalImports.starImports, collector.typesToShorten.distinctBy { it.element }.map { TypeToShortenInfo(it.element.createSmartPointer(), it.shortenedRef) }, - collector.qualifiersToShorten.distinctBy { it.element } - .map { QualifierToShortenInfo(it.element.createSmartPointer(), it.shortenedRef) }, + collector.qualifiersToShorten.distinctBy { it.element }.map { QualifierToShortenInfo(it.element.createSmartPointer(), it.shortenedRef) }, + collector.labelsToShorten.distinctBy { it.element }.map { ThisLabelToShortenInfo(it.element.createSmartPointer()) }, kDocCollector.kDocQualifiersToShorten.distinctBy { it.element }.map { it.element.createSmartPointer() }, ) } @@ -399,6 +401,13 @@ private class ShortenQualifier( override val importAllInParent: Boolean = false ) : ElementToShorten() +private class ShortenThisLabel( + override val element: KtThisExpression, +) : ElementToShorten() { + override val nameToImport: FqName? = null + override val importAllInParent: Boolean = false +} + /** * N.B. Does not subclass [ElementToShorten] because currently * there's no reason to do that. @@ -467,6 +476,12 @@ private class CollectingVisitor(private val collector: ElementsToShortenCollecto collector.processPropertyAccess(propertyAccessExpression) } + + override fun visitThisReference(thisReference: FirThisReference) { + super.visitThisReference(thisReference) + + collector.processThisReference(thisReference) + } } private class ElementsToShortenCollector( @@ -480,6 +495,7 @@ private class ElementsToShortenCollector( ) { val typesToShorten: MutableList = mutableListOf() val qualifiersToShorten: MutableList = mutableListOf() + val labelsToShorten: MutableList = mutableListOf() fun processTypeRef(resolvedTypeRef: FirResolvedTypeRef) { val typeElement = resolvedTypeRef.correspondingTypePsi ?: return @@ -859,6 +875,7 @@ private class ElementsToShortenCollector( return when (element) { is KtUserType -> ShortenType(element, shortenedRef, nameToImport, importAllInParent) is KtDotQualifiedExpression -> ShortenQualifier(element, shortenedRef, nameToImport, importAllInParent) + is KtThisExpression -> ShortenThisLabel(element) else -> error("Unexpected ${element::class}") } } @@ -1178,10 +1195,14 @@ private class ElementsToShortenCollector( } private fun canBePossibleToDropReceiver(qualifiedAccess: FirQualifiedAccessExpression): Boolean { - return when { - qualifiedAccess.explicitReceiver is FirThisReceiverExpression -> shortenOptions.removeThis + return when (val explicitReceiver = qualifiedAccess.explicitReceiver) { + is FirThisReceiverExpression -> { + shortenOptions.removeThis && + !explicitReceiver.isImplicit && + explicitReceiver.calleeReference.referencesClosestReceiver() + } - qualifiedAccess.explicitReceiver is FirResolvedQualifier -> qualifiedAccess.extensionReceiver == null + is FirResolvedQualifier -> qualifiedAccess.extensionReceiver == null else -> false } @@ -1219,6 +1240,63 @@ private class ElementsToShortenCollector( return if (deepestQualifier.hasFakeRootPrefix()) createElementToShorten(deepestQualifier) else null } + /** + * Checks whether `this` expression references the closest receiver in the current position. + * + * If it is the case, then we can safely remove the label from it (if it exists). + */ + private fun FirThisReference.referencesClosestReceiver(): Boolean { + require(!isImplicit) { + "It doesn't make sense to handle implicit this references" + } + + if (labelName == null) return true + + val psi = psi as? KtThisExpression ?: return false + val implicitReceivers = towerContextProvider.getClosestAvailableParentContext(psi)?.implicitReceiverStack ?: return false + val closestImplicitReceiver = implicitReceivers.lastOrNull() ?: return false + + return boundSymbol == closestImplicitReceiver.boundSymbol + } + + private fun canBePossibleToDropLabel(thisReference: FirThisReference): Boolean { + return shortenOptions.removeThisLabels && thisReference.labelName != null + } + + /** + * This method intentionally mirrors the appearance + * of the [classShortenStrategy] and [callableShortenStrategy] filters, + * but ATM we don't have a way to properly handle + * [FirThisReference]s through the existing filters. + * + * We need a better way to decide shortening strategy + * for labeled and regular `this` expressions (KT-63555). + */ + private fun thisLabelShortenStrategy(thisReference: FirThisReference): ShortenStrategy { + val referencedSymbol = thisReference.boundSymbol + + val strategy = when (referencedSymbol) { + is FirClassLikeSymbol<*> -> classShortenStrategy(referencedSymbol) + is FirCallableSymbol<*> -> callableShortenStrategy(referencedSymbol) + else -> ShortenStrategy.DO_NOT_SHORTEN + } + + return strategy + } + + fun processThisReference(thisReference: FirThisReference) { + if (!canBePossibleToDropLabel(thisReference)) return + + val labeledThisPsi = thisReference.psi as? KtThisExpression ?: return + if (!labeledThisPsi.inSelection) return + + if (thisLabelShortenStrategy(thisReference) == ShortenStrategy.DO_NOT_SHORTEN) return + + if (thisReference.referencesClosestReceiver()) { + addElementToShorten(createElementToShorten(labeledThisPsi)) + } + } + private fun KtElement.isInsideOf(another: KtElement): Boolean = another.textRange.contains(textRange) /** @@ -1246,6 +1324,7 @@ private class ElementsToShortenCollector( when (elementInfoToShorten) { is ShortenType -> typesToShorten.add(elementInfoToShorten) is ShortenQualifier -> qualifiersToShorten.add(elementInfoToShorten) + is ShortenThisLabel -> labelsToShorten.add(elementInfoToShorten) } } } @@ -1284,6 +1363,9 @@ private class ElementsToShortenCollector( return selectorReference.textRange.intersects(selection) } + private val KtThisExpression.inSelection: Boolean + get() = textRange.intersects(selection) + private val ClassId.outerClassesWithSelf: Sequence get() = generateSequence(this) { it.outerClassId } @@ -1393,6 +1475,7 @@ private class ShortenCommandImpl( override val starImportsToAdd: Set, override val listOfTypeToShortenInfo: List, override val listOfQualifierToShortenInfo: List, + override val thisLabelsToShorten: List, override val kDocQualifiersToShorten: List>, ) : ShortenCommand @@ -1408,5 +1491,6 @@ internal fun KtSimpleNameExpression.getDotQualifiedExpressionForSelector(): KtDo private fun KtElement.getQualifier(): KtElement? = when (this) { is KtUserType -> qualifier is KtDotQualifiedExpression -> receiverExpression + is KtThisExpression -> labelQualifier else -> error("Unexpected ${this::class}") } 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 a2b62c5ab26..e3dc4f73e51 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 @@ -80,6 +80,16 @@ public class FirIdeNormalAnalysisScriptSourceModuleReferenceShortenerTestGenerat 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/thisReference/withLabel") + @TestDataPath("$PROJECT_ROOT") + public class WithLabel { + @Test + public void testAllFilesPresentInWithLabel() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } } @Nested 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 254416b72f0..13a682f7e59 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 @@ -950,6 +950,64 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext 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/thisReference/withLabel") + @TestDataPath("$PROJECT_ROOT") + public class WithLabel { + @Test + public void testAllFilesPresentInWithLabel() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("extensionReceiver.kt") + public void testExtensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.kt"); + } + + @Test + @TestMetadata("extensionReceiver_vs_lambdaReceiver.kt") + public void testExtensionReceiver_vs_lambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.kt"); + } + + @Test + @TestMetadata("extensionReceiver_vs_local.kt") + public void testExtensionReceiver_vs_local() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.kt"); + } + + @Test + @TestMetadata("lambdaReceiver.kt") + public void testLambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.kt"); + } + + @Test + @TestMetadata("lambdaReceiver_vs_lambdaReceiver.kt") + public void testLambdaReceiver_vs_lambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.kt"); + } + + @Test + @TestMetadata("regularClass.kt") + public void testRegularClass() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.kt"); + } + + @Test + @TestMetadata("regularClass_vs_extensionReceiver.kt") + public void testRegularClass_vs_extensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.kt"); + } + + @Test + @TestMetadata("regularClass_vs_innerClass.kt") + public void testRegularClass_vs_innerClass() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.kt"); + } + } } @Nested diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/ShorteningResultsRenderer.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/ShorteningResultsRenderer.kt index 3833efee7ba..9b134d00026 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/ShorteningResultsRenderer.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/ShorteningResultsRenderer.kt @@ -24,6 +24,11 @@ internal object ShorteningResultsRenderer { appendLine("[qualifier] $it${shortenedRef?.let { ref -> " -> $ref" } ?: ""}") } } + shortening.thisLabelsToShorten.forEach { thisLabel -> + thisLabel.labelToShorten.element?.text?.let { + appendLine("[thisLabel] $it") + } + } shortening.kDocQualifiersToShorten.forEach { kdoc -> kdoc.element?.text?.let { appendLine("[kdoc] $it") 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 58b860779c9..b59f7faa8df 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 @@ -950,6 +950,64 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera 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/thisReference/withLabel") + @TestDataPath("$PROJECT_ROOT") + public class WithLabel { + @Test + public void testAllFilesPresentInWithLabel() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("extensionReceiver.kt") + public void testExtensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.kt"); + } + + @Test + @TestMetadata("extensionReceiver_vs_lambdaReceiver.kt") + public void testExtensionReceiver_vs_lambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.kt"); + } + + @Test + @TestMetadata("extensionReceiver_vs_local.kt") + public void testExtensionReceiver_vs_local() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.kt"); + } + + @Test + @TestMetadata("lambdaReceiver.kt") + public void testLambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.kt"); + } + + @Test + @TestMetadata("lambdaReceiver_vs_lambdaReceiver.kt") + public void testLambdaReceiver_vs_lambdaReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.kt"); + } + + @Test + @TestMetadata("regularClass.kt") + public void testRegularClass() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.kt"); + } + + @Test + @TestMetadata("regularClass_vs_extensionReceiver.kt") + public void testRegularClass_vs_extensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.kt"); + } + + @Test + @TestMetadata("regularClass_vs_innerClass.kt") + public void testRegularClass_vs_innerClass() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.kt"); + } + } } @Nested diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt index d5a36d29087..bb8bb49be95 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceShortener.kt @@ -18,19 +18,23 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtThisExpression import org.jetbrains.kotlin.psi.KtUserType /** * @property removeThis If set to `true`, reference shortener will detect redundant `this` qualifiers - * and will collect them to [ShortenCommand.qualifiersToShorten]. + * and will collect them to [ShortenCommand.listOfQualifierToShortenInfo]. + * @property removeThisLabels If set to `true`, reference shortener will detect redundant labels on `this` expressions, + * and will collect them to [ShortenCommand.thisLabelsToShorten] */ public data class ShortenOptions( public val removeThis: Boolean = false, + public val removeThisLabels: Boolean = false, ) { public companion object { public val DEFAULT: ShortenOptions = ShortenOptions() - public val ALL_ENABLED: ShortenOptions = ShortenOptions(removeThis = true) + public val ALL_ENABLED: ShortenOptions = ShortenOptions(removeThis = true, removeThisLabels = true) } } @@ -179,14 +183,26 @@ public data class QualifierToShortenInfo( val shortenedReference: String?, ) +/** + * A class with a reference to [KtThisExpression] with a label qualifier ([KtThisExpression.labelQualifier]) that can be safely removed + * without changing the semantics of the code. + */ +public data class ThisLabelToShortenInfo( + val labelToShorten: SmartPsiElementPointer, +) + public interface ShortenCommand { public val targetFile: SmartPsiElementPointer public val importsToAdd: Set public val starImportsToAdd: Set public val listOfTypeToShortenInfo: List public val listOfQualifierToShortenInfo: List + public val thisLabelsToShorten: List public val kDocQualifiersToShorten: List> public val isEmpty: Boolean - get() = listOfTypeToShortenInfo.isEmpty() && listOfQualifierToShortenInfo.isEmpty() && kDocQualifiersToShorten.isEmpty() + get() = listOfTypeToShortenInfo.isEmpty() && + listOfQualifierToShortenInfo.isEmpty() && + thisLabelsToShorten.isEmpty() && + kDocQualifiersToShorten.isEmpty() } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.kt new file mode 100644 index 00000000000..58700a427a4 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.kt @@ -0,0 +1,9 @@ +package test + +class Regular { + fun one() {} +} + +fun Regular.usage() { + this@usage.one() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.txt new file mode 100644 index 00000000000..a9934d96844 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver.txt @@ -0,0 +1,11 @@ +Before shortening: this@usage.one() +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +[qualifier] this@usage.one() +[thisLabel] this@usage +with SHORTEN_AND_IMPORT: +[qualifier] this@usage.one() +[thisLabel] this@usage +with SHORTEN_AND_STAR_IMPORT: +[qualifier] this@usage.one() +[thisLabel] this@usage diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.kt new file mode 100644 index 00000000000..1a17f24c135 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.kt @@ -0,0 +1,13 @@ +package test + +class Regular { + fun one() {} +} + +fun test(action: Regular.() -> Unit) {} + +fun Regular.usage() { + test { + this@usage.one() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.txt new file mode 100644 index 00000000000..ccc1ecd0951 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_lambdaReceiver.txt @@ -0,0 +1,5 @@ +Before shortening: this@usage.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/withLabel/extensionReceiver_vs_local.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.kt new file mode 100644 index 00000000000..f6a009901f7 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.kt @@ -0,0 +1,11 @@ +package test + +class Regular { + fun one() {} +} + +fun Regular.usage() { + fun Regular.local() { + this@usage.one() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.txt new file mode 100644 index 00000000000..ccc1ecd0951 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/extensionReceiver_vs_local.txt @@ -0,0 +1,5 @@ +Before shortening: this@usage.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/withLabel/lambdaReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.kt new file mode 100644 index 00000000000..9ca8bdd2116 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.kt @@ -0,0 +1,13 @@ +package test + +class Regular { + fun one() {} +} + +fun test(action: Regular.() -> Unit) {} + +fun usage() { + test { + this@test.one() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.txt new file mode 100644 index 00000000000..9a5ab7f0020 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver.txt @@ -0,0 +1,11 @@ +Before shortening: this@test.one() +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +[qualifier] this@test.one() +[thisLabel] this@test +with SHORTEN_AND_IMPORT: +[qualifier] this@test.one() +[thisLabel] this@test +with SHORTEN_AND_STAR_IMPORT: +[qualifier] this@test.one() +[thisLabel] this@test diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.kt new file mode 100644 index 00000000000..95919567272 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.kt @@ -0,0 +1,15 @@ +package test + +class Regular { + fun one() {} +} + +fun test(action: Regular.() -> Unit) {} + +fun usage() { + test { + test r2@{ + this@test.one() + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.txt new file mode 100644 index 00000000000..54ffedac5e8 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/lambdaReceiver_vs_lambdaReceiver.txt @@ -0,0 +1,5 @@ +Before shortening: this@test.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/withLabel/regularClass.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.kt new file mode 100644 index 00000000000..06ea4628c17 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.kt @@ -0,0 +1,9 @@ +package test + +class Regular { + fun one() {} + + fun usage() { + this@Regular.one() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.txt new file mode 100644 index 00000000000..efe30cde173 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass.txt @@ -0,0 +1,11 @@ +Before shortening: this@Regular.one() +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +[qualifier] this@Regular.one() +[thisLabel] this@Regular +with SHORTEN_AND_IMPORT: +[qualifier] this@Regular.one() +[thisLabel] this@Regular +with SHORTEN_AND_STAR_IMPORT: +[qualifier] this@Regular.one() +[thisLabel] this@Regular diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.kt new file mode 100644 index 00000000000..b5f541589f3 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.kt @@ -0,0 +1,13 @@ +package test + +class Other { + fun one() {} +} + +class Regular { + fun one() {} + + fun Other.usage() { + this@Regular.one() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.txt new file mode 100644 index 00000000000..aa9a03fa713 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_extensionReceiver.txt @@ -0,0 +1,5 @@ +Before shortening: this@Regular.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/withLabel/regularClass_vs_innerClass.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.kt new file mode 100644 index 00000000000..47a9ba8540d --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.kt @@ -0,0 +1,11 @@ +package test + +class Regular { + fun one() {} + + inner class Inner { + fun usage() { + this@Regular.one() + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.txt new file mode 100644 index 00000000000..aa9a03fa713 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/thisReference/withLabel/regularClass_vs_innerClass.txt @@ -0,0 +1,5 @@ +Before shortening: this@Regular.one() +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +with SHORTEN_AND_STAR_IMPORT: