diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt index 66611f4170a..0d20ad95e3c 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt @@ -54,6 +54,7 @@ class KtFe10AnalysisSession( override val jvmTypeMapperImpl: KtJvmTypeMapper = KtFe10JvmTypeMapper(this) override val symbolInfoProviderImpl: KtSymbolInfoProvider = KtFe10SymbolInfoProvider(this) override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token) + override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFe10ReferenceResolveProvider(this) override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { return KtFe10AnalysisSession(elementToReanalyze, token) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceResolveProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceResolveProvider.kt new file mode 100644 index 00000000000..c7c05486b05 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ReferenceResolveProvider.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2022 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.descriptors.components + +import org.jetbrains.kotlin.analysis.api.components.KtReferenceResolveProvider +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade +import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession +import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.idea.references.KtReference +import org.jetbrains.kotlin.references.fe10.base.KtFe10Reference + +internal class KtFe10ReferenceResolveProvider( + override val analysisSession: KtFe10AnalysisSession +) : KtReferenceResolveProvider(), Fe10KtAnalysisSessionComponent { + override fun resolveToSymbols(reference: KtReference): Collection { + require(reference is KtFe10Reference) + val bindingContext = analysisContext.analyze(reference.element, Fe10AnalysisFacade.AnalysisMode.PARTIAL) + return reference.getTargetDescriptors(bindingContext).mapNotNull { descriptor -> + descriptor.toKtSymbol(analysisContext) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index faffefe7b9e..c5295c56f13 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -97,6 +97,8 @@ private constructor( override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token) + override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFirReferenceResolveProvider(this) + override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { check(mode == AnalysisSessionMode.REGULAR) { "Cannot create context-dependent copy of KtAnalysis session from a context dependent one" diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceResolveProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceResolveProvider.kt new file mode 100644 index 00000000000..434b8fd0bdd --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceResolveProvider.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2022 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.components + +import org.jetbrains.kotlin.analysis.api.KtSymbolBasedReference +import org.jetbrains.kotlin.analysis.api.components.KtReferenceResolveProvider +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.idea.references.KtReference + +internal class KtFirReferenceResolveProvider( + override val analysisSession: KtFirAnalysisSession +) : KtReferenceResolveProvider(), KtFirAnalysisSessionComponent { + override fun resolveToSymbols(reference: KtReference): Collection { + check(reference is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } + with(reference) { + return analysisSession.resolveToSymbols() + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt index b4cfa176c27..7a9f8c6e078 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/KtAnalysisSession.kt @@ -139,6 +139,9 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke internal val analysisScopeProvider: KtAnalysisScopeProvider get() = analysisScopeProviderImpl protected abstract val analysisScopeProviderImpl: KtAnalysisScopeProvider + internal val referenceResolveProvider: KtReferenceResolveProvider get() = referenceResolveProviderImpl + protected abstract val referenceResolveProviderImpl: KtReferenceResolveProvider + @PublishedApi internal val typesCreator: KtTypeCreator get() = typesCreatorImpl diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt index 3ba4d778718..88a20e65b50 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveMixIn.kt @@ -5,18 +5,15 @@ package org.jetbrains.kotlin.analysis.api.components -import org.jetbrains.kotlin.analysis.api.KtSymbolBasedReference import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.references.KtReference public interface KtReferenceResolveMixIn : KtAnalysisSessionMixIn { public fun KtReference.resolveToSymbols(): Collection { - check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } - return analysisSession.resolveToSymbols() + return analysisSession.referenceResolveProvider.resolveToSymbols(this) } public fun KtReference.resolveToSymbol(): KtSymbol? { - check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference but was ${this::class}" } return resolveToSymbols().singleOrNull() } } \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveProvider.kt new file mode 100644 index 00000000000..a203c224898 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtReferenceResolveProvider.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2022 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.components + +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.idea.references.KtReference + +public abstract class KtReferenceResolveProvider { + public abstract fun resolveToSymbols(reference: KtReference): Collection +} \ No newline at end of file