FIR: Add collecting top-level scopes of the file

It will be useful in the completion when we need to dicide if we
need to import FQN or not
This commit is contained in:
Roman Golyshev
2021-03-03 18:34:05 +03:00
parent 3427e0aebb
commit 76ff106458
4 changed files with 18 additions and 0 deletions
@@ -49,6 +49,8 @@ open class FirBodyResolveTransformer(
override fun transformFile(file: FirFile, data: ResolutionMode): CompositeTransformResult<FirFile> {
checkSessionConsistency(file)
return context.withFile(file, components) {
onBeforeFileContentResolution(file)
file.replaceResolvePhase(transformerPhase)
@Suppress("UNCHECKED_CAST")
transformDeclarationContent(file, data) as CompositeTransformResult<FirFile>
@@ -73,6 +75,8 @@ open class FirBodyResolveTransformer(
return data.expectedTypeRef.compose()
}
open fun onBeforeFileContentResolution(file: FirFile) {}
open fun onBeforeStatementResolution(statement: FirStatement) {}
open fun onBeforeDeclarationContentResolve(declaration: FirDeclaration) {}
@@ -50,6 +50,9 @@ interface KtScopeProviderMixIn : KtAnalysisSessionMixIn {
fun KtFile.getScopeContextForPosition(positionInFakeFile: KtElement): KtScopeContext =
analysisSession.scopeProvider.getScopeContextForPosition(this, positionInFakeFile)
fun KtFile.getScopeContextForFile(): KtScopeContext =
analysisSession.scopeProvider.getScopeContextForPosition(this, this)
}
data class KtScopeContext(val scopes: KtCompositeScope, val implicitReceiversTypes: List<KtType>)
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
@@ -17,6 +18,11 @@ import org.jetbrains.kotlin.psi.*
class FirTowerDataContextCollector {
private val state: MutableMap<KtElement, FirTowerDataContext> = hashMapOf()
fun addFileContext(file: FirFile, context: FirTowerDataContext) {
val ktFile = file.psi as? KtFile ?: return
state[ktFile] = context
}
fun addStatementContext(statement: FirStatement, context: FirTowerDataContext) {
val closestStatementInBlock = statement.psi?.closestBlockLevelOrInitializerExpression() ?: return
state[closestStatementInBlock] = context
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
@@ -44,6 +45,10 @@ internal class FirDesignatedBodyResolveTransformerForIDE(
super.transformDeclarationContent(declaration, data)
}
override fun onBeforeFileContentResolution(file: FirFile) {
towerDataContextCollector?.addFileContext(file, context.towerDataContext)
}
override fun onBeforeDeclarationContentResolve(declaration: FirDeclaration) {
towerDataContextCollector?.addDeclarationContext(declaration, context.towerDataContext)
}