From 76ff106458c98d27462f108a2b6b2897566e5ba3 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 3 Mar 2021 18:34:05 +0300 Subject: [PATCH] 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 --- .../transformers/body/resolve/FirBodyResolveTransformer.kt | 4 ++++ .../kotlin/idea/frontend/api/components/KtScopeProvider.kt | 3 +++ .../api/element/builder/FirTowerDataContextCollector.kt | 6 ++++++ .../FirDesignatedBodyResolveTransformerForIDE.kt | 5 +++++ 4 files changed, 18 insertions(+) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt index 1bd76276cb5..4591351e1ec 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt @@ -49,6 +49,8 @@ open class FirBodyResolveTransformer( override fun transformFile(file: FirFile, data: ResolutionMode): CompositeTransformResult { checkSessionConsistency(file) return context.withFile(file, components) { + onBeforeFileContentResolution(file) + file.replaceResolvePhase(transformerPhase) @Suppress("UNCHECKED_CAST") transformDeclarationContent(file, data) as CompositeTransformResult @@ -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) {} diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt index 0cba32841d2..ce3f3e48a53 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtScopeProvider.kt @@ -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) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirTowerDataContextCollector.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirTowerDataContextCollector.kt index 2457fc97eac..a46643a93d6 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirTowerDataContextCollector.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirTowerDataContextCollector.kt @@ -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 = 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 diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirDesignatedBodyResolveTransformerForIDE.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirDesignatedBodyResolveTransformerForIDE.kt index b6ecb91afd4..db61084f65d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirDesignatedBodyResolveTransformerForIDE.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirDesignatedBodyResolveTransformerForIDE.kt @@ -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) }