FirClassSubstitutionScope: reorder companion functions
This commit is contained in:
+102
-102
@@ -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
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user