FIR IDE: Add collecting scopes for declarations

- They are required to perform completion in default arguments,
return types, and other declaration parts (except for body)
This commit is contained in:
Roman Golyshev
2020-08-31 16:59:06 +03:00
parent 76eb5d46f4
commit 90c89bddc5
4 changed files with 12 additions and 0 deletions
@@ -85,6 +85,8 @@ open class FirBodyResolveTransformer(
open fun onBeforeStatementResolution(statement: FirStatement) {}
open fun onBeforeDeclarationContentResolve(declaration: FirDeclaration) {}
// ------------------------------------- Expressions -------------------------------------
override fun transformExpression(expression: FirExpression, data: ResolutionMode): CompositeTransformResult<FirStatement> {
@@ -53,6 +53,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
private fun transformDeclarationContent(
declaration: FirDeclaration, data: ResolutionMode
): CompositeTransformResult<FirDeclaration> {
transformer.onBeforeDeclarationContentResolve(declaration)
return context.withContainer(declaration) {
declaration.replaceResolvePhase(transformerPhase)
transformer.transformDeclarationContent(declaration, data)
@@ -31,6 +31,10 @@ internal class FirDesignatedBodyResolveTransformerForIDE(
returnTypeCalculator = createReturnTypeCalculatorForIDE(session, scopeSession)
) {
override fun onBeforeDeclarationContentResolve(declaration: FirDeclaration) {
towerDataContextCollector?.addDeclarationContext(declaration, context.towerDataContext)
}
override fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): CompositeTransformResult<FirDeclaration> {
if (designation.hasNext()) {
designation.next().visitNoTransform(this, data)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
@@ -17,6 +18,10 @@ internal class FirTowerDataContextCollector {
state[statement] = context
}
fun addDeclarationContext(declaration: FirDeclaration, context: FirTowerDataContext) {
state[declaration] = context
}
fun getContext(statement: FirElement): FirTowerDataContext? {
this.state[statement]?.let { return it }
for ((key, value) in this.state) {