[FIR] introduce FirValueParameter.containingFunctionSymbol

^KT-55034 fixed
This commit is contained in:
Ilya Kirillov
2022-07-20 16:01:48 +02:00
parent c8e3103af9
commit 7781ad67d4
39 changed files with 175 additions and 76 deletions
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.psi
@@ -114,6 +115,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
override fun convertValueParameter(
valueParameter: KtParameter,
functionSymbol: FirFunctionSymbol<*>,
defaultTypeRef: FirTypeRef?,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation>
@@ -122,6 +124,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
check(replacementParameter is KtParameter)
return super.convertValueParameter(
valueParameter = replacementParameter,
functionSymbol = functionSymbol,
defaultTypeRef = defaultTypeRef,
valueParameterDeclaration = valueParameterDeclaration,
additionalAnnotations = additionalAnnotations
@@ -303,6 +303,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
dispatchReceiverType = c.dispatchReceiver
valueParameters += local.memberDeserializer.valueParameters(
listOf(proto.setterValueParameter),
symbol,
proto,
AbstractAnnotationDeserializer.CallableKind.PROPERTY_SETTER,
classProto
@@ -504,6 +505,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
valueParameters += local.memberDeserializer.valueParameters(
proto.valueParameterList,
symbol,
proto,
AbstractAnnotationDeserializer.CallableKind.OTHERS,
classProto
@@ -581,6 +583,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
.map { buildConstructedClassTypeParameterRef { this.symbol = it.symbol } }
valueParameters += local.memberDeserializer.valueParameters(
proto.valueParameterList,
symbol,
proto,
AbstractAnnotationDeserializer.CallableKind.OTHERS,
classProto,
@@ -607,6 +610,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
private fun valueParameters(
valueParameters: List<ProtoBuf.ValueParameter>,
functionSymbol: FirFunctionSymbol<*>,
callableProto: MessageLite,
callableKind: AbstractAnnotationDeserializer.CallableKind,
classProto: ProtoBuf.Class?,
@@ -617,6 +621,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
val name = c.nameResolver.getName(proto.name)
buildValueParameter {
moduleData = c.moduleData
this.containingFunctionSymbol = functionSymbol
origin = FirDeclarationOrigin.Library
returnTypeRef = proto.type(c.typeTable).toTypeRef(c)
this.name = name
@@ -328,6 +328,7 @@ private class SyntheticFunctionalInterfaceCache(private val moduleData: FirModul
val parameterName = Name.identifier("p${index + 1}")
buildValueParameter {
moduleData = this@SyntheticFunctionalInterfaceCache.moduleData
containingFunctionSymbol = this@buildSimpleFunction.symbol
origin = FirDeclarationOrigin.BuiltIns
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
returnTypeRef = typeArgument
@@ -264,10 +264,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
returnType: IrType,
otherParameterNeeded: Boolean = false
): IrFunction {
val functionSymbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name))
val firFunction = buildSimpleFunction {
origin = FirDeclarationOrigin.Synthetic
this.name = name
this.symbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name))
this.symbol = functionSymbol
this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
moduleData = components.session.moduleData
this.returnTypeRef = when (returnType) {
@@ -284,6 +285,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
moduleData = components.session.moduleData
this.returnTypeRef = FirImplicitNullableAnyTypeRef(null)
this.symbol = FirValueParameterSymbol(this.name)
containingFunctionSymbol = functionSymbol
isCrossinline = false
isNoinline = false
isVararg = false
@@ -468,6 +468,7 @@ abstract class FirJavaFacade(
javaClass.recordComponents.mapTo(valueParameters) { component ->
buildJavaValueParameter {
containingFunctionSymbol = this@buildJavaConstructor.symbol
source = component.toSourceElement(KtFakeSourceElementKind.ImplicitRecordConstructorParameter)
this.moduleData = moduleData
isFromSource = component.isFromSource
@@ -578,7 +579,7 @@ abstract class FirJavaFacade(
isStatic = javaMethod.isStatic
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack, methodSymbol, moduleData)
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
valueParameters += valueParameter.toFirValueParameter(session, methodSymbol, moduleData, index, javaTypeParameterStack)
}
annotationBuilder = { javaMethod.convertAnnotationsToFir(session, javaTypeParameterStack) }
status = FirResolvedDeclarationStatusImpl(
@@ -623,6 +624,7 @@ abstract class FirJavaFacade(
this.moduleData = moduleData
isFromSource = javaMethod.isFromSource
returnTypeRef = firJavaMethod.returnTypeRef
containingFunctionSymbol = firJavaMethod.symbol
name = javaMethod.name
isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME
annotationBuilder = { emptyList() }
@@ -669,7 +671,7 @@ abstract class FirJavaFacade(
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack, constructorSymbol, moduleData)
annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) }
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
valueParameters += valueParameter.toFirValueParameter(session, constructorSymbol, moduleData, index, javaTypeParameterStack)
}
} else {
annotationBuilder = { emptyList() }
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -40,6 +41,7 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
override val symbol: FirValueParameterSymbol,
annotationBuilder: () -> List<FirAnnotation>,
override var defaultValue: FirExpression?,
override val containingFunctionSymbol: FirFunctionSymbol<*>,
override val isVararg: Boolean,
) : FirValueParameter() {
init {
@@ -197,6 +199,7 @@ class FirJavaValueParameterBuilder {
lateinit var name: Name
lateinit var annotationBuilder: () -> List<FirAnnotation>
var defaultValue: FirExpression? = null
lateinit var containingFunctionSymbol: FirFunctionSymbol<*>
var isVararg: Boolean by Delegates.notNull()
var isFromSource: Boolean by Delegates.notNull()
@@ -213,6 +216,7 @@ class FirJavaValueParameterBuilder {
symbol = FirValueParameterSymbol(name),
annotationBuilder,
defaultValue,
containingFunctionSymbol,
isVararg,
)
}
@@ -237,6 +241,7 @@ inline fun buildJavaValueParameterCopy(original: FirValueParameter, init: FirJav
val annotations = original.annotations
copyBuilder.annotationBuilder = { annotations }
copyBuilder.defaultValue = original.defaultValue
copyBuilder.containingFunctionSymbol = original.containingFunctionSymbol
copyBuilder.isVararg = original.isVararg
return copyBuilder.apply(init).build()
}
@@ -236,29 +236,12 @@ class FirSignatureEnhancement(
)
}
val newValueParameters = firMethod.valueParameters.zip(enhancedValueParameterTypes) { valueParameter, enhancedReturnType ->
valueParameter.defaultValue?.replaceTypeRef(enhancedReturnType)
buildValueParameter {
source = valueParameter.source
moduleData = this@FirSignatureEnhancement.moduleData
origin = FirDeclarationOrigin.Enhancement
returnTypeRef = enhancedReturnType
this.name = valueParameter.name
symbol = FirValueParameterSymbol(this.name)
defaultValue = valueParameter.defaultValue
isCrossinline = valueParameter.isCrossinline
isNoinline = valueParameter.isNoinline
isVararg = valueParameter.isVararg
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
annotations += valueParameter.annotations
}
}
val functionSymbol: FirFunctionSymbol<*>
var isJavaRecordComponent = false
val function = when (firMethod) {
is FirJavaConstructor -> {
val symbol = FirConstructorSymbol(methodId)
val symbol = FirConstructorSymbol(methodId).also { functionSymbol = it }
if (firMethod.isPrimary) {
FirPrimaryConstructorBuilder().apply {
returnTypeRef = newReturnTypeRef
@@ -294,7 +277,6 @@ class FirSignatureEnhancement(
moduleData = this@FirSignatureEnhancement.moduleData
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Enhancement
this.valueParameters += newValueParameters
this.typeParameters += firMethod.typeParameters
}
}
@@ -315,9 +297,8 @@ class FirSignatureEnhancement(
this.name = name!!
status = firMethod.status
symbol = FirNamedFunctionSymbol(methodId)
symbol = FirNamedFunctionSymbol(methodId).also { functionSymbol = it }
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
valueParameters += newValueParameters
typeParameters += firMethod.typeParameters
dispatchReceiverType = firMethod.dispatchReceiverType
attributes = firMethod.attributes.copy()
@@ -325,6 +306,26 @@ class FirSignatureEnhancement(
}
else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}")
}.apply {
val newValueParameters = firMethod.valueParameters.zip(enhancedValueParameterTypes) { valueParameter, enhancedReturnType ->
valueParameter.defaultValue?.replaceTypeRef(enhancedReturnType)
buildValueParameter {
source = valueParameter.source
containingFunctionSymbol = functionSymbol
moduleData = this@FirSignatureEnhancement.moduleData
origin = FirDeclarationOrigin.Enhancement
returnTypeRef = enhancedReturnType
this.name = valueParameter.name
symbol = FirValueParameterSymbol(this.name)
defaultValue = valueParameter.defaultValue
isCrossinline = valueParameter.isCrossinline
isNoinline = valueParameter.isNoinline
isVararg = valueParameter.isVararg
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
annotations += valueParameter.annotations
}
}
this.valueParameters += newValueParameters
annotations += firMethod.annotations
deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(fromJava = true, session.firCachesFactory)
}.build().apply {
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.*
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -53,12 +55,17 @@ internal fun MutableList<FirAnnotation>.addFromJava(
}
internal fun JavaValueParameter.toFirValueParameter(
session: FirSession, moduleData: FirModuleData, index: Int, javaTypeParameterStack: JavaTypeParameterStack
session: FirSession,
functionSymbol: FirFunctionSymbol<*>,
moduleData: FirModuleData,
index: Int,
javaTypeParameterStack: JavaTypeParameterStack,
): FirValueParameter {
return buildJavaValueParameter {
source = (this@toFirValueParameter as? JavaElementImpl<*>)?.psi?.toKtPsiSourceElement()
isFromSource = this@toFirValueParameter.isFromSource
this.moduleData = moduleData
containingFunctionSymbol = functionSymbol
name = this@toFirValueParameter.name ?: Name.identifier("p$index")
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
isVararg = this@toFirValueParameter.isVararg
@@ -155,6 +155,7 @@ class FirDynamicMembersStorage(val session: FirSession) : FirSessionComponent {
val parameter = buildValueParameter {
moduleData = session.moduleData
containingFunctionSymbol = this@buildSimpleFunction.symbol
origin = FirDeclarationOrigin.DynamicScope
returnTypeRef = anyArrayTypeRef
this.name = Name.identifier("args")
@@ -191,12 +191,13 @@ object FirFakeOverrideGenerator {
newContextReceiverTypes: List<ConeKotlinType?>?,
newReturnType: ConeKotlinType?,
fakeOverrideSubstitution: FakeOverrideSubstitution?,
symbolForOverride: FirBasedSymbol<*>,
symbolForOverride: FirFunctionSymbol<*>,
): List<FirTypeParameterRef> {
return when {
baseFunction.typeParameters.isEmpty() -> {
configureAnnotationsAndSignature(
baseFunction,
symbolForOverride,
newParameterTypes,
newReceiverType,
newContextReceiverTypes,
@@ -222,6 +223,7 @@ object FirFakeOverrideGenerator {
}
configureAnnotationsAndSignature(
baseFunction,
symbolForOverride,
copiedParameterTypes,
copiedReceiverType,
copiedContextReceiverTypes,
@@ -233,6 +235,7 @@ object FirFakeOverrideGenerator {
else -> {
configureAnnotationsAndSignature(
baseFunction,
symbolForOverride,
newParameterTypes,
newReceiverType,
newContextReceiverTypes,
@@ -246,6 +249,7 @@ object FirFakeOverrideGenerator {
private fun FirFunctionBuilder.configureAnnotationsAndSignature(
baseFunction: FirFunction,
fakeFunctionSymbol: FirFunctionSymbol<*>,
newParameterTypes: List<ConeKotlinType?>?,
newReceiverType: ConeKotlinType?,
newContextReceiverTypes: List<ConeKotlinType?>?,
@@ -280,6 +284,7 @@ object FirFakeOverrideGenerator {
origin = FirDeclarationOrigin.SubstitutionOverride
returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newType)
symbol = FirValueParameterSymbol(valueParameter.name)
containingFunctionSymbol = fakeFunctionSymbol
}.apply {
originalForSubstitutionOverrideAttr = valueParameter
}
@@ -861,12 +861,13 @@ class DeclarationsConverter(
) return null
if (primaryConstructor == null && classWrapper.isInterface()) return null
val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor())
var modifiers = Modifier()
val valueParameters = mutableListOf<ValueParameter>()
primaryConstructor?.forEachChildren {
when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it)
VALUE_PARAMETER_LIST -> valueParameters += convertValueParameters(it, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
VALUE_PARAMETER_LIST -> valueParameters += convertValueParameters(it, constructorSymbol, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
}
}
@@ -915,7 +916,7 @@ class DeclarationsConverter(
returnTypeRef = classWrapper.delegatedSelfTypeRef
dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor()
this.status = status
symbol = FirConstructorSymbol(callableIdForClassConstructor())
symbol = constructorSymbol
annotations += modifiers.annotations
typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters)
this.valueParameters += valueParameters.map { it.firValueParameter }
@@ -957,10 +958,11 @@ class DeclarationsConverter(
var constructorDelegationCall: FirDelegatedConstructorCall? = null
var block: LighterASTNode? = null
val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor())
secondaryConstructor.forEachChildren {
when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it)
VALUE_PARAMETER_LIST -> firValueParameters += convertValueParameters(it, ValueParameterDeclaration.FUNCTION)
VALUE_PARAMETER_LIST -> firValueParameters += convertValueParameters(it, constructorSymbol, ValueParameterDeclaration.FUNCTION)
CONSTRUCTOR_DELEGATION_CALL -> constructorDelegationCall = convertConstructorDelegationCall(it, classWrapper)
BLOCK -> block = it
}
@@ -985,7 +987,7 @@ class DeclarationsConverter(
returnTypeRef = delegatedSelfTypeRef
dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor()
this.status = status
symbol = FirConstructorSymbol(callableIdForClassConstructor())
symbol = constructorSymbol
delegatedConstructor = constructorDelegationCall
context.firFunctionTargets += target
@@ -1346,8 +1348,10 @@ class DeclarationsConverter(
var isGetter = true
var returnType: FirTypeRef? = null
val propertyTypeRefToUse = propertyTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
val accessorSymbol = FirPropertyAccessorSymbol()
var firValueParameters: FirValueParameter = buildDefaultSetterValueParameter {
moduleData = baseModuleData
containingFunctionSymbol = accessorSymbol
origin = FirDeclarationOrigin.Source
returnTypeRef = propertyTypeRefToUse
symbol = FirValueParameterSymbol(StandardNames.DEFAULT_VALUE_PARAMETER)
@@ -1355,6 +1359,8 @@ class DeclarationsConverter(
var block: LighterASTNode? = null
var expression: LighterASTNode? = null
var outerContractDescription: FirContractDescription? = null
getterOrSetter.forEachChildren {
if (it.asText == "set") isGetter = false
when (it.tokenType) {
@@ -1362,7 +1368,7 @@ class DeclarationsConverter(
MODIFIER_LIST -> modifiers = convertModifierList(it)
TYPE_REFERENCE -> returnType = convertType(it)
VALUE_PARAMETER_LIST -> firValueParameters = convertSetterParameter(
it, propertyTypeRefToUse, propertyModifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER)
it, accessorSymbol, propertyTypeRefToUse, propertyModifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER)
)
CONTRACT_EFFECT_LIST -> outerContractDescription = obtainContractDescription(it)
BLOCK -> block = it
@@ -1409,7 +1415,7 @@ class DeclarationsConverter(
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
returnTypeRef = returnType ?: if (isGetter) propertyTypeRefToUse else implicitUnitType
symbol = FirPropertyAccessorSymbol()
symbol = accessorSymbol
this.isGetter = isGetter
this.status = status
context.firFunctionTargets += target
@@ -1536,6 +1542,7 @@ class DeclarationsConverter(
*/
private fun convertSetterParameter(
setterParameter: LighterASTNode,
functionSymbol: FirFunctionSymbol<*>,
propertyTypeRef: FirTypeRef,
additionalAnnotations: List<FirAnnotation>
): FirValueParameter {
@@ -1544,12 +1551,13 @@ class DeclarationsConverter(
setterParameter.forEachChildren {
when (it.tokenType) {
MODIFIER_LIST -> modifiers = convertModifierList(it)
VALUE_PARAMETER -> firValueParameter = convertValueParameter(it, ValueParameterDeclaration.SETTER).firValueParameter
VALUE_PARAMETER -> firValueParameter = convertValueParameter(it, functionSymbol, ValueParameterDeclaration.SETTER).firValueParameter
}
}
return buildValueParameter {
source = firValueParameter.source
containingFunctionSymbol = functionSymbol
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
returnTypeRef = if (firValueParameter.returnTypeRef == implicitType) propertyTypeRef else firValueParameter.returnTypeRef
@@ -1672,6 +1680,7 @@ class DeclarationsConverter(
valueParametersList?.let { list ->
valueParameters += convertValueParameters(
list,
functionSymbol,
if (isAnonymousFunction) ValueParameterDeclaration.LAMBDA else ValueParameterDeclaration.FUNCTION
).map { it.firValueParameter }
}
@@ -2224,12 +2233,13 @@ class DeclarationsConverter(
*/
fun convertValueParameters(
valueParameters: LighterASTNode,
functionSymbol: FirFunctionSymbol<*>,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList()
): List<ValueParameter> {
return valueParameters.forEachChildrenReturnList { node, container ->
when (node.tokenType) {
VALUE_PARAMETER -> container += convertValueParameter(node, valueParameterDeclaration, additionalAnnotations)
VALUE_PARAMETER -> container += convertValueParameter(node, functionSymbol, valueParameterDeclaration, additionalAnnotations)
}
}
}
@@ -2239,6 +2249,7 @@ class DeclarationsConverter(
*/
fun convertValueParameter(
valueParameter: LighterASTNode,
functionSymbol: FirFunctionSymbol<*>?,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList()
): ValueParameter {
@@ -2278,6 +2289,7 @@ class DeclarationsConverter(
additionalAnnotations = additionalAnnotations,
name = name,
defaultValue = firExpression,
containingFunctionSymbol = functionSymbol,
destructuringDeclaration = destructuringDeclaration
)
}
@@ -136,9 +136,11 @@ class ExpressionsConverter(
val valueParameterList = mutableListOf<ValueParameter>()
var block: LighterASTNode? = null
var hasArrow = false
val functionSymbol = FirAnonymousFunctionSymbol()
lambdaExpression.getChildNodesByType(FUNCTION_LITERAL).first().forEachChildren {
when (it.tokenType) {
VALUE_PARAMETER_LIST -> valueParameterList += declarationsConverter.convertValueParameters(it, ValueParameterDeclaration.LAMBDA)
VALUE_PARAMETER_LIST -> valueParameterList += declarationsConverter.convertValueParameters(it, functionSymbol, ValueParameterDeclaration.LAMBDA)
BLOCK -> block = it
ARROW -> hasArrow = true
}
@@ -152,7 +154,7 @@ class ExpressionsConverter(
origin = FirDeclarationOrigin.Source
returnTypeRef = implicitType
receiverParameter = implicitType.asReceiverParameter()
symbol = FirAnonymousFunctionSymbol()
symbol = functionSymbol
isLambda = true
hasExplicitParameterList = hasArrow
label = context.getLastLabel(lambdaExpression) ?: context.calleeNamesForLambda.lastOrNull()?.let {
@@ -170,6 +172,7 @@ class ExpressionsConverter(
val name = SpecialNames.DESTRUCT
val multiParameter = buildValueParameter {
source = valueParameter.firValueParameter.source
containingFunctionSymbol = functionSymbol
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
returnTypeRef = valueParameter.firValueParameter.returnTypeRef
@@ -1074,7 +1077,7 @@ class ExpressionsConverter(
var blockNode: LighterASTNode? = null
forLoop.forEachChildren {
when (it.tokenType) {
VALUE_PARAMETER -> parameter = declarationsConverter.convertValueParameter(it, ValueParameterDeclaration.FOR_LOOP)
VALUE_PARAMETER -> parameter = declarationsConverter.convertValueParameter(it, null, ValueParameterDeclaration.FOR_LOOP)
LOOP_RANGE -> rangeExpression = getAsFirExpression(it, "No range in for loop")
BODY -> blockNode = it
}
@@ -1229,7 +1232,7 @@ class ExpressionsConverter(
var blockNode: LighterASTNode? = null
catchClause.forEachChildren {
when (it.tokenType) {
VALUE_PARAMETER_LIST -> valueParameter = declarationsConverter.convertValueParameters(it, ValueParameterDeclaration.CATCH)
VALUE_PARAMETER_LIST -> valueParameter = declarationsConverter.convertValueParameters(it, FirAnonymousFunctionSymbol()/*TODO*/, ValueParameterDeclaration.CATCH)
.firstOrNull() ?: return null
BLOCK -> blockNode = it
}
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.builder.buildPropertyAccessExpression
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
import org.jetbrains.kotlin.fir.references.builder.buildPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
@@ -54,6 +55,7 @@ class ValueParameter(
private val additionalAnnotations: List<FirAnnotation>,
val name: Name,
val defaultValue: FirExpression?,
private val containingFunctionSymbol: FirFunctionSymbol<*>?,
val destructuringDeclaration: DestructuringDeclaration? = null
) {
fun hasValOrVar(): Boolean {
@@ -85,6 +87,9 @@ class ValueParameter(
isCrossinline = modifiers.hasCrossinline()
isNoinline = modifiers.hasNoinline()
isVararg = modifiers.hasVararg()
containingFunctionSymbol = this@ValueParameter.containingFunctionSymbol
?: error("containingFunctionSymbol should present when converting ValueParameter to a FirValueParameter")
annotations += this@ValueParameter.annotations
annotations += additionalAnnotations
}
@@ -202,10 +202,11 @@ open class RawFirBuilder(
open fun convertValueParameter(
valueParameter: KtParameter,
functionSymbol: FirFunctionSymbol<*>,
defaultTypeRef: FirTypeRef? = null,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList()
): FirValueParameter = valueParameter.toFirValueParameter(defaultTypeRef, valueParameterDeclaration, additionalAnnotations)
): FirValueParameter = valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations)
private fun KtTypeReference?.toFirOrImplicitType(): FirTypeRef =
convertSafe() ?: buildImplicitTypeRef {
@@ -430,8 +431,9 @@ open class RawFirBuilder(
extractAnnotationsTo(this)
annotations += accessorAnnotationsFromProperty
this@RawFirBuilder.context.firFunctionTargets += accessorTarget
symbol = FirPropertyAccessorSymbol()
extractValueParametersTo(
this, ValueParameterDeclaration.SETTER, propertyTypeRefToUse, parameterAnnotationsFromProperty
this, symbol, ValueParameterDeclaration.SETTER, propertyTypeRefToUse, parameterAnnotationsFromProperty
)
if (!isGetter && valueParameters.isEmpty()) {
valueParameters += buildDefaultSetterValueParameter {
@@ -443,7 +445,6 @@ open class RawFirBuilder(
annotations += parameterAnnotationsFromProperty
}
}
symbol = FirPropertyAccessorSymbol()
val outerContractDescription = this@toFirPropertyAccessor.obtainContractDescription()
val bodyWithContractDescription = this@toFirPropertyAccessor.buildFirBody()
this.body = bodyWithContractDescription.first
@@ -546,8 +547,9 @@ open class RawFirBuilder(
private fun KtParameter.toFirValueParameter(
defaultTypeRef: FirTypeRef?,
functionSymbol: FirFunctionSymbol<*>,
valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation>
additionalAnnotations: List<FirAnnotation>,
): FirValueParameter {
val name = convertValueParameterName(nameAsSafeName, nameIdentifier?.node?.text, valueParameterDeclaration)
return buildValueParameter {
@@ -571,6 +573,7 @@ open class RawFirBuilder(
isCrossinline = hasModifier(CROSSINLINE_KEYWORD)
isNoinline = hasModifier(NOINLINE_KEYWORD)
isVararg = isVarArg
containingFunctionSymbol = functionSymbol
val isFromPrimaryConstructor = valueParameterDeclaration == ValueParameterDeclaration.PRIMARY_CONSTRUCTOR
for (annotationEntry in annotationEntries) {
annotationEntry.convert<FirAnnotation>().takeIf {
@@ -771,13 +774,14 @@ open class RawFirBuilder(
private fun KtDeclarationWithBody.extractValueParametersTo(
container: FirFunctionBuilder,
functionSymbol: FirFunctionSymbol<*>,
valueParameterDeclaration: ValueParameterDeclaration,
defaultTypeRef: FirTypeRef? = null,
additionalAnnotations: List<FirAnnotation> = emptyList(),
) {
for (valueParameter in valueParameters) {
container.valueParameters += convertValueParameter(
valueParameter, defaultTypeRef, valueParameterDeclaration, additionalAnnotations = additionalAnnotations
valueParameter, functionSymbol, defaultTypeRef, valueParameterDeclaration, additionalAnnotations = additionalAnnotations
)
}
}
@@ -950,7 +954,7 @@ open class RawFirBuilder(
typeParameters += constructorTypeParametersFromConstructedClass(ownerTypeParameters)
this.contextReceivers.addAll(convertContextReceivers(owner.contextReceivers))
this@toFirConstructor?.extractAnnotationsTo(this)
this@toFirConstructor?.extractValueParametersTo(this, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
this@toFirConstructor?.extractValueParametersTo(this, symbol, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
this.body = null
}.apply {
containingClassForStaticMemberAttr = currentDispatchReceiverType()!!.lookupTag
@@ -1312,10 +1316,11 @@ open class RawFirBuilder(
val labelName: String?
val isAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody }
val functionSymbol: FirFunctionSymbol<*>
val functionBuilder = if (isAnonymousFunction) {
FirAnonymousFunctionBuilder().apply {
receiverParameter = receiverType?.convertToReceiverParameter()
symbol = FirAnonymousFunctionSymbol()
symbol = FirAnonymousFunctionSymbol().also { functionSymbol = it }
isLambda = false
hasExplicitParameterList = true
label = context.getLastLabel(function)
@@ -1326,7 +1331,7 @@ open class RawFirBuilder(
receiverParameter = receiverType?.convertToReceiverParameter()
name = function.nameAsSafeName
labelName = runIf(!name.isSpecial) { name.identifier }
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName))
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName)).also { functionSymbol = it }
dispatchReceiverType = currentDispatchReceiverType()
status = FirDeclarationStatusImpl(
if (function.isLocal) Visibilities.Local else function.visibility,
@@ -1363,6 +1368,7 @@ open class RawFirBuilder(
for (valueParameter in function.valueParameters) {
valueParameters += convertValueParameter(
valueParameter,
functionSymbol,
null,
if (isAnonymousFunction) ValueParameterDeclaration.LAMBDA else ValueParameterDeclaration.FUNCTION
)
@@ -1444,6 +1450,7 @@ open class RawFirBuilder(
val name = SpecialNames.DESTRUCT
val multiParameter = buildValueParameter {
source = valueParameter.toFirSourceElement()
containingFunctionSymbol = this@buildAnonymousFunction.symbol
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
returnTypeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef {
@@ -1467,7 +1474,7 @@ open class RawFirBuilder(
val typeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef {
source = implicitTypeRefSource
}
convertValueParameter(valueParameter, typeRef, ValueParameterDeclaration.LAMBDA)
convertValueParameter(valueParameter, symbol, typeRef, ValueParameterDeclaration.LAMBDA)
}
}
val expressionSource = expression.toFirSourceElement()
@@ -1539,7 +1546,7 @@ open class RawFirBuilder(
this@RawFirBuilder.context.firFunctionTargets += target
extractAnnotationsTo(this)
typeParameters += constructorTypeParametersFromConstructedClass(ownerTypeParameters)
extractValueParametersTo(this, ValueParameterDeclaration.FUNCTION)
extractValueParametersTo(this, symbol, ValueParameterDeclaration.FUNCTION)
val (body, _) = buildFirBody()
@@ -1157,6 +1157,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
createParameterTypeRefWithSourceKind(firProperty, KtFakeSourceElementKind.DataClassGeneratedMembers)
valueParameters += buildValueParameter {
source = parameterSource
containingFunctionSymbol = this@buildSimpleFunction.symbol
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
returnTypeRef = propertyReturnTypeRef
@@ -447,8 +447,10 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
status = FirDeclarationStatusImpl(setterStatus?.visibility ?: Visibilities.Unknown, Modality.FINAL).apply {
isInline = setterStatus?.isInline ?: isInline
}
symbol = FirPropertyAccessorSymbol()
val parameter = buildValueParameter {
source = fakeSource
containingFunctionSymbol = this@buildPropertyAccessor.symbol
this.moduleData = moduleData
origin = FirDeclarationOrigin.Source
returnTypeRef = buildImplicitTypeRef()
@@ -462,7 +464,6 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
}
}
valueParameters += parameter
symbol = FirPropertyAccessorSymbol()
body = FirSingleExpressionBlock(
buildFunctionCall {
source = fakeSource
@@ -136,7 +136,7 @@ class FirSamResolverImpl(
val (functionSymbol, functionType) = resolveFunctionTypeIfSamInterface(firRegularClass) ?: return null
val classId = firRegularClass.classId
val symbol = FirSyntheticFunctionSymbol(
val syntheticFunctionSymbol = FirSyntheticFunctionSymbol(
CallableId(
classId.packageFqName,
classId.relativeClassName.parent().takeIf { !it.isRoot },
@@ -156,7 +156,7 @@ class FirSamResolverImpl(
variance = Variance.INVARIANT
isReified = false
annotations += declaredTypeParameter.annotations
containingDeclarationSymbol = symbol
containingDeclarationSymbol = syntheticFunctionSymbol
}
}
@@ -202,7 +202,7 @@ class FirSamResolverImpl(
isSuspend = false
isTailRec = false
}
this.symbol = symbol
this.symbol = syntheticFunctionSymbol
typeParameters += newTypeParameters.map { it.build() }
val substitutedFunctionType = substitutor.substituteOrSelf(functionType)
@@ -218,6 +218,7 @@ class FirSamResolverImpl(
valueParameters += buildValueParameter {
moduleData = session.moduleData
containingFunctionSymbol = syntheticFunctionSymbol
origin = FirDeclarationOrigin.SamConstructor
returnTypeRef = buildResolvedTypeRef {
source = firRegularClass.source
@@ -293,6 +293,7 @@ class FirCallCompleter(
val itType = parameters.single()
buildValueParameter {
source = lambdaAtom.atom.source?.fakeElement(KtFakeSourceElementKind.ItLambdaParameter)
containingFunctionSymbol = lambdaArgument.symbol
moduleData = session.moduleData
origin = FirDeclarationOrigin.Source
returnTypeRef = itType.approximateLambdaInputType().toFirResolvedTypeRef()
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.resolve.createErrorReferenceWithExistingCandidat
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype
import org.jetbrains.kotlin.fir.symbols.SyntheticCallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
@@ -270,7 +271,7 @@ class FirSyntheticCallGenerator(
return generateMemberFunction(functionSymbol, callableId.callableName, typeArgument.typeRef).apply {
typeParameters += typeParameter
valueParameters += argumentType.toValueParameter("branches", isVararg = true)
valueParameters += argumentType.toValueParameter("branches", functionSymbol, isVararg = true)
}.build()
}
@@ -298,7 +299,7 @@ class FirSyntheticCallGenerator(
typeArgument.typeRef
).apply {
typeParameters += typeParameter
valueParameters += argumentType.toValueParameter("arg")
valueParameters += argumentType.toValueParameter("arg", functionSymbol)
}.build()
}
@@ -333,8 +334,8 @@ class FirSyntheticCallGenerator(
typeArgument.typeRef
).apply {
typeParameters += typeParameter
valueParameters += leftArgumentType.toValueParameter("x")
valueParameters += rightArgumentType.toValueParameter("y")
valueParameters += leftArgumentType.toValueParameter("x", functionSymbol)
valueParameters += rightArgumentType.toValueParameter("y", functionSymbol)
}.build()
}
@@ -363,11 +364,12 @@ class FirSyntheticCallGenerator(
}
private fun FirResolvedTypeRef.toValueParameter(
nameAsString: String, isVararg: Boolean = false
nameAsString: String, functionSymbol: FirFunctionSymbol<*>, isVararg: Boolean = false
): FirValueParameter {
val name = Name.identifier(nameAsString)
return buildValueParameter {
moduleData = session.moduleData
containingFunctionSymbol = functionSymbol
origin = FirDeclarationOrigin.Library
this.name = name
returnTypeRef = this@toValueParameter
@@ -915,6 +915,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
val name = Name.identifier("it")
val itParam = buildValueParameter {
source = lambda.source?.fakeElement(KtFakeSourceElementKind.ItLambdaParameter)
containingFunctionSymbol = resolvedLambdaAtom.atom.symbol
moduleData = session.moduleData
origin = FirDeclarationOrigin.Source
returnTypeRef = singleParameterType.toFirResolvedTypeRef()
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -49,6 +50,7 @@ abstract class FirValueParameter : FirVariable(), FirControlFlowGraphOwner {
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirValueParameterSymbol
abstract val defaultValue: FirExpression?
abstract val containingFunctionSymbol: FirFunctionSymbol<*>
abstract val isCrossinline: Boolean
abstract val isNoinline: Boolean
abstract val isVararg: Boolean
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -64,6 +65,7 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var symbol: FirValueParameterSymbol
var defaultValue: FirExpression? = null
lateinit var containingFunctionSymbol: FirFunctionSymbol<*>
var isCrossinline: Boolean = false
var isNoinline: Boolean = false
var isVararg: Boolean = false
@@ -91,6 +93,7 @@ class FirDefaultSetterValueParameterBuilder : FirAnnotationContainerBuilder {
annotations,
symbol,
defaultValue,
containingFunctionSymbol,
isCrossinline,
isNoinline,
isVararg,
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -58,6 +59,7 @@ open class FirValueParameterBuilder : FirAnnotationContainerBuilder {
override val annotations: MutableList<FirAnnotation> = mutableListOf()
open lateinit var symbol: FirValueParameterSymbol
open var defaultValue: FirExpression? = null
open lateinit var containingFunctionSymbol: FirFunctionSymbol<*>
open var isCrossinline: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
open var isNoinline: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
open var isVararg: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
@@ -79,6 +81,7 @@ open class FirValueParameterBuilder : FirAnnotationContainerBuilder {
annotations,
symbol,
defaultValue,
containingFunctionSymbol,
isCrossinline,
isNoinline,
isVararg,
@@ -116,6 +119,7 @@ inline fun buildValueParameterCopy(original: FirValueParameter, init: FirValuePa
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.symbol = original.symbol
copyBuilder.defaultValue = original.defaultValue
copyBuilder.containingFunctionSymbol = original.containingFunctionSymbol
copyBuilder.isCrossinline = original.isCrossinline
copyBuilder.isNoinline = original.isNoinline
copyBuilder.isVararg = original.isVararg
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -59,6 +60,7 @@ internal class FirDefaultSetterValueParameter(
override val annotations: MutableList<FirAnnotation>,
override val symbol: FirValueParameterSymbol,
override var defaultValue: FirExpression?,
override val containingFunctionSymbol: FirFunctionSymbol<*>,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
override val isVararg: Boolean,
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -53,6 +54,7 @@ internal class FirValueParameterImpl(
override val annotations: MutableList<FirAnnotation>,
override val symbol: FirValueParameterSymbol,
override var defaultValue: FirExpression?,
override val containingFunctionSymbol: FirFunctionSymbol<*>,
override val isCrossinline: Boolean,
override val isNoinline: Boolean,
override val isVararg: Boolean,
@@ -91,6 +91,7 @@ fun FirRegularClassBuilder.generateValueOfFunction(
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUE_OF))
valueParameters += buildValueParameter vp@{
source = sourceElement
containingFunctionSymbol = this@buildSimpleFunction.symbol
origin = FirDeclarationOrigin.Source
this.moduleData = moduleData
returnTypeRef = buildResolvedTypeRef {
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef
import org.jetbrains.kotlin.name.SpecialNames
@OptIn(FirImplementationDetail::class)
abstract class FirDefaultPropertyAccessor(
@@ -127,7 +126,7 @@ class FirDefaultPropertySetter(
propertySymbol: FirPropertySymbol,
modality: Modality = Modality.FINAL,
effectiveVisibility: EffectiveVisibility? = null,
symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol(),
propertyAccessorSymbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol(),
parameterAnnotations: List<FirAnnotation> = emptyList(),
) : FirDefaultPropertyAccessor(
source,
@@ -137,6 +136,7 @@ class FirDefaultPropertySetter(
valueParameters = mutableListOf(
buildDefaultSetterValueParameter builder@{
this@builder.source = source?.fakeElement(KtFakeSourceElementKind.DefaultAccessor)
this@builder.containingFunctionSymbol = propertyAccessorSymbol
this@builder.moduleData = moduleData
this@builder.origin = origin
this@builder.returnTypeRef = propertyTypeRef
@@ -149,5 +149,5 @@ class FirDefaultPropertySetter(
visibility = visibility,
modality = modality,
effectiveVisibility = effectiveVisibility,
symbol = symbol
symbol = propertyAccessorSymbol
)
@@ -394,6 +394,9 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
valueParameter.configure {
+symbol("FirValueParameterSymbol")
+field("defaultValue", expression, nullable = true)
+field("containingFunctionSymbol", functionSymbolType, "*").apply {
withBindThis = false
}
generateBooleanFields("crossinline", "noinline", "vararg")
}
@@ -66,6 +66,7 @@ val propertyBodyResolveStateType = type("fir.declarations", "FirPropertyBodyReso
val stubReferenceType = generatedType("references.impl", "FirStubReference", firType = true)
val firBasedSymbolType = type("fir.symbols", "FirBasedSymbol")
val functionSymbolType = type("fir.symbols.impl", "FirFunctionSymbol")
val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol")
val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol")
val classSymbolType = type("fir.symbols.impl", "FirClassSymbol")
@@ -27,9 +27,9 @@ fun Builder.collectImports(): List<String> {
ImportKind.Builder,
) + implementation.fullQualifiedName!! + usedTypes.mapNotNull { it.fullQualifiedName } + builderDsl + "kotlin.contracts.*"
is IntermediateBuilder -> {
val fqns = parents + allFields.mapNotNull { it.fullQualifiedName } + allFields.flatMap {
val fqns = parents + usedTypes.mapNotNull { it.fullQualifiedName } + allFields.mapNotNull { it.fullQualifiedName } + allFields.flatMap {
it.arguments.mapNotNull { it.fullQualifiedName }
} + (materializedElement?.fullQualifiedName ?: throw IllegalStateException(type)) + builderDsl
} + (materializedElement?.fullQualifiedName ?: throw IllegalStateException(type)) + builderDsl
fqns.filterRedundantImports(packageName, ImportKind.Builder)
}
}.sorted()
@@ -69,8 +69,10 @@ class MembersOfSerializerGenerator(session: FirSession) : FirDeclarationGenerati
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
returnTypeRef = session.builtinTypes.unitType
dispatchReceiverType = dispatchReceiverClassId.toSimpleConeType()
symbol = FirNamedFunctionSymbol(callableId)
valueParameters += buildValueParameter {
moduleData = session.moduleData
containingFunctionSymbol = this@buildSimpleFunction.symbol
resolvePhase = FirResolvePhase.BODY_RESOLVE
origin = Key.origin
returnTypeRef = buildResolvedTypeRef {
@@ -85,7 +87,6 @@ class MembersOfSerializerGenerator(session: FirSession) : FirDeclarationGenerati
body = buildBlock {}
.apply { replaceTypeRef(session.builtinTypes.unitType) }
name = callableId.callableName
symbol = FirNamedFunctionSymbol(callableId)
}
return listOf(function.symbol)
}
@@ -56,7 +56,9 @@ class TopLevelDeclarationsGenerator(session: FirSession) : FirDeclarationGenerat
EffectiveVisibility.Public
)
returnTypeRef = session.builtinTypes.stringType
symbol = FirNamedFunctionSymbol(callableId)
valueParameters += buildValueParameter {
containingFunctionSymbol = this@buildSimpleFunction.symbol
resolvePhase = FirResolvePhase.BODY_RESOLVE
moduleData = session.moduleData
origin = Key.origin
@@ -69,7 +71,6 @@ class TopLevelDeclarationsGenerator(session: FirSession) : FirDeclarationGenerat
isNoinline = false
isVararg = false
}
symbol = FirNamedFunctionSymbol(callableId)
name = callableId.callableName
}
return listOf(function.symbol)
@@ -62,8 +62,14 @@ fun newSimpleTypeParameter(firSession: FirSession, containingDeclarationSymbol:
addDefaultBoundIfNecessary()
}
fun newSimpleValueParameter(firSession: FirSession, typeRef: FirResolvedTypeRef, name: Name) = buildValueParameter {
fun newSimpleValueParameter(
firSession: FirSession,
typeRef: FirResolvedTypeRef,
functionSymbol: FirFunctionSymbol<*>,
name: Name
) = buildValueParameter {
moduleData = firSession.moduleData
this.containingFunctionSymbol = functionSymbol
origin = SerializationPluginKey.origin
this.name = name
this.symbol = FirValueParameterSymbol(this.name)
@@ -208,6 +208,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
newSimpleValueParameter(
session,
kSerializerId.constructClassLikeType(arrayOf(parametersAsArguments[i]), false).toFirResolvedTypeRef(),
symbol,
Name.identifier("${SerialEntityNames.typeArgPrefix}$i")
)
})
@@ -280,6 +281,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
newSimpleValueParameter(
session,
kSerializerId.constructClassLikeType(arrayOf(typeParam.toConeType()), false).toFirResolvedTypeRef(),
symbol,
Name.identifier("${SerialEntityNames.typeArgPrefix}$i")
)
})
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.toEffectiveVisibility
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
@@ -47,11 +44,12 @@ abstract class AbstractConstructorGeneratorPart<T : ConeLombokAnnotations.Constr
val staticName = constructorInfo.staticName?.let { Name.identifier(it) }
val substitutor: JavaTypeSubstitutor
val constructorSymbol: FirFunctionSymbol<*>
val builder = if (staticName == null) {
FirJavaConstructorBuilder().apply {
symbol = FirConstructorSymbol(classSymbol.classId.callableIdForConstructor())
symbol = FirConstructorSymbol(classSymbol.classId.callableIdForConstructor()).also { constructorSymbol = it }
classSymbol.fir.typeParameters.mapTo(typeParameters) {
buildConstructedClassTypeParameterRef { symbol = it.symbol }
buildConstructedClassTypeParameterRef { this.symbol = it.symbol }
}
substitutor = JavaTypeSubstitutor.Empty
returnTypeRef = buildResolvedTypeRef {
@@ -65,13 +63,13 @@ abstract class AbstractConstructorGeneratorPart<T : ConeLombokAnnotations.Constr
} else {
FirJavaMethodBuilder().apply {
name = staticName
val methodSymbol = FirNamedFunctionSymbol(CallableId(classSymbol.classId, staticName))
val methodSymbol = FirNamedFunctionSymbol(CallableId(classSymbol.classId, staticName)).also { constructorSymbol = it }
symbol = methodSymbol
val classTypeParameterSymbols = classSymbol.fir.typeParameters.map { it.symbol }
classTypeParameterSymbols.mapTo(typeParameters) {
buildTypeParameterCopy(it.fir) {
symbol = FirTypeParameterSymbol()
this.symbol = FirTypeParameterSymbol()
containingDeclarationSymbol = methodSymbol
}
}
@@ -128,6 +126,7 @@ abstract class AbstractConstructorGeneratorPart<T : ConeLombokAnnotations.Constr
}
else -> typeRef
}
containingFunctionSymbol = constructorSymbol
name = field.name
annotationBuilder = { emptyList() }
isVararg = false
@@ -314,6 +314,7 @@ fun FirClassSymbol<*>.createJavaMethod(
this.valueParameters += buildJavaValueParameter {
moduleData = this@createJavaMethod.moduleData
this.returnTypeRef = valueParameter.typeRef
containingFunctionSymbol = this@buildJavaMethod.symbol
this.name = valueParameter.name
annotationBuilder = { emptyList() }
isVararg = false
@@ -83,6 +83,7 @@ class SetterGenerator(session: FirSession) : FirDeclarationGenerationExtension(s
valueParameters += buildJavaValueParameter {
moduleData = field.moduleData
containingFunctionSymbol = this@buildJavaMethod.symbol
returnTypeRef = field.returnTypeRef
name = field.name
annotationBuilder = { emptyList() }
@@ -73,6 +73,7 @@ class WithGenerator(session: FirSession) : FirDeclarationGenerationExtension(ses
valueParameters += buildJavaValueParameter {
moduleData = field.moduleData
containingFunctionSymbol = this@buildJavaMethod.symbol
returnTypeRef = field.returnTypeRef
name = field.name
annotationBuilder = { emptyList() }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.parcelize.fir
import org.jetbrains.kotlin.GeneratedDeclarationKey
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.GeneratedDeclarationKey
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
@@ -30,9 +30,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.isInt
import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.parcelize.ParcelizeNames.DESCRIBE_CONTENTS_NAME
@@ -104,12 +104,14 @@ class FirParcelizeDeclarationGenerator(session: FirSession) : FirDeclarationGene
private fun generateWriteToParcel(owner: FirRegularClassSymbol, callableId: CallableId): FirNamedFunctionSymbol {
return createFunction(owner, callableId) {
val functionSymbol = this.symbol
returnTypeRef = session.builtinTypes.unitType
valueParameters += buildValueParameter {
moduleData = session.moduleData
origin = key.origin
name = DEST_NAME
containingFunctionSymbol = functionSymbol
returnTypeRef = buildResolvedTypeRef {
type = ConeClassLikeTypeImpl(
ConeClassLikeLookupTagImpl(PARCEL_ID),
@@ -127,6 +129,7 @@ class FirParcelizeDeclarationGenerator(session: FirSession) : FirDeclarationGene
moduleData = session.moduleData
origin = key.origin
name = FLAGS_NAME
containingFunctionSymbol = functionSymbol
returnTypeRef = session.builtinTypes.intType
symbol = FirValueParameterSymbol(name)
isCrossinline = false