[Analysis API] fix getScopeContextForFile and clarify its semantic

It was used to get importing scope, so it was renamed to getImportingScopeContext.

It was broken after changing the behaviour of `LowLevelFirApiFacadeForResolveOnAir.onAirGetTowerContextProvider` for the whole file

^KT-57966
This commit is contained in:
Ilya Kirillov
2023-05-01 12:25:36 +02:00
committed by Space Team
parent 254092a267
commit 20f921c0bf
4 changed files with 48 additions and 6 deletions
@@ -210,6 +210,13 @@ internal class KtFe10ScopeProvider(
return KtScopeContext(listOf(KtScopeWithKind(compositeScope, scopeKind, token)), collectImplicitReceivers(fileScope), token) 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 <reified T : DeclarationDescriptor> getDescriptor(symbol: KtSymbol): T? { private inline fun <reified T : DeclarationDescriptor> getDescriptor(symbol: KtSymbol): T? {
return when (symbol) { return when (symbol) {
is KtFe10DescSymbol<*> -> symbol.descriptor as? T is KtFe10DescSymbol<*> -> symbol.descriptor as? T
@@ -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.KtClassifierSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol 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.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.*
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.ResolutionScope
internal abstract class KtFe10ScopeResolution : KtScope, KtLifetimeOwner { internal abstract class KtFe10ScopeResolution : KtScope, KtLifetimeOwner {
abstract val analysisContext: Fe10AnalysisContext abstract val analysisContext: Fe10AnalysisContext
@@ -91,3 +89,18 @@ internal open class KtFe10ScopeMember(
constructors.forEach { yield(it.toKtConstructorSymbol(analysisContext)) } constructors.forEach { yield(it.toKtConstructorSymbol(analysisContext)) }
} }
} }
internal class KtFe10ScopeImporting(
override val scope: ImportingScope,
override val analysisContext: Fe10AnalysisContext
) : KtFe10ScopeResolution() {
override fun getPossibleCallableNames(): Set<Name> = withValidityAssertion {
return getCallableSymbols().mapNotNullTo(mutableSetOf()) { (it as? KtPossiblyNamedSymbol)?.name }
}
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
return getClassifierSymbols().mapNotNullTo(mutableSetOf()) { (it as? KtPossiblyNamedSymbol)?.name }
}
override fun getConstructors(): Sequence<KtConstructorSymbol> = withValidityAssertion { emptySequence() }
}
@@ -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.symbols.markers.KtSymbolWithMembers
import org.jetbrains.kotlin.analysis.api.types.KtType 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.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.errors.unexpectedElementError
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -170,6 +171,20 @@ internal class KtFirScopeProvider(
)?.let { convertToKtTypeScope(it) } )?.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( override fun getScopeContextForPosition(
originalFile: KtFile, originalFile: KtFile,
positionInFakeFile: KtElement positionInFakeFile: KtElement
@@ -40,6 +40,8 @@ public abstract class KtScopeProvider : KtAnalysisSessionComponent() {
public abstract fun getSyntheticJavaPropertiesScope(type: KtType): KtTypeScope? public abstract fun getSyntheticJavaPropertiesScope(type: KtType): KtTypeScope?
public abstract fun getImportingScopeContext(file: KtFile): KtScopeContext
public abstract fun getScopeContextForPosition( public abstract fun getScopeContextForPosition(
originalFile: KtFile, originalFile: KtFile,
positionInFakeFile: KtElement positionInFakeFile: KtElement
@@ -112,8 +114,13 @@ public interface KtScopeProviderMixIn : KtAnalysisSessionMixIn {
public fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext = public fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext =
withValidityAssertion { analysisSession.scopeProvider.getScopeContextForPosition(this, positionInFakeFile) } 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 * Returns single scope, containing declarations from all scopes that satisfy [filter]. The order of declarations corresponds to the