Extract supertypes resolution into a separate FIR phase

This commit is contained in:
Denis Zharkov
2019-03-11 11:53:11 +03:00
parent 3f4c5c8d53
commit 92defc2ae3
18 changed files with 340 additions and 179 deletions
@@ -28,8 +28,9 @@ interface FirElement {
fun acceptChildren(visitor: FirVisitorVoid) =
acceptChildren(visitor, null)
@Suppress("UNCHECKED_CAST")
fun <E : FirElement, D> transform(visitor: FirTransformer<D>, data: D): CompositeTransformResult<E> =
CompositeTransformResult(accept(visitor, data))
accept(visitor, data) as CompositeTransformResult<E>
fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement = this
}
}
@@ -5,8 +5,18 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
interface FirClassLikeDeclaration : FirMemberDeclaration {
val symbol: ConeClassifierSymbol
val symbol: ConeClassLikeSymbol
}
fun ConeClassifierSymbol.toFirClassLike(): FirClassLikeDeclaration? =
when (this) {
is FirClassSymbol -> this.fir
is FirTypeAliasSymbol -> this.fir
else -> null
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor
// May be all containers should be properties and not base classes
@@ -32,4 +33,8 @@ interface FirRegularClass : FirClass, @VisitedSupertype FirClassLikeDeclaration,
super<FirClassLikeDeclaration>.acceptChildren(visitor, data)
super<FirClass>.acceptChildren(visitor, data)
}
fun replaceSupertypes(newSupertypes: List<FirTypeRef>): FirRegularClass
}
val FirRegularClass.classId get() = symbol.classId
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.types.coneTypeSafe
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeAlias : FirClassLikeDeclaration, FirSymbolOwner<FirTypeAlias> {
fun replaceExpandTypeRef(typeRef: FirTypeRef): FirTypeAlias
val expandedTypeRef: FirTypeRef
override val symbol: FirTypeAliasSymbol
@@ -10,13 +10,13 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
open class FirClassImpl(
session: FirSession,
@@ -46,6 +46,11 @@ open class FirClassImpl(
override val declarations = mutableListOf<FirDeclaration>()
override fun replaceSupertypes(newSupertypes: List<FirTypeRef>): FirRegularClass {
superTypeRefs.clear()
superTypeRefs.addAll(newSupertypes)
return this
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRegularClass {
superTypeRefs.transformInplace(transformer, data)
@@ -55,4 +60,4 @@ open class FirClassImpl(
declarations.transformInplace(transformer, data)
return result
}
}
}
@@ -32,9 +32,14 @@ class FirTypeAliasImpl(
symbol.bind(this)
}
override fun replaceExpandTypeRef(typeRef: FirTypeRef): FirTypeAlias {
expandedTypeRef = typeRef
return this
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expandedTypeRef = expandedTypeRef.transformSingle(transformer, data)
return super<FirAbstractMemberDeclaration>.transformChildren(transformer, data)
}
}
}
@@ -7,8 +7,7 @@ package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.FirElement
@Suppress("UNSUPPORTED_FEATURE")
inline class CompositeTransformResult<out T : Any>(val a: Any) {
class CompositeTransformResult<out T : Any>(val a: Any) {
companion object {
fun <T : Any> empty() = CompositeTransformResult<T>(emptyList<T>())
@@ -33,4 +32,4 @@ inline class CompositeTransformResult<out T : Any>(val a: Any) {
}
@Suppress("NOTHING_TO_INLINE")
inline fun <T : FirElement> T.compose() = CompositeTransformResult.single(this)
inline fun <T : FirElement> T.compose() = CompositeTransformResult.single(this)