[FIR] Refactor boolean flags related to constructors: !no -> include

This commit is contained in:
Mikhail Glukhikh
2020-05-12 16:31:37 +03:00
parent db694dd7ab
commit 6a2461f2c6
3 changed files with 31 additions and 46 deletions
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
private operator fun <T> Pair<T, *>?.component1() = this?.first private operator fun <T> Pair<T, *>?.component1() = this?.first
private operator fun <T> Pair<*, T>?.component2() = this?.second private operator fun <T> Pair<*, T>?.component2() = this?.second
@@ -32,8 +31,8 @@ internal fun FirScope.processConstructorsByName(
name: Name, name: Name,
session: FirSession, session: FirSession,
bodyResolveComponents: BodyResolveComponents, bodyResolveComponents: BodyResolveComponents,
noSyntheticConstructors: Boolean, includeSyntheticConstructors: Boolean,
noInnerConstructors: Boolean = false, includeInnerConstructors: Boolean,
processor: (FirCallableSymbol<*>) -> Unit processor: (FirCallableSymbol<*>) -> Unit
) { ) {
// TODO: Handle case with two or more accessible classifiers // TODO: Handle case with two or more accessible classifiers
@@ -48,18 +47,16 @@ internal fun FirScope.processConstructorsByName(
processor, processor,
session, session,
bodyResolveComponents.scopeSession, bodyResolveComponents.scopeSession,
noInnerConstructors includeInnerConstructors
) )
if (noSyntheticConstructors) { if (includeSyntheticConstructors) {
return processSyntheticConstructors(
matchedClassSymbol,
processor,
bodyResolveComponents
)
} }
processSyntheticConstructors(
matchedClassSymbol,
processor,
bodyResolveComponents
)
} }
} }
@@ -67,13 +64,13 @@ internal fun FirScope.processFunctionsAndConstructorsByName(
name: Name, name: Name,
session: FirSession, session: FirSession,
bodyResolveComponents: BodyResolveComponents, bodyResolveComponents: BodyResolveComponents,
noInnerConstructors: Boolean = false, includeInnerConstructors: Boolean,
processor: (FirCallableSymbol<*>) -> Unit processor: (FirCallableSymbol<*>) -> Unit
) { ) {
processConstructorsByName( processConstructorsByName(
name, session, bodyResolveComponents, name, session, bodyResolveComponents,
noSyntheticConstructors = false, includeSyntheticConstructors = true,
noInnerConstructors = noInnerConstructors, includeInnerConstructors = includeInnerConstructors,
processor = processor processor = processor
) )
@@ -93,16 +90,6 @@ private fun FirScope.getFirstClassifierOrNull(name: Name): Pair<FirClassifierSym
return result return result
} }
private fun finalExpansionName(symbol: FirTypeAliasSymbol, session: FirSession): Name? {
val expandedType = symbol.fir.expandedTypeRef.coneTypeUnsafe<ConeClassLikeType>()
val typeAliasSymbol = expandedType.lookupTag.toSymbol(session)?.safeAs<FirTypeAliasSymbol>()
return if (typeAliasSymbol != null)
finalExpansionName(typeAliasSymbol, session)
else
expandedType.lookupTag.classId.shortClassName
}
private fun processSyntheticConstructors( private fun processSyntheticConstructors(
matchedSymbol: FirClassLikeSymbol<*>?, matchedSymbol: FirClassLikeSymbol<*>?,
processor: (FirFunctionSymbol<*>) -> Unit, processor: (FirFunctionSymbol<*>) -> Unit,
@@ -158,7 +145,7 @@ private fun processConstructors(
processor: (FirFunctionSymbol<*>) -> Unit, processor: (FirFunctionSymbol<*>) -> Unit,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
noInner: Boolean includeInnerConstructors: Boolean
) { ) {
try { try {
if (matchedSymbol != null) { if (matchedSymbol != null) {
@@ -169,7 +156,7 @@ private fun processConstructors(
if (basicScope != null && type.typeArguments.isNotEmpty()) { if (basicScope != null && type.typeArguments.isNotEmpty()) {
prepareSubstitutingScopeForTypeAliasConstructors( prepareSubstitutingScopeForTypeAliasConstructors(
matchedSymbol, type, session, basicScope matchedSymbol, session, basicScope
) ?: return ) ?: return
} else basicScope } else basicScope
} }
@@ -181,7 +168,7 @@ private fun processConstructors(
//TODO: why don't we use declared member scope at this point? //TODO: why don't we use declared member scope at this point?
scope?.processDeclaredConstructors { scope?.processDeclaredConstructors {
if (!noInner || !it.fir.isInner) { if (includeInnerConstructors || !it.fir.isInner) {
processor(it) processor(it)
} }
} }
@@ -246,11 +233,10 @@ private class TypeAliasConstructorsSubstitutor<F : FirFunction<F>>(
private fun prepareSubstitutingScopeForTypeAliasConstructors( private fun prepareSubstitutingScopeForTypeAliasConstructors(
typeAliasSymbol: FirTypeAliasSymbol, typeAliasSymbol: FirTypeAliasSymbol,
expandedType: ConeClassLikeType,
session: FirSession, session: FirSession,
delegatingScope: FirScope delegatingScope: FirScope
): FirScope? { ): FirScope? {
val copyFactory2: ConstructorCopyFactory<FirConstructor> = factory@ { newReturnType, newParameterTypes, newTypeParameters -> val copyFactory2: ConstructorCopyFactory<FirConstructor> = factory@{ newReturnType, newParameterTypes, newTypeParameters ->
buildConstructor { buildConstructor {
source = this@factory.source source = this@factory.source
this.session = session this.session = session
@@ -127,10 +127,10 @@ class FirTowerResolverSession internal constructor(
private fun FirScope.toScopeTowerLevel( private fun FirScope.toScopeTowerLevel(
extensionReceiver: ReceiverValue? = null, extensionReceiver: ReceiverValue? = null,
extensionsOnly: Boolean = false, extensionsOnly: Boolean = false,
noInnerConstructors: Boolean = false includeInnerConstructors: Boolean = true
): ScopeTowerLevel = ScopeTowerLevel( ): ScopeTowerLevel = ScopeTowerLevel(
session, components, this, session, components, this,
extensionReceiver, extensionsOnly, noInnerConstructors extensionReceiver, extensionsOnly, includeInnerConstructors
) )
private fun FirScope.toConstructorScopeTowerLevel(): ConstructorScopeTowerLevel = private fun FirScope.toConstructorScopeTowerLevel(): ConstructorScopeTowerLevel =
@@ -151,7 +151,7 @@ class FirTowerResolverSession internal constructor(
if (qualifierReceiver == null) return if (qualifierReceiver == null) return
for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) { for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) {
processLevel( processLevel(
qualifierScope.toScopeTowerLevel(noInnerConstructors = true), qualifierScope.toScopeTowerLevel(includeInnerConstructors = false),
info.noStubReceiver(), TowerGroup.Qualifier(depth), info.noStubReceiver(), TowerGroup.Qualifier(depth),
useParentGroupForInvokes = true, useParentGroupForInvokes = true,
) )
@@ -169,7 +169,7 @@ class FirTowerResolverSession internal constructor(
val scope = qualifierReceiver.classifierScope() ?: return val scope = qualifierReceiver.classifierScope() ?: return
val group = if (prioritized) TowerGroup.ClassifierPrioritized else TowerGroup.Classifier val group = if (prioritized) TowerGroup.ClassifierPrioritized else TowerGroup.Classifier
processLevel( processLevel(
scope.toScopeTowerLevel(noInnerConstructors = true), info.noStubReceiver(), scope.toScopeTowerLevel(includeInnerConstructors = false), info.noStubReceiver(),
group, group,
useParentGroupForInvokes = true, useParentGroupForInvokes = true,
) )
@@ -82,7 +82,7 @@ class MemberScopeTowerLevel(
) : SessionBasedTowerLevel(session) { ) : SessionBasedTowerLevel(session) {
private fun <T : AbstractFirBasedSymbol<*>> processMembers( private fun <T : AbstractFirBasedSymbol<*>> processMembers(
output: TowerScopeLevel.TowerScopeLevelProcessor<T>, output: TowerScopeLevel.TowerScopeLevelProcessor<T>,
forInnerConstructors: Boolean = false, forInnerConstructorDelegationCalls: Boolean = false,
processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit processScopeMembers: FirScope.(processor: (T) -> Unit) -> Unit
): ProcessorAction { ): ProcessorAction {
var empty = true var empty = true
@@ -93,10 +93,8 @@ class MemberScopeTowerLevel(
(implicitExtensionInvokeMode || candidate.hasConsistentExtensionReceiver(extensionReceiver)) (implicitExtensionInvokeMode || candidate.hasConsistentExtensionReceiver(extensionReceiver))
) { ) {
val fir = candidate.fir val fir = candidate.fir
if (forInnerConstructors) { if (forInnerConstructorDelegationCalls && candidate !is FirConstructorSymbol) {
if (candidate !is FirConstructorSymbol || !candidate.fir.isInner) { return@processScopeMembers
return@processScopeMembers
}
} else if ((fir as? FirCallableMemberDeclaration<*>)?.isStatic == true || (fir as? FirConstructor)?.isInner == false) { } else if ((fir as? FirCallableMemberDeclaration<*>)?.isStatic == true || (fir as? FirConstructor)?.isInner == false) {
return@processScopeMembers return@processScopeMembers
} }
@@ -119,7 +117,7 @@ class MemberScopeTowerLevel(
} }
} }
if (!forInnerConstructors) { if (!forInnerConstructorDelegationCalls) {
val withSynthetic = FirSyntheticPropertiesScope(session, scope) val withSynthetic = FirSyntheticPropertiesScope(session, scope)
withSynthetic.processScopeMembers { symbol -> withSynthetic.processScopeMembers { symbol ->
empty = false empty = false
@@ -149,7 +147,7 @@ class MemberScopeTowerLevel(
TowerScopeLevel.Token.Functions -> processMembers(processor) { consumer -> TowerScopeLevel.Token.Functions -> processMembers(processor) { consumer ->
this.processFunctionsAndConstructorsByName( this.processFunctionsAndConstructorsByName(
name, session, bodyResolveComponents, name, session, bodyResolveComponents,
noInnerConstructors = false, includeInnerConstructors = true,
processor = { processor = {
// WARNING, DO NOT CAST FUNCTIONAL TYPE ITSELF // WARNING, DO NOT CAST FUNCTIONAL TYPE ITSELF
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -164,11 +162,11 @@ class MemberScopeTowerLevel(
consumer(it as T) consumer(it as T)
} }
} }
TowerScopeLevel.Token.Constructors -> processMembers(processor, forInnerConstructors = true) { consumer -> TowerScopeLevel.Token.Constructors -> processMembers(processor, forInnerConstructorDelegationCalls = true) { consumer ->
this.processConstructorsByName( this.processConstructorsByName(
name, session, bodyResolveComponents, name, session, bodyResolveComponents,
noSyntheticConstructors = true, includeSyntheticConstructors = false,
noInnerConstructors = false, includeInnerConstructors = true,
processor = { processor = {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
consumer(it as T) consumer(it as T)
@@ -198,7 +196,7 @@ class ScopeTowerLevel(
val scope: FirScope, val scope: FirScope,
val extensionReceiver: ReceiverValue?, val extensionReceiver: ReceiverValue?,
private val extensionsOnly: Boolean, private val extensionsOnly: Boolean,
private val noInnerConstructors: Boolean private val includeInnerConstructors: Boolean
) : SessionBasedTowerLevel(session) { ) : SessionBasedTowerLevel(session) {
private fun FirCallableSymbol<*>.hasConsistentReceivers(extensionReceiver: Receiver?): Boolean = private fun FirCallableSymbol<*>.hasConsistentReceivers(extensionReceiver: Receiver?): Boolean =
when { when {
@@ -261,7 +259,7 @@ class ScopeTowerLevel(
name, name,
session, session,
bodyResolveComponents, bodyResolveComponents,
noInnerConstructors = noInnerConstructors includeInnerConstructors = includeInnerConstructors
) { candidate -> ) { candidate ->
empty = false empty = false
if (candidate.hasConsistentReceivers(extensionReceiver)) { if (candidate.hasConsistentReceivers(extensionReceiver)) {
@@ -302,6 +300,7 @@ class ConstructorScopeTowerLevel(
// NB: here we cannot resolve inner constructors, because they should have dispatch receiver // NB: here we cannot resolve inner constructors, because they should have dispatch receiver
if (!candidate.fir.isInner) { if (!candidate.fir.isInner) {
empty = false empty = false
@Suppress("UNCHECKED_CAST")
processor.consumeCandidate( processor.consumeCandidate(
candidate as T, candidate as T,
dispatchReceiverValue = null, dispatchReceiverValue = null,