FirClassSubstitutionScope: reorder companion functions

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