FirClassSubstitutionScope: reorder companion functions

This commit is contained in:
Mikhail Glukhikh
2020-08-28 13:04:33 +03:00
parent 5ad453d927
commit dc9306367a
@@ -258,35 +258,78 @@ class FirClassSubstitutionScope(
} }
companion object { companion object {
private fun FirFunctionBuilder.configureAnnotationsAndSignature( fun createFakeOverrideFunction(
session: FirSession, session: FirSession,
baseFunction: FirFunction<*>, baseFunction: FirSimpleFunction,
newParameterTypes: List<ConeKotlinType?>?, baseSymbol: FirNamedFunctionSymbol,
newReceiverType: ConeKotlinType? = null, newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null newReturnType: ConeKotlinType? = null,
) { newParameterTypes: List<ConeKotlinType?>? = null,
annotations += baseFunction.annotations newTypeParameters: List<FirTypeParameter>? = null,
returnTypeRef = baseFunction.returnTypeRef.withReplacedConeType(newReturnType) derivedClassId: ClassId? = null,
if (this is FirSimpleFunctionBuilder) { isExpect: Boolean = baseFunction.isExpect
receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType) ): FirNamedFunctionSymbol {
val symbol = FirNamedFunctionSymbol(
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseFunction.name),
isFakeOverride = true, overriddenSymbol = baseSymbol
)
createFakeOverrideFunction(
symbol, session, baseFunction, newReceiverType, newReturnType, newParameterTypes, newTypeParameters, isExpect
)
return symbol
} }
valueParameters += baseFunction.valueParameters.zip(
newParameterTypes ?: List(baseFunction.valueParameters.size) { null } private fun createFakeOverrideFunction(
) { valueParameter, newType -> fakeOverrideSymbol: FirFunctionSymbol<FirSimpleFunction>,
buildValueParameter { session: FirSession,
source = valueParameter.source baseFunction: FirSimpleFunction,
newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null,
newParameterTypes: List<ConeKotlinType?>? = null,
newTypeParameters: List<FirTypeParameter>? = null,
isExpect: Boolean = baseFunction.isExpect
): FirSimpleFunction {
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
// As second alternative, we can invent some light-weight kind of FirRegularClass
return buildSimpleFunction {
source = baseFunction.source
this.session = session this.session = session
resolvePhase = valueParameter.resolvePhase
origin = FirDeclarationOrigin.FakeOverride origin = FirDeclarationOrigin.FakeOverride
returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newType) name = baseFunction.name
name = valueParameter.name status = baseFunction.status.withExpect(isExpect)
symbol = FirVariableSymbol(valueParameter.symbol.callableId) symbol = fakeOverrideSymbol
defaultValue = valueParameter.defaultValue resolvePhase = baseFunction.resolvePhase
isCrossinline = valueParameter.isCrossinline
isNoinline = valueParameter.isNoinline typeParameters += configureAnnotationsTypeParametersAndSignature(
isVararg = valueParameter.isVararg session, baseFunction, newParameterTypes, newTypeParameters, newReceiverType, newReturnType
).filterIsInstance<FirTypeParameter>()
} }
} }
private fun createFakeOverrideConstructor(
fakeOverrideSymbol: FirConstructorSymbol,
session: FirSession,
baseConstructor: FirConstructor,
newReturnType: ConeKotlinType? = null,
newParameterTypes: List<ConeKotlinType?>? = null,
newTypeParameters: List<FirTypeParameterRef>? = null,
isExpect: Boolean = baseConstructor.isExpect
): FirConstructor {
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
// As second alternative, we can invent some light-weight kind of FirRegularClass
return buildConstructor {
source = baseConstructor.source
this.session = session
origin = FirDeclarationOrigin.FakeOverride
receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null)
status = baseConstructor.status.withExpect(isExpect)
symbol = fakeOverrideSymbol
resolvePhase = baseConstructor.resolvePhase
typeParameters += configureAnnotationsTypeParametersAndSignature(
session, baseConstructor, newParameterTypes, newTypeParameters, null, newReturnType
)
}
} }
private fun FirFunctionBuilder.configureAnnotationsTypeParametersAndSignature( private fun FirFunctionBuilder.configureAnnotationsTypeParametersAndSignature(
@@ -329,62 +372,35 @@ class FirClassSubstitutionScope(
} }
} }
private fun FirDeclarationStatus.withExpect(isExpect: Boolean): FirDeclarationStatus { private fun FirFunctionBuilder.configureAnnotationsAndSignature(
return if (this.isExpect == isExpect) {
this
} else {
FirResolvedDeclarationStatusImpl(visibility, modality!!).apply {
this.isExpect = isExpect
}
}
}
private fun createFakeOverrideFunction(
fakeOverrideSymbol: FirFunctionSymbol<FirSimpleFunction>,
session: FirSession, session: FirSession,
baseFunction: FirSimpleFunction, baseFunction: FirFunction<*>,
newParameterTypes: List<ConeKotlinType?>?,
newReceiverType: ConeKotlinType? = null, newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null, newReturnType: ConeKotlinType? = null
newParameterTypes: List<ConeKotlinType?>? = null, ) {
newTypeParameters: List<FirTypeParameter>? = null, annotations += baseFunction.annotations
isExpect: Boolean = baseFunction.isExpect returnTypeRef = baseFunction.returnTypeRef.withReplacedConeType(newReturnType)
): FirSimpleFunction { if (this is FirSimpleFunctionBuilder) {
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType)
// As second alternative, we can invent some light-weight kind of FirRegularClass }
return buildSimpleFunction { valueParameters += baseFunction.valueParameters.zip(
source = baseFunction.source newParameterTypes ?: List(baseFunction.valueParameters.size) { null }
) { valueParameter, newType ->
buildValueParameter {
source = valueParameter.source
this.session = session this.session = session
resolvePhase = valueParameter.resolvePhase
origin = FirDeclarationOrigin.FakeOverride origin = FirDeclarationOrigin.FakeOverride
name = baseFunction.name returnTypeRef = valueParameter.returnTypeRef.withReplacedConeType(newType)
status = baseFunction.status.withExpect(isExpect) name = valueParameter.name
symbol = fakeOverrideSymbol symbol = FirVariableSymbol(valueParameter.symbol.callableId)
resolvePhase = baseFunction.resolvePhase defaultValue = valueParameter.defaultValue
isCrossinline = valueParameter.isCrossinline
typeParameters += configureAnnotationsTypeParametersAndSignature( isNoinline = valueParameter.isNoinline
session, baseFunction, newParameterTypes, newTypeParameters, newReceiverType, newReturnType isVararg = valueParameter.isVararg
).filterIsInstance<FirTypeParameter>()
} }
} }
fun createFakeOverrideFunction(
session: FirSession,
baseFunction: FirSimpleFunction,
baseSymbol: FirNamedFunctionSymbol,
newReceiverType: ConeKotlinType? = null,
newReturnType: ConeKotlinType? = null,
newParameterTypes: List<ConeKotlinType?>? = null,
newTypeParameters: List<FirTypeParameter>? = null,
derivedClassId: ClassId? = null,
isExpect: Boolean = baseFunction.isExpect
): FirNamedFunctionSymbol {
val symbol = FirNamedFunctionSymbol(
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseFunction.name),
isFakeOverride = true, overriddenSymbol = baseSymbol
)
createFakeOverrideFunction(
symbol, session, baseFunction, newReceiverType, newReturnType, newParameterTypes, newTypeParameters, isExpect
)
return symbol
} }
fun createFakeOverrideProperty( fun createFakeOverrideProperty(
@@ -466,29 +482,13 @@ class FirClassSubstitutionScope(
}.symbol }.symbol
} }
private fun createFakeOverrideConstructor( private fun FirDeclarationStatus.withExpect(isExpect: Boolean): FirDeclarationStatus {
fakeOverrideSymbol: FirConstructorSymbol, return if (this.isExpect == isExpect) {
session: FirSession, this
baseConstructor: FirConstructor, } else {
newReturnType: ConeKotlinType? = null, FirResolvedDeclarationStatusImpl(visibility, modality!!).apply {
newParameterTypes: List<ConeKotlinType?>? = null, this.isExpect = isExpect
newTypeParameters: List<FirTypeParameterRef>? = null, }
isExpect: Boolean = baseConstructor.isExpect
): FirConstructor {
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
// As second alternative, we can invent some light-weight kind of FirRegularClass
return buildConstructor {
source = baseConstructor.source
this.session = session
origin = FirDeclarationOrigin.FakeOverride
receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null)
status = baseConstructor.status.withExpect(isExpect)
symbol = fakeOverrideSymbol
resolvePhase = baseConstructor.resolvePhase
typeParameters += configureAnnotationsTypeParametersAndSignature(
session, baseConstructor, newParameterTypes, newTypeParameters, null, newReturnType
)
} }
} }