diff --git a/analysis/analysis-api-fe10/build.gradle.kts b/analysis/analysis-api-fe10/build.gradle.kts index 07a3989d1fc..4557027c29b 100644 --- a/analysis/analysis-api-fe10/build.gradle.kts +++ b/analysis/analysis-api-fe10/build.gradle.kts @@ -41,6 +41,7 @@ tasks.withType> { kotlinOptions { freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" freeCompilerArgs += "-Xcontext-receivers" + freeCompilerArgs += "-opt-in=org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals" } } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt index 7bf6d191fd7..c18926072e1 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ScopeProvider.kt @@ -181,7 +181,7 @@ internal class KtFe10ScopeProvider( } override fun getCompositeScope(subScopes: List): KtScope { - return KtCompositeScope(subScopes, token) + return KtCompositeScope.create(subScopes, token) } override fun getTypeScope(type: KtType): KtTypeScope { @@ -201,12 +201,12 @@ internal class KtFe10ScopeProvider( val scopeKind = KtScopeKind.LocalScope(0) // TODO val lexicalScope = positionInFakeFile.getResolutionScope(bindingContext) if (lexicalScope != null) { - val compositeScope = KtCompositeScope(listOf(KtFe10ScopeLexical(lexicalScope, analysisContext)), token) + val compositeScope = KtCompositeScope.create(listOf(KtFe10ScopeLexical(lexicalScope, analysisContext)), token) return KtScopeContext(listOf(KtScopeWithKind(compositeScope, scopeKind, token)), collectImplicitReceivers(lexicalScope), token) } val fileScope = analysisContext.resolveSession.fileScopeProvider.getFileResolutionScope(originalFile) - val compositeScope = KtCompositeScope(listOf(KtFe10ScopeLexical(fileScope, analysisContext)), token) + val compositeScope = KtCompositeScope.create(listOf(KtFe10ScopeLexical(fileScope, analysisContext)), token) return KtScopeContext(listOf(KtScopeWithKind(compositeScope, scopeKind, token)), collectImplicitReceivers(fileScope), token) } diff --git a/analysis/analysis-api-fir/build.gradle.kts b/analysis/analysis-api-fir/build.gradle.kts index 72763b17c00..9efcbc08f5f 100644 --- a/analysis/analysis-api-fir/build.gradle.kts +++ b/analysis/analysis-api-fir/build.gradle.kts @@ -95,4 +95,5 @@ compileKotlin.dependsOn(generateCode) tasks.withType().configureEach { kotlinOptions.freeCompilerArgs += "-Xcontext-receivers" + kotlinOptions.freeCompilerArgs += "-opt-in=org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals" } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt index cae319e2018..6dea2e9dca3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt @@ -156,7 +156,7 @@ internal class KtFirScopeProvider( override fun getCompositeScope(subScopes: List): KtScope { - return KtCompositeScope(subScopes, token) + return KtCompositeScope.create(subScopes, token) } override fun getTypeScope(type: KtType): KtTypeScope? = getFirTypeScope(type)?.let { convertToKtTypeScope(it) } 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 index 28498b415d6..e17cbc845a9 100644 --- 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 @@ -24,7 +24,7 @@ internal class KtFirScopeSubstitution( override fun getDeclarationScope(scope: KtTypeScope): KtScope { return when (scope) { is KtFirDelegatingTypeScope -> KtFirDelegatingNamesAwareScope(scope.firScope, analysisSession.firSymbolBuilder) - is KtCompositeTypeScope -> KtCompositeScope(scope.subScopes.map(::getDeclarationScope), token) + is KtCompositeTypeScope -> KtCompositeScope.create(scope.subScopes.map(::getDeclarationScope), token) else -> unexpectedElementError(scope) } } diff --git a/analysis/analysis-api-impl-base/build.gradle.kts b/analysis/analysis-api-impl-base/build.gradle.kts index f86069f229b..5ab9c5e90f5 100644 --- a/analysis/analysis-api-impl-base/build.gradle.kts +++ b/analysis/analysis-api-impl-base/build.gradle.kts @@ -35,6 +35,7 @@ sourceSets { tasks.withType().configureEach { kotlinOptions.freeCompilerArgs += "-Xcontext-receivers" + kotlinOptions.freeCompilerArgs += "-opt-in=org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals" } testsJar() diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeScope.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeScope.kt index f24bf838d1a..6561882ae6d 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeScope.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeScope.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.impl.base.scopes +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.scopes.KtScope @@ -12,10 +13,18 @@ import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.name.Name -class KtCompositeScope( +@KtAnalysisApiInternals +class KtCompositeScope private constructor( private val subScopes: List, - override val token: KtLifetimeToken + override val token: KtLifetimeToken, ) : KtScope { + + init { + require(subScopes.size > 1) { + "Required `subScopes.size > 1` but `subScopes.size = ${subScopes.size}`" + } + } + override fun getAllPossibleNames(): Set = withValidityAssertion { buildSet { subScopes.flatMapTo(this) { it.getAllPossibleNames() } @@ -81,4 +90,13 @@ class KtCompositeScope( override fun mayContainName(name: Name): Boolean = withValidityAssertion { subScopes.any { it.mayContainName(name) } } + + companion object { + fun create(subScopes: List, token: KtLifetimeToken): KtScope = + when (subScopes.size) { + 0 -> KtEmptyScope(token) + 1 -> subScopes.single() + else -> KtCompositeScope(subScopes, token) + } + } } \ No newline at end of file