[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
@@ -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