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 d416b589ed2..7bf6d191fd7 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 @@ -210,6 +210,13 @@ internal class KtFe10ScopeProvider( return KtScopeContext(listOf(KtScopeWithKind(compositeScope, scopeKind, token)), collectImplicitReceivers(fileScope), token) } + override fun getImportingScopeContext(file: KtFile): KtScopeContext { + val importingScopes = getScopeContextForPosition(originalFile = file, positionInFakeFile = file) + .scopes + .filter { it.kind is KtScopeKind.ImportingScope } + return KtScopeContext(importingScopes, _implicitReceivers = emptyList(), token) + } + private inline fun getDescriptor(symbol: KtSymbol): T? { return when (symbol) { is KtFe10DescSymbol<*> -> symbol.descriptor as? T diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10ScopeResolution.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10ScopeResolution.kt index b92596c5d2c..3546f560e9b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10ScopeResolution.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10ScopeResolution.kt @@ -17,12 +17,10 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossiblyNamedSymbol import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.resolve.scopes.ResolutionScope +import org.jetbrains.kotlin.resolve.scopes.* internal abstract class KtFe10ScopeResolution : KtScope, KtLifetimeOwner { abstract val analysisContext: Fe10AnalysisContext @@ -90,4 +88,19 @@ internal open class KtFe10ScopeMember( override fun getConstructors(): Sequence = sequence { constructors.forEach { yield(it.toKtConstructorSymbol(analysisContext)) } } +} + +internal class KtFe10ScopeImporting( + override val scope: ImportingScope, + override val analysisContext: Fe10AnalysisContext +) : KtFe10ScopeResolution() { + override fun getPossibleCallableNames(): Set = withValidityAssertion { + return getCallableSymbols().mapNotNullTo(mutableSetOf()) { (it as? KtPossiblyNamedSymbol)?.name } + } + + override fun getPossibleClassifierNames(): Set = withValidityAssertion { + return getClassifierSymbols().mapNotNullTo(mutableSetOf()) { (it as? KtPossiblyNamedSymbol)?.name } + } + + override fun getConstructors(): Sequence = withValidityAssertion { emptySequence() } } \ No newline at end of file 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 548bc2b543a..7acdd39233f 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 @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclaration import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext import org.jetbrains.kotlin.fir.FirSession @@ -170,6 +171,20 @@ internal class KtFirScopeProvider( )?.let { convertToKtTypeScope(it) } } + override fun getImportingScopeContext(file: KtFile): KtScopeContext { + val firFile = file.getOrBuildFirFile(firResolveSession) + val firFileSession = firFile.moduleData.session + val firImportingScopes = createImportingScopes( + firFile, + firFileSession, + analysisSession.getScopeSessionFor(firFileSession), + useCaching = true, + ) + + val ktScopesWithKinds = createScopesWithKind(firImportingScopes.withIndex()) + return KtScopeContext(ktScopesWithKinds, _implicitReceivers = emptyList(), token) + } + override fun getScopeContextForPosition( originalFile: KtFile, positionInFakeFile: KtElement diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt index 3d5615eb5d2..23405189ac2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtScopeProvider.kt @@ -40,6 +40,8 @@ public abstract class KtScopeProvider : KtAnalysisSessionComponent() { public abstract fun getSyntheticJavaPropertiesScope(type: KtType): KtTypeScope? + public abstract fun getImportingScopeContext(file: KtFile): KtScopeContext + public abstract fun getScopeContextForPosition( originalFile: KtFile, positionInFakeFile: KtElement @@ -112,8 +114,13 @@ public interface KtScopeProviderMixIn : KtAnalysisSessionMixIn { public fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext = withValidityAssertion { analysisSession.scopeProvider.getScopeContextForPosition(this, positionInFakeFile) } - public fun KtFile.getScopeContextForFile(): KtScopeContext = - withValidityAssertion { analysisSession.scopeProvider.getScopeContextForPosition(this, this) } + /** + * Returns a [KtScopeContext] formed by all imports in the [KtFile]. + * + * By default, this will also include default importing scopes, which can be filtered by [KtScopeKind] + */ + public fun KtFile.getImportingScopeContext(): KtScopeContext = + withValidityAssertion { analysisSession.scopeProvider.getImportingScopeContext(this) } /** * Returns single scope, containing declarations from all scopes that satisfy [filter]. The order of declarations corresponds to the