[FIR] Add special node for sealed classes

This commit is contained in:
Dmitriy Novozhilov
2019-10-15 14:45:16 +03:00
parent d0089c6747
commit 59fd47bfd0
22 changed files with 313 additions and 43 deletions
@@ -323,6 +323,10 @@ class MultiModuleHtmlFirDump(private val outputRoot: File) {
visitElement(regularClass) visitElement(regularClass)
} }
override fun visitSealedClass(sealedClass: FirSealedClass) {
visitRegularClass(sealedClass)
}
fun indexDeclaration(symbolOwner: FirSymbolOwner<*>) { fun indexDeclaration(symbolOwner: FirSymbolOwner<*>) {
symbols[symbolOwner.symbol] = location symbols[symbolOwner.symbol] = location
symbolIds[symbolOwner.symbol] = symbolCounter++ symbolIds[symbolOwner.symbol] = symbolCounter++
@@ -372,15 +372,25 @@ class DeclarationsConverter(
isData = modifiers.isDataClass() && classKind != ClassKind.OBJECT isData = modifiers.isDataClass() && classKind != ClassKind.OBJECT
isInline = modifiers.hasInline() isInline = modifiers.hasInline()
} }
val firClass = FirClassImpl( val firClass = if (status.modality == Modality.SEALED) {
null, FirSealedClassImpl(
session, null,
className, session,
status, className,
classKind, status,
FirClassSymbol(context.currentClassId) classKind,
FirClassSymbol(context.currentClassId)
) )
} else {
FirClassImpl(
null,
session,
className,
status,
classKind,
FirClassSymbol(context.currentClassId)
)
}
firClass.annotations += modifiers.annotations firClass.annotations += modifiers.annotations
firClass.typeParameters += firTypeParameters firClass.typeParameters += firTypeParameters
firClass.joinTypeParameters(typeConstraints) firClass.joinTypeParameters(typeConstraints)
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.addDeclaration import org.jetbrains.kotlin.fir.declarations.addDeclaration
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.impl.FirImplicitThisReference import org.jetbrains.kotlin.fir.references.impl.FirImplicitThisReference
import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl import org.jetbrains.kotlin.fir.references.impl.FirResolvedCallableReferenceImpl
@@ -29,7 +26,7 @@ import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
fun List<Pair<KtParameter?, FirProperty>>.generateComponentFunctions( fun List<Pair<KtParameter?, FirProperty>>.generateComponentFunctions(
session: FirSession, firClass: FirClassImpl, packageFqName: FqName, classFqName: FqName, session: FirSession, firClass: FirModifiableRegularClass, packageFqName: FqName, classFqName: FqName,
firPrimaryConstructor: FirConstructor firPrimaryConstructor: FirConstructor
) { ) {
var componentIndex = 1 var componentIndex = 1
@@ -81,7 +78,7 @@ fun List<Pair<KtParameter?, FirProperty>>.generateComponentFunctions(
private val copyName = Name.identifier("copy") private val copyName = Name.identifier("copy")
fun List<Pair<KtParameter?, FirProperty>>.generateCopyFunction( fun List<Pair<KtParameter?, FirProperty>>.generateCopyFunction(
session: FirSession, classOrObject: KtClassOrObject?, firClass: FirClassImpl, packageFqName: FqName, classFqName: FqName, session: FirSession, classOrObject: KtClassOrObject?, firClass: FirModifiableRegularClass, packageFqName: FqName, classFqName: FqName,
firPrimaryConstructor: FirConstructor firPrimaryConstructor: FirConstructor
) { ) {
val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, copyName)) val symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, copyName))
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -475,14 +474,25 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
isData = (classOrObject as? KtClass)?.isData() == true isData = (classOrObject as? KtClass)?.isData() == true
isInline = classOrObject.hasModifier(INLINE_KEYWORD) isInline = classOrObject.hasModifier(INLINE_KEYWORD)
} }
val firClass = FirClassImpl( val firClass = if (status.modality == Modality.SEALED) {
classOrObject, FirSealedClassImpl(
session, classOrObject,
classOrObject.nameAsSafeName, session,
status, classOrObject.nameAsSafeName,
classKind, status,
FirClassSymbol(context.currentClassId) classKind,
) FirClassSymbol(context.currentClassId)
)
} else {
FirClassImpl(
classOrObject,
session,
classOrObject.nameAsSafeName,
status,
classKind,
FirClassSymbol(context.currentClassId)
)
}
classOrObject.extractAnnotationsTo(firClass) classOrObject.extractAnnotationsTo(firClass)
classOrObject.extractTypeParametersTo(firClass) classOrObject.extractTypeParametersTo(firClass)
val delegatedSelfType = classOrObject.toDelegatedSelfType(firClass) val delegatedSelfType = classOrObject.toDelegatedSelfType(firClass)
@@ -5,12 +5,14 @@
package org.jetbrains.kotlin.fir.deserialization package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.addDeclarations import org.jetbrains.kotlin.fir.declarations.addDeclarations
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirSealedClassImpl
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
@@ -37,9 +39,10 @@ fun deserializeClassToSymbol(
) { ) {
val flags = classProto.flags val flags = classProto.flags
val kind = Flags.CLASS_KIND.get(flags) val kind = Flags.CLASS_KIND.get(flags)
val modality = ProtoEnumFlags.modality(Flags.MODALITY.get(flags))
val status = FirDeclarationStatusImpl( val status = FirDeclarationStatusImpl(
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
ProtoEnumFlags.modality(Flags.MODALITY.get(flags)) modality
).apply { ).apply {
isExpect = Flags.IS_EXPECT_CLASS.get(flags) isExpect = Flags.IS_EXPECT_CLASS.get(flags)
isActual = false isActual = false
@@ -48,14 +51,26 @@ fun deserializeClassToSymbol(
isData = Flags.IS_DATA.get(classProto.flags) isData = Flags.IS_DATA.get(classProto.flags)
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags) isInline = Flags.IS_INLINE_CLASS.get(classProto.flags)
} }
FirClassImpl( val firClass = if (modality == Modality.SEALED) {
null, FirSealedClassImpl(
session, null,
classId.shortClassName, session,
status, classId.shortClassName,
ProtoEnumFlags.classKind(kind), status,
symbol ProtoEnumFlags.classKind(kind),
).apply { symbol
)
} else {
FirClassImpl(
null,
session,
classId.shortClassName,
status,
ProtoEnumFlags.classKind(kind),
symbol
)
}
firClass.apply {
resolvePhase = FirResolvePhase.DECLARATIONS resolvePhase = FirResolvePhase.DECLARATIONS
val context = val context =
parentContext?.childContext( parentContext?.childContext(
@@ -288,6 +288,10 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
regularClass.declarations.renderDeclarations() regularClass.declarations.renderDeclarations()
} }
override fun visitSealedClass(sealedClass: FirSealedClass) {
visitRegularClass(sealedClass)
}
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject) {
anonymousObject.annotations.renderAnnotations() anonymousObject.annotations.renderAnnotations()
print("object : ") print("object : ")
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.fir.types.coneTypeSafe
@@ -40,14 +40,14 @@ inline val FirMemberDeclaration.isLateInit: Boolean get() = status.isLateInit
inline val FirPropertyAccessor.modality get() = status.modality inline val FirPropertyAccessor.modality get() = status.modality
inline val FirPropertyAccessor.visibility get() = status.visibility inline val FirPropertyAccessor.visibility get() = status.visibility
fun FirClassImpl.addDeclaration(declaration: FirDeclaration) { fun FirModifiableRegularClass.addDeclaration(declaration: FirDeclaration) {
declarations += declaration declarations += declaration
if (companionObject == null && declaration is FirRegularClass && declaration.isCompanion) { if (companionObject == null && declaration is FirRegularClass && declaration.isCompanion) {
companionObject = declaration companionObject = declaration
} }
} }
fun FirClassImpl.addDeclarations(declarations: Collection<FirDeclaration>) { fun FirModifiableRegularClass.addDeclarations(declarations: Collection<FirDeclaration>) {
declarations.forEach(this::addDeclaration) declarations.forEach(this::addDeclaration)
} }
@@ -0,0 +1,42 @@
/*
* 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.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
interface FirSealedClass : FirRegularClass {
override val psi: PsiElement?
override val session: FirSession
override val resolvePhase: FirResolvePhase
override val name: Name
override val annotations: List<FirAnnotationCall>
override val typeParameters: List<FirTypeParameter>
override val status: FirDeclarationStatus
override val supertypesComputationStatus: SupertypesComputationStatus
override val classKind: ClassKind
override val declarations: List<FirDeclaration>
override val symbol: FirClassSymbol
override val companionObject: FirRegularClass?
override val superTypeRefs: List<FirTypeRef>
val inheritors: List<ClassId>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitSealedClass(this, data)
fun replaceInheritors(newInheritors: List<ClassId>)
}
@@ -33,7 +33,7 @@ class FirClassImpl(
override var status: FirDeclarationStatus, override var status: FirDeclarationStatus,
override val classKind: ClassKind, override val classKind: ClassKind,
override val symbol: FirClassSymbol override val symbol: FirClassSymbol
) : FirRegularClass, FirModifiableClass, FirModifiableTypeParametersOwner, FirAbstractAnnotatedElement { ) : FirRegularClass, FirModifiableRegularClass, FirAbstractAnnotatedElement {
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf() override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
@@ -0,0 +1,50 @@
/*
* 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.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.SupertypesComputationStatus
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
interface FirModifiableRegularClass : FirRegularClass, FirModifiableClass, FirModifiableTypeParametersOwner, FirAbstractAnnotatedElement {
override val psi: PsiElement?
override val session: FirSession
override var resolvePhase: FirResolvePhase
override val name: Name
override val annotations: MutableList<FirAnnotationCall>
override val typeParameters: MutableList<FirTypeParameter>
override var status: FirDeclarationStatus
override var supertypesComputationStatus: SupertypesComputationStatus
override val classKind: ClassKind
override val declarations: MutableList<FirDeclaration>
override val symbol: FirClassSymbol
override var companionObject: FirRegularClass?
override val superTypeRefs: MutableList<FirTypeRef>
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirModifiableRegularClass
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
override fun replaceSupertypesComputationStatus(newSupertypesComputationStatus: SupertypesComputationStatus)
override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>)
}
@@ -0,0 +1,89 @@
/*
* 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.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.SupertypesComputationStatus
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
class FirSealedClassImpl(
override val psi: PsiElement?,
override val session: FirSession,
override val name: Name,
override var status: FirDeclarationStatus,
override val classKind: ClassKind,
override val symbol: FirClassSymbol
) : FirSealedClass, FirModifiableRegularClass, FirAbstractAnnotatedElement {
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
override var supertypesComputationStatus: SupertypesComputationStatus = SupertypesComputationStatus.NOT_COMPUTED
override val declarations: MutableList<FirDeclaration> = mutableListOf()
override var companionObject: FirRegularClass? = null
override val superTypeRefs: MutableList<FirTypeRef> = mutableListOf()
override val inheritors: MutableList<ClassId> = mutableListOf()
init {
symbol.bind(this)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
typeParameters.forEach { it.accept(visitor, data) }
status.accept(visitor, data)
(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }
declarations.forEach { it.accept(visitor, data) }
superTypeRefs.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirSealedClassImpl {
annotations.transformInplace(transformer, data)
typeParameters.transformInplace(transformer, data)
status = status.transformSingle(transformer, data)
(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data)
declarations.transformInplace(transformer, data)
companionObject = declarations.asSequence().filterIsInstance<FirRegularClass>().firstOrNull { it.status.isCompanion }
superTypeRefs.transformInplace(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
override fun replaceSupertypesComputationStatus(newSupertypesComputationStatus: SupertypesComputationStatus) {
supertypesComputationStatus = newSupertypesComputationStatus
}
override fun replaceSuperTypeRefs(newSuperTypeRefs: List<FirTypeRef>) {
superTypeRefs.clear()
superTypeRefs.addAll(newSuperTypeRefs)
}
override fun replaceInheritors(newInheritors: List<ClassId>) {
inheritors.clear()
inheritors.addAll(newInheritors)
}
}
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.fir.visitors package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -85,5 +85,9 @@ abstract class FirDefaultTransformer<D> : FirTransformer<D>() {
override fun transformNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: D): CompositeTransformResult<FirStatement> { override fun transformNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: D): CompositeTransformResult<FirStatement> {
return transformWrappedArgumentExpression(namedArgumentExpression, data) return transformWrappedArgumentExpression(namedArgumentExpression, data)
} }
override fun transformSealedClass(sealedClass: FirSealedClass, data: D): CompositeTransformResult<FirStatement> {
return transformRegularClass(sealedClass, data)
}
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.visitors package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -81,5 +82,9 @@ abstract class FirDefaultVisitor<R, D> : FirVisitor<R, D>() {
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: D): R { override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: D): R {
return visitWrappedArgumentExpression(namedArgumentExpression, data) return visitWrappedArgumentExpression(namedArgumentExpression, data)
} }
override fun visitSealedClass(sealedClass: FirSealedClass, data: D): R {
return visitRegularClass(sealedClass, data)
}
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.visitors package org.jetbrains.kotlin.fir.visitors
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -81,4 +82,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) { override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) {
return visitWrappedArgumentExpression(namedArgumentExpression) return visitWrappedArgumentExpression(namedArgumentExpression)
} }
override fun visitSealedClass(sealedClass: FirSealedClass) {
return visitRegularClass(sealedClass)
}
} }
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
@@ -242,6 +243,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(regularClass, data) return transformElement(regularClass, data)
} }
open fun transformSealedClass(sealedClass: FirSealedClass, data: D): CompositeTransformResult<FirStatement> {
return transformElement(sealedClass, data)
}
open fun transformTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirDeclaration> { open fun transformTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirDeclaration> {
return transformElement(typeAlias, data) return transformElement(typeAlias, data)
} }
@@ -666,6 +671,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformRegularClass(regularClass, data) return transformRegularClass(regularClass, data)
} }
final override fun visitSealedClass(sealedClass: FirSealedClass, data: D): CompositeTransformResult<FirStatement> {
return transformSealedClass(sealedClass, data)
}
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirDeclaration> { final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): CompositeTransformResult<FirDeclaration> {
return transformTypeAlias(typeAlias, data) return transformTypeAlias(typeAlias, data)
} }
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
@@ -180,6 +181,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitRegularClass(regularClass: FirRegularClass, data: D): R = visitElement(regularClass, data) open fun visitRegularClass(regularClass: FirRegularClass, data: D): R = visitElement(regularClass, data)
open fun visitSealedClass(sealedClass: FirSealedClass, data: D): R = visitElement(sealedClass, data)
open fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): R = visitElement(typeAlias, data) open fun visitTypeAlias(typeAlias: FirTypeAlias, data: D): R = visitElement(typeAlias, data)
open fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitElement(enumEntry, data) open fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitElement(enumEntry, data)
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSealedClass
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
@@ -240,6 +241,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(regularClass) visitElement(regularClass)
} }
open fun visitSealedClass(sealedClass: FirSealedClass) {
visitElement(sealedClass)
}
open fun visitTypeAlias(typeAlias: FirTypeAlias) { open fun visitTypeAlias(typeAlias: FirTypeAlias) {
visitElement(typeAlias) visitElement(typeAlias)
} }
@@ -664,6 +669,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitRegularClass(regularClass) visitRegularClass(regularClass)
} }
final override fun visitSealedClass(sealedClass: FirSealedClass, data: Nothing?) {
visitSealedClass(sealedClass)
}
final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Nothing?) { final override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Nothing?) {
visitTypeAlias(typeAlias) visitTypeAlias(typeAlias)
} }
@@ -43,6 +43,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val klass = element("Class", Declaration, declaration, statement, annotationContainer) val klass = element("Class", Declaration, declaration, statement, annotationContainer)
val classLikeDeclaration = element("ClassLikeDeclaration", Declaration, statement, memberDeclaration, symbolOwner, typeParametersOwner) val classLikeDeclaration = element("ClassLikeDeclaration", Declaration, statement, memberDeclaration, symbolOwner, typeParametersOwner)
val regularClass = element("RegularClass", Declaration, namedDeclaration, classLikeDeclaration, klass) val regularClass = element("RegularClass", Declaration, namedDeclaration, classLikeDeclaration, klass)
val sealedClass = element("SealedClass", Declaration, regularClass)
val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration) val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration)
val enumEntry = element("EnumEntry", Declaration, regularClass) val enumEntry = element("EnumEntry", Declaration, regularClass)
@@ -61,12 +61,20 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
kind = Interface kind = Interface
} }
impl(regularClass, "FirClassImpl") { val modifiableRegularClass = impl(regularClass, "FirModifiableRegularClass") {
parents += modifiableClass parents += modifiableClass
parents += modifiableTypeParametersOwner parents += modifiableTypeParametersOwner
kind = Interface
}
val regularClassConfig: ImplementationContext.() -> Unit = {
parents += modifiableRegularClass
defaultNull("companionObject") defaultNull("companionObject")
defaultSupertypesComputationStatus() defaultSupertypesComputationStatus()
} }
impl(regularClass, "FirClassImpl", regularClassConfig)
impl(sealedClass, config = regularClassConfig)
impl(anonymousObject) { impl(anonymousObject) {
parents += modifiableClass parents += modifiableClass
@@ -220,6 +220,10 @@ object NodeConfigurator : AbstractFieldConfigurator() {
+superTypeRefs(withReplace = true) +superTypeRefs(withReplace = true)
} }
sealedClass.configure {
+fieldList("inheritors", classIdType, withReplace = true)
}
typeAlias.configure { typeAlias.configure {
parentArg(classLikeDeclaration, "F", typeAlias) parentArg(classLikeDeclaration, "F", typeAlias)
+symbol("FirTypeAliasSymbol") +symbol("FirTypeAliasSymbol")
@@ -289,7 +289,7 @@ fun PrintWriter.printImplementation(implementation: Implementation) {
} }
} }
element.allFields.filter { it.type.contains("Symbol") } element.allFields.filter { it.type.contains("Symbol") && it !is FieldList }
.takeIf { it.isNotEmpty() && !isInterface && !element.type.contains("Reference")} .takeIf { it.isNotEmpty() && !isInterface && !element.type.contains("Reference")}
?.let { symbolFields -> ?.let { symbolFields ->
indent(1) indent(1)
@@ -338,7 +338,7 @@ fun PrintWriter.printImplementation(implementation: Implementation) {
} }
else -> { else -> {
if (type == "FirClassImpl" && field.name == "declarations") { if (type in setOf("FirClassImpl", "FirSealedClassImpl") && field.name == "declarations") {
indent(2) indent(2)
println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }") println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.forEach { it.accept(visitor, data) }")
} }
@@ -413,7 +413,7 @@ fun PrintWriter.printImplementation(implementation: Implementation) {
} }
field.name in setOf("dispatchReceiver", "extensionReceiver") -> { field.name in setOf("dispatchReceiver", "extensionReceiver") -> {
} }
type == "FirClassImpl" && field.name == "declarations" -> { type in setOf("FirClassImpl", "FirSealedClassImpl") && field.name == "declarations" -> {
indent(2) indent(2)
println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data)") println("(declarations.firstOrNull { it is FirConstructorImpl } as? FirConstructorImpl)?.typeParameters?.transformInplace(transformer, data)")
indent(2) indent(2)
@@ -59,3 +59,4 @@ val compositeTransformResultType = type("fir.visitors", "CompositeTransformResul
val abstractFirBasedSymbolType = type("fir.symbols", "AbstractFirBasedSymbol") val abstractFirBasedSymbolType = type("fir.symbols", "AbstractFirBasedSymbol")
val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol") val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol")
val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol") val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol")
val classSymbolType = type("fir.symbols.impl", "FirClassSymbol")