From 22e31ea41421fffb9ca073c553205b02337b7e7e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 30 Nov 2021 13:08:16 +0100 Subject: [PATCH] Analysis API FE1.0: fix invalid file scope --- .../components/KtFe10ScopeProvider.kt | 4 +- .../api/descriptors/scopes/KtFe10FileScope.kt | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10FileScope.kt 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 9364e9713f6..5c8b5f84404 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 @@ -86,9 +86,7 @@ internal class KtFe10ScopeProvider( override fun getFileScope(fileSymbol: KtFileSymbol): KtScope = withValidityAssertion { require(fileSymbol is KtFe10FileSymbol) - val scope = analysisContext.resolveSession.fileScopeProvider.getFileResolutionScope(fileSymbol.psi) - - return KtFe10ScopeLexical(scope, analysisContext) + return KtFe10FileScope(fileSymbol.psi, analysisContext, token) } override fun getPackageScope(packageSymbol: KtPackageSymbol): KtScope = withValidityAssertion { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10FileScope.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10FileScope.kt new file mode 100644 index 00000000000..01c48030f22 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/scopes/KtFe10FileScope.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2021 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.scopes + +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassifierSymbol +import org.jetbrains.kotlin.analysis.api.scopes.KtScope +import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter +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.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtClassLikeDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.BindingContext + +internal class KtFe10FileScope( + private val ktFile: KtFile, + private val analysisContext: Fe10AnalysisContext, + override val token: ValidityToken, +) : KtScope { + override fun getPossibleCallableNames(): Set = withValidityAssertion { + ktFile.declarations.mapNotNullTo(mutableSetOf()) { (it as? KtCallableDeclaration)?.nameAsName } + } + + override fun getPossibleClassifierNames(): Set = withValidityAssertion { + ktFile.declarations.mapNotNullTo(mutableSetOf()) { (it as? KtClassLikeDeclaration)?.nameAsName } + } + + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + val context = analysisContext.analyze(ktFile) + + sequence { + for (declaration in ktFile.declarations) { + if (declaration is KtCallableDeclaration) { + val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration] as? CallableDescriptor ?: continue + val ktSymbol = descriptor.toKtCallableSymbol(analysisContext) ?: continue + yield(ktSymbol) + } + } + } + } + + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + val context = analysisContext.analyze(ktFile) + + sequence { + for (declaration in ktFile.declarations) { + if (declaration is KtClassLikeDeclaration) { + val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration] as? ClassifierDescriptor ?: continue + val ktSymbol = descriptor.toKtClassifierSymbol(analysisContext) ?: continue + yield(ktSymbol) + } + } + } + } + + override fun getConstructors(): Sequence = withValidityAssertion { + emptySequence() + } + + override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + emptySequence() + } +} \ No newline at end of file