From dc9306367af0e337315d7a53350ca15a5b9568a9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 28 Aug 2020 13:04:33 +0300 Subject: [PATCH] FirClassSubstitutionScope: reorder companion functions --- .../scopes/impl/FirClassSubstitutionScope.kt | 204 +++++++++--------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt index 5977a43edbe..0fbf4f60ab3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt @@ -258,34 +258,77 @@ class FirClassSubstitutionScope( } companion object { - private fun FirFunctionBuilder.configureAnnotationsAndSignature( + fun createFakeOverrideFunction( session: FirSession, - baseFunction: FirFunction<*>, - newParameterTypes: List?, + baseFunction: FirSimpleFunction, + baseSymbol: FirNamedFunctionSymbol, newReceiverType: ConeKotlinType? = null, - newReturnType: ConeKotlinType? = null - ) { - annotations += baseFunction.annotations - returnTypeRef = baseFunction.returnTypeRef.withReplacedConeType(newReturnType) - if (this is FirSimpleFunctionBuilder) { - receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType) + newReturnType: ConeKotlinType? = null, + newParameterTypes: List? = null, + newTypeParameters: List? = 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 + } + + private fun createFakeOverrideFunction( + fakeOverrideSymbol: FirFunctionSymbol, + session: FirSession, + baseFunction: FirSimpleFunction, + newReceiverType: ConeKotlinType? = null, + newReturnType: ConeKotlinType? = null, + newParameterTypes: List? = null, + newTypeParameters: List? = 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() } - 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 createFakeOverrideConstructor( + fakeOverrideSymbol: FirConstructorSymbol, + session: FirSession, + baseConstructor: FirConstructor, + newReturnType: ConeKotlinType? = null, + newParameterTypes: List? = null, + newTypeParameters: List? = 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 + ) } } @@ -329,64 +372,37 @@ class FirClassSubstitutionScope( } } - private fun FirDeclarationStatus.withExpect(isExpect: Boolean): FirDeclarationStatus { - return if (this.isExpect == isExpect) { - this - } else { - FirResolvedDeclarationStatusImpl(visibility, modality!!).apply { - this.isExpect = isExpect + private fun FirFunctionBuilder.configureAnnotationsAndSignature( + session: FirSession, + baseFunction: FirFunction<*>, + newParameterTypes: List?, + newReceiverType: ConeKotlinType? = null, + 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, - session: FirSession, - baseFunction: FirSimpleFunction, - newReceiverType: ConeKotlinType? = null, - newReturnType: ConeKotlinType? = null, - newParameterTypes: List? = null, - newTypeParameters: List? = 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() - } - } - - fun createFakeOverrideFunction( - session: FirSession, - baseFunction: FirSimpleFunction, - baseSymbol: FirNamedFunctionSymbol, - newReceiverType: ConeKotlinType? = null, - newReturnType: ConeKotlinType? = null, - newParameterTypes: List? = null, - newTypeParameters: List? = 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( session: FirSession, baseProperty: FirProperty, @@ -466,29 +482,13 @@ class FirClassSubstitutionScope( }.symbol } - private fun createFakeOverrideConstructor( - fakeOverrideSymbol: FirConstructorSymbol, - session: FirSession, - baseConstructor: FirConstructor, - newReturnType: ConeKotlinType? = null, - newParameterTypes: List? = null, - newTypeParameters: List? = 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 FirDeclarationStatus.withExpect(isExpect: Boolean): FirDeclarationStatus { + return if (this.isExpect == isExpect) { + this + } else { + FirResolvedDeclarationStatusImpl(visibility, modality!!).apply { + this.isExpect = isExpect + } } }