[FIR] Add specific symbols for value parameters and enum entries

Make FirVariableSymbol a sealed class
This commit is contained in:
Dmitriy Novozhilov
2021-06-26 11:54:02 +03:00
parent 62d781a70f
commit 511e564b20
30 changed files with 92 additions and 84 deletions
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -35,7 +35,6 @@ abstract class FirEnumEntry : FirVariable<FirEnumEntry>() {
abstract override val containerSource: DeserializedContainerSource?
abstract override val dispatchReceiverType: ConeKotlinType?
abstract override val name: Name
abstract override val symbol: FirVariableSymbol<FirEnumEntry>
abstract override val initializer: FirExpression?
abstract override val delegate: FirExpression?
abstract override val isVar: Boolean
@@ -43,6 +42,7 @@ abstract class FirEnumEntry : FirVariable<FirEnumEntry>() {
abstract override val getter: FirPropertyAccessor?
abstract override val setter: FirPropertyAccessor?
abstract override val annotations: List<FirAnnotationCall>
abstract override val symbol: FirEnumEntrySymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitEnumEntry(this, data)
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -36,7 +36,6 @@ abstract class FirValueParameter : FirVariable<FirValueParameter>(), FirControlF
abstract override val containerSource: DeserializedContainerSource?
abstract override val dispatchReceiverType: ConeKotlinType?
abstract override val name: Name
abstract override val symbol: FirVariableSymbol<FirValueParameter>
abstract override val initializer: FirExpression?
abstract override val delegate: FirExpression?
abstract override val isVar: Boolean
@@ -45,6 +44,7 @@ abstract class FirValueParameter : FirVariable<FirValueParameter>(), FirControlF
abstract override val setter: FirPropertyAccessor?
abstract override val annotations: List<FirAnnotationCall>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirValueParameterSymbol
abstract val defaultValue: FirExpression?
abstract val isCrossinline: Boolean
abstract val isNoinline: Boolean
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -45,7 +45,6 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
var receiverTypeRef: FirTypeRef? = null
var containerSource: DeserializedContainerSource? = null
var dispatchReceiverType: ConeKotlinType? = null
lateinit var symbol: FirVariableSymbol<FirValueParameter>
var initializer: FirExpression? = null
var delegate: FirExpression? = null
var isVar: Boolean = false
@@ -53,6 +52,7 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
var getter: FirPropertyAccessor? = null
var setter: FirPropertyAccessor? = null
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
lateinit var symbol: FirValueParameterSymbol
var defaultValue: FirExpression? = null
var isCrossinline: Boolean = false
var isNoinline: Boolean = false
@@ -69,7 +69,6 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
receiverTypeRef,
containerSource,
dispatchReceiverType,
symbol,
initializer,
delegate,
isVar,
@@ -77,6 +76,7 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
getter,
setter,
annotations,
symbol,
defaultValue,
isCrossinline,
isNoinline,
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -45,9 +45,9 @@ class FirEnumEntryBuilder : FirAnnotationContainerBuilder {
var containerSource: DeserializedContainerSource? = null
var dispatchReceiverType: ConeKotlinType? = null
lateinit var name: Name
lateinit var symbol: FirVariableSymbol<FirEnumEntry>
var initializer: FirExpression? = null
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
lateinit var symbol: FirEnumEntrySymbol
override fun build(): FirEnumEntry {
return FirEnumEntryImpl(
@@ -62,9 +62,9 @@ class FirEnumEntryBuilder : FirAnnotationContainerBuilder {
containerSource,
dispatchReceiverType,
name,
symbol,
initializer,
annotations,
symbol,
)
}
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -45,8 +45,8 @@ open class FirValueParameterBuilder : FirAnnotationContainerBuilder {
open var containerSource: DeserializedContainerSource? = null
open var dispatchReceiverType: ConeKotlinType? = null
open lateinit var name: Name
open lateinit var symbol: FirVariableSymbol<FirValueParameter>
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
open lateinit var symbol: FirValueParameterSymbol
open var defaultValue: FirExpression? = null
open var isCrossinline: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
open var isNoinline: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
@@ -63,8 +63,8 @@ open class FirValueParameterBuilder : FirAnnotationContainerBuilder {
containerSource,
dispatchReceiverType,
name,
symbol,
annotations,
symbol,
defaultValue,
isCrossinline,
isNoinline,
@@ -97,8 +97,8 @@ inline fun buildValueParameterCopy(original: FirValueParameter, init: FirValuePa
copyBuilder.containerSource = original.containerSource
copyBuilder.dispatchReceiverType = original.dispatchReceiverType
copyBuilder.name = original.name
copyBuilder.symbol = original.symbol
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.symbol = original.symbol
copyBuilder.defaultValue = original.defaultValue
copyBuilder.isCrossinline = original.isCrossinline
copyBuilder.isNoinline = original.isNoinline
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -40,7 +40,6 @@ internal class FirDefaultSetterValueParameter(
override var receiverTypeRef: FirTypeRef?,
override val containerSource: DeserializedContainerSource?,
override val dispatchReceiverType: ConeKotlinType?,
override val symbol: FirVariableSymbol<FirValueParameter>,
override var initializer: FirExpression?,
override var delegate: FirExpression?,
override val isVar: Boolean,
@@ -48,6 +47,7 @@ internal class FirDefaultSetterValueParameter(
override var getter: FirPropertyAccessor?,
override var setter: FirPropertyAccessor?,
override val annotations: MutableList<FirAnnotationCall>,
override val symbol: FirValueParameterSymbol,
override var defaultValue: FirExpression?,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -40,9 +40,9 @@ internal class FirEnumEntryImpl(
override val containerSource: DeserializedContainerSource?,
override val dispatchReceiverType: ConeKotlinType?,
override val name: Name,
override val symbol: FirVariableSymbol<FirEnumEntry>,
override var initializer: FirExpression?,
override val annotations: MutableList<FirAnnotationCall>,
override val symbol: FirEnumEntrySymbol,
) : FirEnumEntry() {
override val receiverTypeRef: FirTypeRef? get() = null
override val delegate: FirExpression? get() = null
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.name.Name
@@ -40,8 +40,8 @@ internal class FirValueParameterImpl(
override val containerSource: DeserializedContainerSource?,
override val dispatchReceiverType: ConeKotlinType?,
override val name: Name,
override val symbol: FirVariableSymbol<FirValueParameter>,
override val annotations: MutableList<FirAnnotationCall>,
override val symbol: FirValueParameterSymbol,
override var defaultValue: FirExpression?,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirImplicitStringTypeRef
@@ -93,7 +93,7 @@ fun FirRegularClassBuilder.generateValueOfFunction(
this.moduleData = moduleData
returnTypeRef = FirImplicitStringTypeRef(source)
name = VALUE
this@vp.symbol = FirVariableSymbol(VALUE)
this@vp.symbol = FirValueParameterSymbol(VALUE)
isCrossinline = false
isNoinline = false
isVararg = false
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildDefaultSetterValueParameter
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
@@ -120,7 +121,7 @@ class FirDefaultPropertySetter(
this@builder.moduleData = moduleData
this@builder.origin = origin
this@builder.returnTypeRef = propertyTypeRef
this@builder.symbol = FirVariableSymbol(CallableId(FqName.ROOT, Name.special("<default-setter-parameter>")))
this@builder.symbol = FirValueParameterSymbol(Name.special("<default-setter-parameter>"))
}
),
isGetter = false,
@@ -5,19 +5,14 @@
package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
open class FirVariableSymbol<E : FirVariable<E>>(override val callableId: CallableId) : FirCallableSymbol<E>() {
constructor(name: Name) : this(CallableId(name)) // TODO?
}
sealed class FirVariableSymbol<E : FirVariable<E>>(override val callableId: CallableId) : FirCallableSymbol<E>()
open class FirPropertySymbol(
callableId: CallableId,
@@ -40,6 +35,13 @@ class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProp
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId)
class FirEnumEntrySymbol(callableId: CallableId) : FirVariableSymbol<FirEnumEntry>(callableId)
class FirValueParameterSymbol(name: Name) : FirVariableSymbol<FirValueParameter>(CallableId(name)) {
val name: Name
get() = callableId.callableName
}
class FirErrorPropertySymbol(
val diagnostic: ConeDiagnostic
) : FirVariableSymbol<FirErrorProperty>(CallableId(FqName.ROOT, null, NAME)) {
@@ -46,11 +46,6 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+annotations
}
// symbolOwner.configure {
// withArg("DE, symbolOwner, declaration)
// +symbolWithPackage("fir.symbols", "FirBasedSymbol", "DE)
// }
typeParameterRef.configure {
+symbol(typeParameterSymbolType.type)
}
@@ -383,6 +378,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
valueParameter.configure {
parentArg(variable, "E", valueParameter)
+symbol("FirValueParameterSymbol")
+field("defaultValue", expression, nullable = true)
generateBooleanFields("crossinline", "noinline", "vararg")
}
@@ -408,6 +404,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
enumEntry.configure {
parentArg(variable, "E", enumEntry)
+symbol("FirEnumEntrySymbol")
}
field.configure {
@@ -417,7 +414,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
anonymousInitializer.configure {
parentArg(declaration, "E", anonymousInitializer)
+body(nullable = true)
+symbol(anonymousInitializerSymbolType.type)
+symbol("FirAnonymousInitializerSymbol")
}
file.configure {
@@ -426,7 +423,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+declarations.withTransform()
+stringField("name")
+field("packageFqName", fqNameType)
+symbol(fileSymbolType.type)
+symbol("FirFileSymbol")
}
import.configure {
@@ -71,8 +71,6 @@ val classLikeSymbolType = type("fir.symbols.impl", "FirClassLikeSymbol<*>")
val typeParameterSymbolType = type("fir.symbols.impl", "FirTypeParameterSymbol")
val emptyArgumentListType = type("fir.expressions", "FirEmptyArgumentList")
val firScopeProviderType = type("fir.scopes", "FirScopeProvider")
val anonymousInitializerSymbolType = type("fir.symbols.impl", "FirAnonymousInitializerSymbol")
val fileSymbolType = type("fir.symbols.impl", "FirFileSymbol")
val pureAbstractElementType = generatedType("FirPureAbstractElement")
val coneEffectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration")