From e195f0426e981a0c02a990b1009e1c769b27ed31 Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Wed, 22 Sep 2021 15:38:13 -0700 Subject: [PATCH] FIR IDE: add KtExtensionReceiverSymbol This symbol represents the extension receiver of a callable and currently is used as the resolution target of `this` in a callable with extension. --- .../analysis/api/fir/KtSymbolByFirBuilder.kt | 10 ++++ ...tFirSymbolContainingDeclarationProvider.kt | 21 ++++++--- .../KtFirSymbolDeclarationRendererProvider.kt | 15 ++++-- .../references/FirReferenceResolveHelper.kt | 16 +++++-- .../symbols/KtFirReceiverParameterSymbol.kt | 46 +++++++++++++++++++ .../analysis/api/fir/symbols/KtFirSymbol.kt | 2 +- .../fir/FirReferenceResolveTestGenerated.java | 24 ++++++++++ .../analysis/api/symbols/KtCallableSymbol.kt | 8 ++++ .../thisExtensionReceiver.txt | 2 + .../thisWithLabelToFunction_caretAtLabel.kt | 5 ++ .../thisWithLabelToFunction_caretAtLabel.txt | 2 + .../thisWithLabelToFunction_caretAtThis.kt | 5 ++ .../thisWithLabelToFunction_caretAtThis.txt | 2 + .../thisWithLabelToProperty_caretAtLabel.kt | 6 +++ .../thisWithLabelToProperty_caretAtLabel.txt | 2 + .../thisWithLabelToProperty_caretAtThis.kt | 6 +++ .../thisWithLabelToProperty_caretAtThis.txt | 2 + 17 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisExtensionReceiver.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 5ff1dc6ae70..71eac338dc2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -56,6 +56,7 @@ internal class KtSymbolByFirBuilder private constructor( override val token: ValidityToken, val withReadOnlyCaching: Boolean, private val symbolsCache: BuilderCache, + private val extensionReceiverSymbolsCache: BuilderCache, private val filesCache: BuilderCache, private val backingFieldCache: BuilderCache, private val typesCache: BuilderCache, @@ -82,6 +83,7 @@ internal class KtSymbolByFirBuilder private constructor( resolveState = resolveState, withReadOnlyCaching = false, symbolsCache = BuilderCache(), + extensionReceiverSymbolsCache = BuilderCache(), typesCache = BuilderCache(), backingFieldCache = BuilderCache(), filesCache = BuilderCache(), @@ -95,6 +97,7 @@ internal class KtSymbolByFirBuilder private constructor( resolveState = newResolveState, withReadOnlyCaching = true, symbolsCache = symbolsCache.createReadOnlyCopy(), + extensionReceiverSymbolsCache = extensionReceiverSymbolsCache.createReadOnlyCopy(), typesCache = typesCache.createReadOnlyCopy(), filesCache = filesCache.createReadOnlyCopy(), backingFieldCache = backingFieldCache.createReadOnlyCopy(), @@ -337,6 +340,13 @@ internal class KtSymbolByFirBuilder private constructor( checkRequirementForBuildingSymbol(fir, fir.isSetter) return symbolsCache.cache(fir) { KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } } + + fun buildExtensionReceiverSymbol(fir: FirCallableDeclaration): KtReceiverParameterSymbol? { + if (fir.receiverTypeRef == null) return null + return extensionReceiverSymbolsCache.cache(fir) { + KtFirReceiverParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + } + } } inner class AnonymousInitializerBuilder { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 6151ef9462a..cae4c996640 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -6,26 +6,35 @@ package org.jetbrains.kotlin.analysis.api.fir.components import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirFakeSourceElementKind -import org.jetbrains.kotlin.fir.FirRealSourceElementKind -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind +import org.jetbrains.kotlin.fir.FirRealSourceElementKind +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtDestructuringDeclaration +import org.jetbrains.kotlin.psi.KtPrimaryConstructor +import org.jetbrains.kotlin.psi.KtProperty internal class KtFirSymbolContainingDeclarationProvider( override val analysisSession: KtFirAnalysisSession, override val token: ValidityToken, ) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent { override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? { + if (symbol is KtReceiverParameterSymbol) { + return (symbol as KtFirReceiverParameterSymbol).firRef.withFir { + firSymbolBuilder.buildSymbol(it) as KtSymbolWithKind + } + } if (symbol is KtPackageSymbol) return null if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null if (symbol is KtCallableSymbol) { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt index 2861e81c6cd..6234089ff58 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt @@ -5,19 +5,21 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationRendererProvider import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.renderer.ConeTypeIdeRenderer import org.jetbrains.kotlin.analysis.api.fir.renderer.FirIdeRenderer +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType -import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.* +import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase internal class KtFirSymbolDeclarationRendererProvider( override val analysisSession: KtFirAnalysisSession, @@ -45,6 +47,13 @@ internal class KtFirSymbolDeclarationRendererProvider( FirIdeRenderer.render(fir, containingFir, options, fir.moduleData.session) } } + is KtFirReceiverParameterSymbol -> { + val containingDeclaration = with(analysisSession) { + symbol.getContainingSymbol() ?: error("expects receiver parameter symbol to return the containing declaration") + } + + "extension receiver of " + render(containingDeclaration, options) + } else -> { error("Unexpected Fir Symbol ${symbol::class.simpleName}") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index 0ca444555b2..8447897911c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitSimpleImportingScope import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession @@ -80,7 +81,11 @@ internal object FirReferenceResolveHelper { return classLikeDeclaration?.buildSymbol(symbolBuilder) } - fun FirReference.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): Collection { + fun FirReference.toTargetSymbol( + session: FirSession, + symbolBuilder: KtSymbolByFirBuilder, + isInLabelReference: Boolean = false + ): Collection { return when (this) { is FirBackingFieldReference -> { listOfNotNull(resolvedSymbol.fir.buildSymbol(symbolBuilder)) @@ -103,7 +108,12 @@ internal object FirReferenceResolveHelper { listOfNotNull(fir.buildSymbol(symbolBuilder)) } is FirThisReference -> { - listOfNotNull(boundSymbol?.fir?.buildSymbol(symbolBuilder)) + val boundSymbol = boundSymbol + when { + !isInLabelReference && boundSymbol is FirCallableSymbol<*> -> + symbolBuilder.callableBuilder.buildExtensionReceiverSymbol(boundSymbol.fir) + else -> boundSymbol?.fir?.buildSymbol(symbolBuilder) + }.let { listOfNotNull(it) } } is FirSuperReference -> { listOfNotNull((superTypeRef as? FirResolvedTypeRef)?.toTargetSymbol(session, symbolBuilder)) @@ -308,7 +318,7 @@ internal object FirReferenceResolveHelper { fir.dispatchReceiver as? FirQualifiedAccessExpression ?: fir.extensionReceiver as FirQualifiedAccessExpression receiver.calleeReference } else fir.calleeReference - return calleeReference.toTargetSymbol(session, symbolBuilder) + return calleeReference.toTargetSymbol(session, symbolBuilder, isInLabelReference = expression is KtLabelReferenceExpression) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt new file mode 100644 index 00000000000..1fbdb09196b --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.symbols + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner +import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.fir.utils.firRef +import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef +import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration + +internal class KtFirReceiverParameterSymbol( + fir: FirCallableDeclaration, + resolveState: FirModuleResolveState, + override val token: ValidityToken, + _builder: KtSymbolByFirBuilder +) : KtReceiverParameterSymbol(), ValidityTokenOwner { + init { + require(fir.receiverTypeRef != null) { "$fir doesn't have an extension receiver." } + } + + private val builder by weakRef(_builder) + internal val firRef = firRef(fir, resolveState) + + override val type: KtTypeAndAnnotations by cached { + firRef.receiverTypeAndAnnotations(builder) ?: throw IllegalStateException("$fir doesn't have an extension receiver.") + } + override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() } + + override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.findPsi(fir.moduleData.session) } + + override fun createPointer(): KtSymbolPointer { + TODO("Probably just create a pointer based on the underlying declaration") + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt index 4c18ac63e8c..5d8af09089c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt @@ -32,7 +32,7 @@ internal fun KtFirSymbol<*>.symbolEquals(other: Any?): Boolean { internal fun KtFirSymbol<*>.symbolHashCode(): Int = firRef.hashCode() * 31 + token.hashCode() -private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (origin) { +internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (origin) { FirDeclarationOrigin.Source -> { when (source?.kind) { FirFakeSourceElementKind.ImplicitConstructor, diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java index 13a468e9d94..9d901d9c17f 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java @@ -492,6 +492,30 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv runTest("analysis/analysis-api/testData/referenceResolve/SyntheticProperty.kt"); } + @Test + @TestMetadata("thisWithLabelToFunction_caretAtLabel.kt") + public void testThisWithLabelToFunction_caretAtLabel() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.kt"); + } + + @Test + @TestMetadata("thisWithLabelToFunction_caretAtThis.kt") + public void testThisWithLabelToFunction_caretAtThis() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.kt"); + } + + @Test + @TestMetadata("thisWithLabelToProperty_caretAtLabel.kt") + public void testThisWithLabelToProperty_caretAtLabel() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.kt"); + } + + @Test + @TestMetadata("thisWithLabelToProperty_caretAtThis.kt") + public void testThisWithLabelToProperty_caretAtThis() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.kt"); + } + @Test @TestMetadata("TopLevelClassVsLocalClassConstructor.kt") public void testTopLevelClassVsLocalClassConstructor() throws Exception { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt index 6cadbb389f2..321073607fb 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt @@ -18,4 +18,12 @@ public abstract class KtCallableSymbol : KtSymbol, KtSymbolWithKind { public abstract val isExtension: Boolean abstract override fun createPointer(): KtSymbolPointer +} + +/** + * Symbol for a receiver parameter of a function or property. For example, consider code `fun String.foo() {...}`, the declaration of + * `String` receiver parameter is such a symbol. + */ +public abstract class KtReceiverParameterSymbol : KtSymbol { + public abstract val type: KtTypeAndAnnotations } \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisExtensionReceiver.txt b/analysis/analysis-api/testData/referenceResolve/thisExtensionReceiver.txt new file mode 100644 index 00000000000..f80669ddde1 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisExtensionReceiver.txt @@ -0,0 +1,2 @@ +Resolved to: +0: extension receiver of fun kotlin.String.foo() \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.kt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.kt new file mode 100644 index 00000000000..0dff1ee3770 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.kt @@ -0,0 +1,5 @@ +class Foo { + fun String.foo() { + this@foo + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.txt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.txt new file mode 100644 index 00000000000..566da18e32c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtLabel.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in Foo) fun kotlin.String.foo() \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.kt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.kt new file mode 100644 index 00000000000..53c55be77f7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.kt @@ -0,0 +1,5 @@ +class Foo { + fun String.foo() { + this@foo + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.txt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.txt new file mode 100644 index 00000000000..f80669ddde1 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToFunction_caretAtThis.txt @@ -0,0 +1,2 @@ +Resolved to: +0: extension receiver of fun kotlin.String.foo() \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.kt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.kt new file mode 100644 index 00000000000..ac3a622d582 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.kt @@ -0,0 +1,6 @@ +class Foo { + val String.foo : Any + get() { + this@foo + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.txt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.txt new file mode 100644 index 00000000000..119fceb0c7f --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtLabel.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in Foo) val kotlin.String.foo: kotlin.Any diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.kt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.kt new file mode 100644 index 00000000000..03e2e387e73 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.kt @@ -0,0 +1,6 @@ +class Foo { + val String.foo : Any + get() { + this@foo + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.txt b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.txt new file mode 100644 index 00000000000..c1ba97c0c9c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/thisWithLabelToProperty_caretAtThis.txt @@ -0,0 +1,2 @@ +Resolved to: +0: extension receiver of val kotlin.String.foo: kotlin.Any