FIR resolution: introduce FirResolvePhase & FirAbstractPhaseTransformer

The phase determines which transformers were already applied to declaration.
The transformer controls current resolve phase in phasedFir and
performs additional resolve if necessary.
This commit is contained in:
Mikhail Glukhikh
2019-07-26 20:06:38 +03:00
parent a38b4756b5
commit 7529d557fe
41 changed files with 264 additions and 82 deletions
@@ -15,6 +15,8 @@ interface FirDeclaration : FirElement {
val session: FirSession
var resolvePhase: FirResolvePhase
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitDeclaration(this, data)
}
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2019 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.fir.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
// TODO: remove : FirElement
enum class FirResolvePhase : FirElement {
RAW_FIR,
IMPORTS,
SUPER_TYPES,
TYPES,
STATUS,
IMPLICIT_TYPES_BODY_RESOLVE,
BODY_RESOLVE;
val prev: FirResolvePhase get() = values()[ordinal - 1]
val next: FirResolvePhase get() = values()[ordinal + 1]
override val psi: PsiElement?
get() = null
companion object {
// Short-cut
val DECLARATIONS = STATUS
}
}
@@ -8,9 +8,12 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement
abstract class FirAbstractAnnotatedDeclaration(
final override val session: FirSession,
psi: PsiElement?
) : FirAbstractAnnotatedElement(psi), FirDeclaration
) : FirAbstractAnnotatedElement(psi), FirDeclaration {
override var resolvePhase = FirResolvePhase.RAW_FIR
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -25,6 +26,8 @@ class FirAnonymousFunctionImpl(
override var body: FirBlock? = null
override var resolvePhase = FirResolvePhase.DECLARATIONS
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
receiverTypeRef = receiverTypeRef?.transformSingle(transformer, data)
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -19,6 +20,8 @@ class FirAnonymousInitializerImpl(
psi: PsiElement?,
override var body: FirBlock?
) : FirAnonymousInitializer, FirAbstractElement(psi) {
override var resolvePhase = FirResolvePhase.RAW_FIR
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
body = body?.transformSingle(transformer, data)
return this
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -31,6 +32,8 @@ abstract class FirDefaultPropertyAccessor(
) : FirAbstractElement(psi), FirPropertyAccessor {
override var status = FirDeclarationStatusImpl(visibility, Modality.FINAL)
override var resolvePhase = FirResolvePhase.BODY_RESOLVE
final override val body: FirBlock? =
null
@@ -50,6 +50,8 @@ class FirEnumEntryImpl(
override val arguments = mutableListOf<FirExpression>()
override var resolvePhase = FirResolvePhase.RAW_FIR
override fun replaceSupertypes(newSupertypes: List<FirTypeRef>): FirRegularClass {
superTypeRefs.clear()
superTypeRefs.addAll(newSupertypes)
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirErrorDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -29,6 +30,8 @@ class FirErrorFunction(
override val body: FirBlock?
get() = null
override var resolvePhase = FirResolvePhase.BODY_RESOLVE
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
super<FirFunction>.accept(visitor, data)
}
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
@@ -40,6 +41,7 @@ class FirVariableImpl(
init {
symbol.bind(this)
delegateFieldSymbol?.bind(this)
resolvePhase = FirResolvePhase.DECLARATIONS
}
override val receiverTypeRef: FirTypeRef?