[FIR] Refactor boolean flags related to constructors: !no -> include
This commit is contained in:
+16
-30
@@ -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
|
||||||
|
|||||||
+4
-4
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
+11
-12
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user