From 7b1765cc8b91bff1c5f6d5ef25604e04fd7e62cb Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 8 Jun 2022 13:39:57 +0200 Subject: [PATCH] [Analysis API] introduce base KtTypeScope -> KtScope converter --- .../api/descriptors/KtFe10AnalysisSession.kt | 1 + .../components/KtFe10ScopeSubstitution.kt | 21 +++++++++++++ .../analysis/api/fir/KtFirAnalysisSession.kt | 2 ++ .../fir/components/KtFirScopeSubstitution.kt | 31 +++++++++++++++++++ .../impl/base/scopes/KtCompositeTypeScope.kt | 2 +- .../kotlin/analysis/api/KtAnalysisSession.kt | 6 +++- .../api/components/KtScopeSubstitution.kt | 19 ++++++++++++ .../kotlin/analysis/utils/errors/errors.kt | 4 +++ 8 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeSubstitution.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeSubstitution.kt create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeSubstitution.kt 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 81326a24a09..8dc76346d9c 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 @@ -57,6 +57,7 @@ class KtFe10AnalysisSession( override val analysisScopeProviderImpl: KtAnalysisScopeProvider = KtAnalysisScopeProviderImpl(this, token) override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFe10ReferenceResolveProvider(this) override val substitutionProviderImpl: KtSignatureSubsitutor = KtFe10SignatureSubsitutor(this) + override val scopeSubstitutionImpl: KtScopeSubstitution = KtFe10ScopeSubstitution(this) override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession = withValidityAssertion { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeSubstitution.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeSubstitution.kt new file mode 100644 index 00000000000..cd1edb06073 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeSubstitution.kt @@ -0,0 +1,21 @@ +/* + * 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.KtScopeSubstitution +import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession +import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent +import org.jetbrains.kotlin.analysis.api.scopes.KtScope +import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope + +internal class KtFe10ScopeSubstitution( + override val analysisSession: KtFe10AnalysisSession, +) : KtScopeSubstitution(), Fe10KtAnalysisSessionComponent { + + override fun getDeclarationScope(scope: KtTypeScope): KtScope { + TODO() + } +} \ 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 2c587d28ab6..9dbff97db7e 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 @@ -105,6 +105,8 @@ private constructor( override val substitutionProviderImpl: KtSignatureSubsitutor = KtFirSignatureSubsitutor(this) + override val scopeSubstitutionImpl: KtScopeSubstitution = KtFirScopeSubstitution(this) + @Suppress("AnalysisApiMissingLifetimeCheck") override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession { check(mode == AnalysisSessionMode.REGULAR) { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeSubstitution.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeSubstitution.kt new file mode 100644 index 00000000000..111d8911529 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeSubstitution.kt @@ -0,0 +1,31 @@ +/* + * 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.KtAnalysisApiInternals +import org.jetbrains.kotlin.analysis.api.components.KtScopeSubstitution +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.scopes.KtFirDelegatingScope +import org.jetbrains.kotlin.analysis.api.fir.scopes.KtFirDelegatingTypeScope +import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeScope +import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeTypeScope +import org.jetbrains.kotlin.analysis.api.scopes.KtScope +import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope +import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError + +internal class KtFirScopeSubstitution( + override val analysisSession: KtFirAnalysisSession, +) : KtScopeSubstitution(), KtFirAnalysisSessionComponent { + + @OptIn(KtAnalysisApiInternals::class) + override fun getDeclarationScope(scope: KtTypeScope): KtScope { + return when (scope) { + is KtFirDelegatingTypeScope -> KtFirDelegatingScope(scope.firScope, analysisSession.firSymbolBuilder, token) + is KtCompositeTypeScope -> KtCompositeScope(scope.subScopes.map(::getDeclarationScope), token) + else -> unexpectedElementError(scope) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt index 3778ce8f7ee..b32cca406d5 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.name.Name @KtAnalysisApiInternals class KtCompositeTypeScope( - private val subScopes: List, + val subScopes: List, override val token: KtLifetimeToken ) : KtTypeScope { override fun getAllPossibleNames(): Set = withValidityAssertion { 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 88b9db06af1..8c2cdfe91cb 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 @@ -58,7 +58,8 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke KtInheritorsProviderMixIn, KtTypeCreatorMixIn, KtAnalysisScopeProviderMixIn, - KtSignatureSubsitutorMixIn { + KtSignatureSubsitutorMixIn, + KtScopeSubstitutionMixIn { public abstract val useSiteModule: KtModule @@ -147,6 +148,9 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke internal val substitutionProvider: KtSignatureSubsitutor get() = substitutionProviderImpl protected abstract val substitutionProviderImpl: KtSignatureSubsitutor + internal val scopeSubstitution: KtScopeSubstitution get() = scopeSubstitutionImpl + protected abstract val scopeSubstitutionImpl: KtScopeSubstitution + @PublishedApi internal val typesCreator: KtTypeCreator get() = typesCreatorImpl diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeSubstitution.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeSubstitution.kt new file mode 100644 index 00000000000..77877d2eca2 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeSubstitution.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2020 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.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.scopes.KtScope +import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope + +public abstract class KtScopeSubstitution : KtAnalysisSessionComponent() { + public abstract fun getDeclarationScope(scope: KtTypeScope): KtScope +} + +public interface KtScopeSubstitutionMixIn : KtAnalysisSessionMixIn { + public fun KtTypeScope.getDeclarationScope(): KtScope = + withValidityAssertion { analysisSession.scopeSubstitution.getDeclarationScope(this) } +} diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/errors.kt b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/errors.kt index 7d608b5f54e..da161a9037f 100644 --- a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/errors.kt +++ b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/errors.kt @@ -7,4 +7,8 @@ package org.jetbrains.kotlin.analysis.utils.errors public fun unexpectedElementError(elementName: String, element: Any?): Nothing { error("Unexpected $elementName ${element?.let { it::class.simpleName }}") +} + +public inline fun unexpectedElementError(element: Any?): Nothing { + unexpectedElementError(ELEMENT::class.simpleName ?: ELEMENT::class.java.name, element) } \ No newline at end of file