FirClassSubstitutionScope: handle fake override local eff. visibility
This commit is contained in:
+16
-4
@@ -6,9 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirEffectiveVisibilityImpl
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
@@ -276,6 +278,7 @@ class FirClassSubstitutionScope(
|
||||
|
||||
companion object {
|
||||
private fun FirFunctionBuilder.configureAnnotationsAndParameters(
|
||||
session: FirSession,
|
||||
baseFunction: FirFunction<*>,
|
||||
newParameterTypes: List<ConeKotlinType?>?
|
||||
) {
|
||||
@@ -298,6 +301,14 @@ class FirClassSubstitutionScope(
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirDeclarationStatus.withLocalEffectiveVisibility(isLocal: Boolean): FirDeclarationStatus {
|
||||
return if (isLocal && this is FirDeclarationStatusImpl) {
|
||||
resolved(visibility, FirEffectiveVisibilityImpl.Local, modality!!)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
private fun createFakeOverrideFunction(
|
||||
fakeOverrideSymbol: FirFunctionSymbol<FirSimpleFunction>,
|
||||
session: FirSession,
|
||||
@@ -309,6 +320,7 @@ class FirClassSubstitutionScope(
|
||||
): 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
|
||||
val isLocal = fakeOverrideSymbol.callableId.classId?.isLocal == true
|
||||
return buildSimpleFunction {
|
||||
source = baseFunction.source
|
||||
this.session = session
|
||||
@@ -316,10 +328,10 @@ class FirClassSubstitutionScope(
|
||||
returnTypeRef = baseFunction.returnTypeRef.withReplacedReturnType(newReturnType)
|
||||
receiverTypeRef = baseFunction.receiverTypeRef?.withReplacedConeType(newReceiverType)
|
||||
name = baseFunction.name
|
||||
status = baseFunction.status
|
||||
status = baseFunction.status.withLocalEffectiveVisibility(isLocal)
|
||||
symbol = fakeOverrideSymbol
|
||||
resolvePhase = baseFunction.resolvePhase
|
||||
configureAnnotationsAndParameters(baseFunction, newParameterTypes)
|
||||
configureAnnotationsAndParameters(session, baseFunction, newParameterTypes)
|
||||
|
||||
// TODO: Fix the hack for org.jetbrains.kotlin.fir.backend.Fir2IrVisitor.addFakeOverrides
|
||||
// We might have added baseFunction.typeParameters in case new ones are null
|
||||
@@ -375,7 +387,7 @@ class FirClassSubstitutionScope(
|
||||
isVar = baseProperty.isVar
|
||||
this.symbol = symbol
|
||||
isLocal = false
|
||||
status = baseProperty.status
|
||||
status = baseProperty.status.withLocalEffectiveVisibility(isLocal)
|
||||
resolvePhase = baseProperty.resolvePhase
|
||||
annotations += baseProperty.annotations
|
||||
if (newTypeParameters != null) {
|
||||
@@ -448,7 +460,7 @@ class FirClassSubstitutionScope(
|
||||
status = baseConstructor.status
|
||||
symbol = fakeOverrideSymbol
|
||||
resolvePhase = baseConstructor.resolvePhase
|
||||
configureAnnotationsAndParameters(baseConstructor, newParameterTypes)
|
||||
configureAnnotationsAndParameters(session, baseConstructor, newParameterTypes)
|
||||
|
||||
// TODO: Fix the hack for org.jetbrains.kotlin.fir.backend.Fir2IrVisitor.addFakeOverrides
|
||||
// We might have added baseFunction.typeParameters in case new ones are null
|
||||
|
||||
Reference in New Issue
Block a user