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:
@@ -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
|
||||
}
|
||||
}
|
||||
+4
-1
@@ -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
|
||||
}
|
||||
+3
@@ -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)
|
||||
|
||||
+3
@@ -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
|
||||
|
||||
+3
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user