[Analysis API] Allow handling scopes from KtScopeContext separately

^KT-55527
This commit is contained in:
aleksandrina-streltsova
2023-02-07 11:21:02 +02:00
committed by teamcity
parent d89d774411
commit 4b7164a557
27 changed files with 3481 additions and 41 deletions
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.analysis.api.descriptors.components
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.kotlin.analysis.api.components.KtImplicitReceiver
import org.jetbrains.kotlin.analysis.api.components.KtScopeContext
import org.jetbrains.kotlin.analysis.api.components.KtScopeProvider
import org.jetbrains.kotlin.analysis.api.components.*
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.scopes.KtFe10FileScope
@@ -200,15 +198,16 @@ internal class KtFe10ScopeProvider(
val elementToAnalyze = positionInFakeFile.containingNonLocalDeclaration() ?: originalFile
val bindingContext = analysisContext.analyze(elementToAnalyze)
val scopeKind = KtScopeKind.LocalScope(0) // TODO
val lexicalScope = positionInFakeFile.getResolutionScope(bindingContext)
if (lexicalScope != null) {
val compositeScope = KtCompositeScope(listOf(KtFe10ScopeLexical(lexicalScope, analysisContext)), token)
return KtScopeContext(compositeScope, collectImplicitReceivers(lexicalScope), 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)
return KtScopeContext(compositeScope, collectImplicitReceivers(fileScope), token)
return KtScopeContext(listOf(KtScopeWithKind(compositeScope, scopeKind, token)), collectImplicitReceivers(fileScope), token)
}
private inline fun <reified T : DeclarationDescriptor> getDescriptor(symbol: KtSymbol): T? {
@@ -225,7 +224,7 @@ internal class KtFe10ScopeProvider(
private fun collectImplicitReceivers(scope: LexicalScope): MutableList<KtImplicitReceiver> {
val result = mutableListOf<KtImplicitReceiver>()
for (implicitReceiver in scope.getImplicitReceiversHierarchy()) {
for ((index, implicitReceiver) in scope.getImplicitReceiversHierarchy().withIndex()) {
val type = implicitReceiver.type.toKtType(analysisContext)
val ownerDescriptor = implicitReceiver.containingDeclaration
val owner = ownerDescriptor.toKtSymbol(analysisContext)
@@ -235,7 +234,7 @@ internal class KtFe10ScopeProvider(
continue
}
result += KtImplicitReceiver(token, type, owner)
result += KtImplicitReceiver(token, type, owner, index)
}
return result