[FIR] rename requiredPhase to requiredMembersPhase for type scope
Also move `requiredMembersPhase` use inside `unsubstitutedScope` ^KT-56551
This commit is contained in:
committed by
Space Team
parent
52ce302095
commit
aaf173687b
+1
-1
@@ -279,7 +279,7 @@ internal class KtFirScopeProvider(
|
||||
firResolveSession.useSiteFirSession,
|
||||
getScopeSession(),
|
||||
FakeOverrideTypeCalculator.Forced,
|
||||
requiredPhase = FirResolvePhase.STATUS,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -234,8 +234,9 @@ internal object FirReferenceResolveHelper {
|
||||
session,
|
||||
analysisSession.getScopeSessionFor(analysisSession.useSiteSession),
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return emptyList()
|
||||
|
||||
return buildList {
|
||||
scope.processFunctionsByName(OperatorNameConventions.EQUALS) { functionSymbol ->
|
||||
val parameterSymbol = functionSymbol.valueParameterSymbols.singleOrNull()
|
||||
|
||||
+3
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -56,8 +56,9 @@ internal class KtFirPropertySetterSymbol(
|
||||
session,
|
||||
analysisSession.getScopeSessionFor(session),
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return false
|
||||
|
||||
val overriddenProperties = containingClassScope.getDirectOverriddenProperties(propertySymbol)
|
||||
overriddenProperties.any { it.isVar }
|
||||
}
|
||||
|
||||
+11
-7
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -212,13 +212,17 @@ abstract class AbstractAnnotationDeserializer(
|
||||
val symbol = lookupTag.toSymbol(session)
|
||||
val firAnnotationClass = (symbol as? FirRegularClassSymbol)?.fir ?: return@lazy null
|
||||
|
||||
val classScope =
|
||||
firAnnotationClass.defaultType()
|
||||
.scope(session, ScopeSession(), FakeOverrideTypeCalculator.DoNothing, requiredPhase = null)
|
||||
?: error("Null scope for $classId")
|
||||
val classScope = firAnnotationClass.defaultType().scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = ScopeSession(),
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = null,
|
||||
) ?: error("Null scope for $classId")
|
||||
|
||||
val constructor =
|
||||
classScope.getDeclaredConstructors().singleOrNull()?.fir ?: error("No single constructor found for $classId")
|
||||
val constructor = classScope.getDeclaredConstructors()
|
||||
.singleOrNull()
|
||||
?.fir
|
||||
?: error("No single constructor found for $classId")
|
||||
|
||||
constructor.valueParameters.associateBy { it.name }
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.getOrBuildScopeForIntegerConstantOpe
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
@@ -28,21 +27,26 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
fun FirSmartCastExpression.smartcastScope(
|
||||
useSiteSession: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
requiredPhase: FirResolvePhase? = null,
|
||||
requiredMembersPhase: FirResolvePhase? = null,
|
||||
): FirTypeScope? {
|
||||
val smartcastType = smartcastTypeWithoutNullableNothing?.coneType ?: smartcastType.coneType
|
||||
val smartcastScope = smartcastType.scope(
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
useSiteSession = useSiteSession,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = requiredMembersPhase,
|
||||
)
|
||||
|
||||
if (isStable) {
|
||||
return smartcastScope
|
||||
}
|
||||
val originalScope = originalExpression.typeRef.coneType
|
||||
.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase)
|
||||
?: return smartcastScope
|
||||
|
||||
val originalScope = originalExpression.typeRef.coneType.scope(
|
||||
useSiteSession = useSiteSession,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = requiredMembersPhase,
|
||||
) ?: return smartcastScope
|
||||
|
||||
if (smartcastScope == null) {
|
||||
return originalScope
|
||||
@@ -62,60 +66,58 @@ fun ConeKotlinType.scope(
|
||||
useSiteSession: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
fakeOverrideTypeCalculator: FakeOverrideTypeCalculator,
|
||||
requiredPhase: FirResolvePhase?,
|
||||
requiredMembersPhase: FirResolvePhase?,
|
||||
): FirTypeScope? {
|
||||
val scope = scope(useSiteSession, scopeSession, requiredPhase) ?: return null
|
||||
val scope = scope(useSiteSession, scopeSession, requiredMembersPhase) ?: return null
|
||||
if (fakeOverrideTypeCalculator == FakeOverrideTypeCalculator.DoNothing) return scope
|
||||
return FirScopeWithFakeOverrideTypeCalculator(scope, fakeOverrideTypeCalculator)
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession, requiredPhase: FirResolvePhase?): FirTypeScope? {
|
||||
return when (this) {
|
||||
is ConeErrorType -> null
|
||||
is ConeClassLikeType -> classScope(useSiteSession, scopeSession, requiredPhase, lookupTag)
|
||||
is ConeTypeParameterType -> {
|
||||
val symbol = lookupTag.symbol
|
||||
scopeSession.getOrBuild(symbol, TYPE_PARAMETER_SCOPE_KEY) {
|
||||
val intersectionType = ConeTypeIntersector.intersectTypes(
|
||||
useSiteSession.typeContext,
|
||||
symbol.resolvedBounds.map { it.coneType }
|
||||
)
|
||||
intersectionType.scope(useSiteSession, scopeSession, requiredPhase) ?: FirTypeScope.Empty
|
||||
}
|
||||
private fun ConeKotlinType.scope(
|
||||
useSiteSession: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
requiredMembersPhase: FirResolvePhase?,
|
||||
): FirTypeScope? = when (this) {
|
||||
is ConeErrorType -> null
|
||||
is ConeClassLikeType -> classScope(useSiteSession, scopeSession, requiredMembersPhase, lookupTag)
|
||||
is ConeTypeParameterType -> {
|
||||
val symbol = lookupTag.symbol
|
||||
scopeSession.getOrBuild(symbol, TYPE_PARAMETER_SCOPE_KEY) {
|
||||
val intersectionType = ConeTypeIntersector.intersectTypes(
|
||||
useSiteSession.typeContext,
|
||||
symbol.resolvedBounds.map { it.coneType }
|
||||
)
|
||||
|
||||
intersectionType.scope(useSiteSession, scopeSession, requiredMembersPhase) ?: FirTypeScope.Empty
|
||||
}
|
||||
|
||||
is ConeRawType -> lowerBound.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
is ConeDynamicType -> useSiteSession.dynamicMembersStorage.getDynamicScopeFor(scopeSession)
|
||||
is ConeFlexibleType -> lowerBound.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
is ConeIntersectionType -> FirTypeIntersectionScope.prepareIntersectionScope(
|
||||
useSiteSession,
|
||||
FirIntersectionScopeOverrideChecker(useSiteSession),
|
||||
intersectedTypes.mapNotNullTo(mutableListOf()) {
|
||||
it.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
},
|
||||
this
|
||||
)
|
||||
|
||||
is ConeDefinitelyNotNullType -> original.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
is ConeIntegerConstantOperatorType -> scopeSession.getOrBuildScopeForIntegerConstantOperatorType(useSiteSession, this)
|
||||
is ConeIntegerLiteralConstantType -> error("ILT should not be in receiver position")
|
||||
else -> null
|
||||
}
|
||||
|
||||
is ConeRawType -> lowerBound.scope(useSiteSession, scopeSession, requiredMembersPhase)
|
||||
is ConeDynamicType -> useSiteSession.dynamicMembersStorage.getDynamicScopeFor(scopeSession)
|
||||
is ConeFlexibleType -> lowerBound.scope(useSiteSession, scopeSession, requiredMembersPhase)
|
||||
is ConeIntersectionType -> FirTypeIntersectionScope.prepareIntersectionScope(
|
||||
useSiteSession,
|
||||
FirIntersectionScopeOverrideChecker(useSiteSession),
|
||||
intersectedTypes.mapNotNullTo(mutableListOf()) {
|
||||
it.scope(useSiteSession, scopeSession, requiredMembersPhase)
|
||||
},
|
||||
this
|
||||
)
|
||||
|
||||
is ConeDefinitelyNotNullType -> original.scope(useSiteSession, scopeSession, requiredMembersPhase)
|
||||
is ConeIntegerConstantOperatorType -> scopeSession.getOrBuildScopeForIntegerConstantOperatorType(useSiteSession, this)
|
||||
is ConeIntegerLiteralConstantType -> error("ILT should not be in receiver position")
|
||||
else -> null
|
||||
}
|
||||
|
||||
private fun ConeClassLikeType.classScope(
|
||||
useSiteSession: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
requiredPhase: FirResolvePhase?,
|
||||
requiredMembersPhase: FirResolvePhase?,
|
||||
memberOwnerLookupTag: ConeClassLikeLookupTag
|
||||
): FirTypeScope? {
|
||||
val fullyExpandedType = fullyExpandedType(useSiteSession)
|
||||
val fir = fullyExpandedType.lookupTag.toSymbol(useSiteSession)?.fir as? FirClass ?: return null
|
||||
|
||||
if (requiredPhase != null) {
|
||||
fir.symbol.lazyResolveToPhase(requiredPhase)
|
||||
}
|
||||
|
||||
val substitutor = when {
|
||||
attributes.contains(CompilerConeAttributes.RawType) -> ConeRawScopeSubstitutor(useSiteSession)
|
||||
else -> substitutorByMap(
|
||||
@@ -124,14 +126,7 @@ private fun ConeClassLikeType.classScope(
|
||||
)
|
||||
}
|
||||
|
||||
return fir.scopeForClass(substitutor, useSiteSession, scopeSession, memberOwnerLookupTag, requiredPhase)
|
||||
}
|
||||
|
||||
private fun ConeClassLikeType.obtainFirOfClass(useSiteSession: FirSession, requiredPhase: FirResolvePhase): FirClass? {
|
||||
val fullyExpandedType = fullyExpandedType(useSiteSession)
|
||||
val fir = fullyExpandedType.lookupTag.toSymbol(useSiteSession)?.fir as? FirClass ?: return null
|
||||
|
||||
return fir.also { it.symbol.lazyResolveToPhase(requiredPhase) }
|
||||
return fir.scopeForClass(substitutor, useSiteSession, scopeSession, memberOwnerLookupTag, requiredMembersPhase)
|
||||
}
|
||||
|
||||
fun FirClassSymbol<*>.defaultType(): ConeClassLikeType = fir.defaultType()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -39,8 +39,12 @@ interface ReceiverValue : Receiver {
|
||||
|
||||
val receiverExpression: FirExpression
|
||||
|
||||
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? =
|
||||
type.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? = type.scope(
|
||||
useSiteSession = useSiteSession,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
|
||||
// TODO: should inherit just Receiver, not ReceiverValue
|
||||
@@ -68,10 +72,21 @@ open class ExpressionReceiverValue(
|
||||
if (receiverExpr is FirCheckNotNullCall) {
|
||||
receiverExpr = receiverExpr.arguments.firstOrNull()
|
||||
}
|
||||
|
||||
if (receiverExpr is FirSmartCastExpression) {
|
||||
return receiverExpr.smartcastScope(useSiteSession, scopeSession, requiredPhase = FirResolvePhase.STATUS)
|
||||
return receiverExpr.smartcastScope(
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
return type.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
|
||||
return type.scope(
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +108,12 @@ sealed class ImplicitReceiverValue<S : FirBasedSymbol<*>>(
|
||||
val expandedType: ConeKotlinType = type.applyIf(type is ConeClassLikeType) { fullyExpandedType(useSiteSession) }
|
||||
|
||||
var implicitScope: FirTypeScope? =
|
||||
type.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
type.scope(
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS
|
||||
)
|
||||
private set
|
||||
|
||||
override fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? = implicitScope
|
||||
@@ -109,8 +129,12 @@ sealed class ImplicitReceiverValue<S : FirBasedSymbol<*>>(
|
||||
fun updateTypeInBuilderInference(type: ConeKotlinType) {
|
||||
this.type = type
|
||||
receiverExpression = receiverExpression(boundSymbol, type, contextReceiverNumber)
|
||||
implicitScope =
|
||||
type.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
implicitScope = type.scope(
|
||||
useSiteSession = useSiteSession,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -136,8 +160,13 @@ sealed class ImplicitReceiverValue<S : FirBasedSymbol<*>>(
|
||||
typeRef = smartcastType.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
|
||||
}
|
||||
}
|
||||
implicitScope =
|
||||
type.scope(useSiteSession, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
|
||||
implicitScope = type.scope(
|
||||
useSiteSession = useSiteSession,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
}
|
||||
|
||||
abstract fun createSnapshot(): ImplicitReceiverValue<S>
|
||||
|
||||
+4
-4
@@ -39,6 +39,10 @@ class FirKotlinScopeProvider(
|
||||
scopeSession: ScopeSession,
|
||||
memberRequiredPhase: FirResolvePhase?,
|
||||
): FirTypeScope {
|
||||
memberRequiredPhase?.let {
|
||||
klass.lazyResolveToPhaseWithCallableMembers(it)
|
||||
}
|
||||
|
||||
return scopeSession.getOrBuild(klass.symbol, USE_SITE) {
|
||||
val declaredScope = useSiteSession.declaredMemberScope(klass)
|
||||
|
||||
@@ -173,10 +177,6 @@ private fun FirClass.scopeForClassImpl(
|
||||
memberOwnerLookupTag: ConeClassLikeLookupTag?,
|
||||
memberRequiredPhase: FirResolvePhase?,
|
||||
): FirTypeScope {
|
||||
memberRequiredPhase?.let {
|
||||
lazyResolveToPhaseWithCallableMembers(it)
|
||||
}
|
||||
|
||||
val basicScope = unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false, memberRequiredPhase)
|
||||
if (substitutor == ConeSubstitutor.Empty) return basicScope
|
||||
|
||||
|
||||
@@ -29,8 +29,9 @@ fun debugCollectOverrides(symbol: FirCallableSymbol<*>, session: FirSession, sco
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return emptyMap()
|
||||
|
||||
return debugCollectOverrides(symbol, scope)
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@ class FirDelegatedMemberScope(
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = null,
|
||||
requiredMembersPhase = null,
|
||||
)
|
||||
|
||||
private fun collectFunctionsFromSpecificField(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -62,7 +62,12 @@ class FirDynamicScope @FirDynamicScopeConstructor constructor(
|
||||
override fun getClassifierNames(): Set<Name> = emptySet()
|
||||
|
||||
private val anyTypeScope by lazy {
|
||||
session.builtinTypes.anyType.type.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = null)
|
||||
session.builtinTypes.anyType.type.scope(
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = null,
|
||||
)
|
||||
}
|
||||
|
||||
override fun processFunctionsByName(
|
||||
|
||||
+8
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -35,8 +35,13 @@ class FirIntegerConstantOperatorScope(
|
||||
true -> session.builtinTypes.uIntType
|
||||
false -> session.builtinTypes.intType
|
||||
}.type
|
||||
baseType.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = null)
|
||||
?: error("Scope for $baseType not found")
|
||||
|
||||
baseType.scope(
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = null,
|
||||
) ?: error("Scope for $baseType not found")
|
||||
}
|
||||
|
||||
private val mappedFunctions = mutableMapOf<Name, FirNamedFunctionSymbol>()
|
||||
|
||||
@@ -203,7 +203,14 @@ fun ConeKotlinType.findContributedInvokeSymbol(
|
||||
} else {
|
||||
FakeOverrideTypeCalculator.DoNothing
|
||||
}
|
||||
val scope = scope(session, scopeSession, fakeOverrideTypeCalculator, requiredPhase = FirResolvePhase.STATUS) ?: return null
|
||||
|
||||
val scope = scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = fakeOverrideTypeCalculator,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return null
|
||||
|
||||
var declaredInvoke: FirNamedFunctionSymbol? = null
|
||||
scope.processFunctionsByName(OperatorNameConventions.INVOKE) { functionSymbol ->
|
||||
if (functionSymbol.fir.valueParameters.size == baseInvokeSymbol.fir.valueParameters.size) {
|
||||
|
||||
+8
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -176,8 +176,13 @@ private fun BodyResolveComponents.getCallableReferenceAdaptation(
|
||||
if (expectedArgumentsCount < 0) return null
|
||||
|
||||
val fakeArguments = createFakeArgumentsForReference(function, expectedArgumentsCount, inputTypes, unboundReceiverCount)
|
||||
val originScope = function.dispatchReceiverType
|
||||
?.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
val originScope = function.dispatchReceiverType?.scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
|
||||
val argumentMapping = mapArguments(fakeArguments, function, originScope = originScope, callSiteIsOperatorCall = false)
|
||||
if (argumentMapping.diagnostics.any { !it.applicability.isSuccess }) return null
|
||||
|
||||
|
||||
+1
-1
@@ -180,7 +180,7 @@ private fun processConstructors(
|
||||
session,
|
||||
bodyResolveComponents.scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
|
||||
val outerType = bodyResolveComponents.outerClassManager.outerType(type)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -129,14 +129,22 @@ private inline fun BodyResolveComponents.resolveSupertypesByMembers(
|
||||
|
||||
private fun BodyResolveComponents.getFunctionMembers(type: ConeKotlinType, name: Name): Collection<FirCallableDeclaration> =
|
||||
buildList {
|
||||
type.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
?.processFunctionsByName(name) { add(it.fir) }
|
||||
type.scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)?.processFunctionsByName(name) { add(it.fir) }
|
||||
}
|
||||
|
||||
private fun BodyResolveComponents.getPropertyMembers(type: ConeKotlinType, name: Name): Collection<FirCallableDeclaration> =
|
||||
buildList {
|
||||
type.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
?.processPropertiesByName(name) { addIfNotNull(it.fir as? FirVariable) }
|
||||
type.scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)?.processPropertiesByName(name) { addIfNotNull(it.fir as? FirVariable) }
|
||||
}
|
||||
|
||||
|
||||
|
||||
+9
-10
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -93,8 +93,9 @@ class MemberScopeTowerLevel(
|
||||
session,
|
||||
scopeSession,
|
||||
bodyResolveComponents.returnTypeCalculator.fakeOverrideTypeCalculator,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)
|
||||
|
||||
if (scopeWithoutSmartcast == null) {
|
||||
consumeCandidates(output, candidates)
|
||||
} else {
|
||||
@@ -133,14 +134,12 @@ class MemberScopeTowerLevel(
|
||||
// So, here we decide to preserve the K1 behavior just by converting the type to its non-raw version
|
||||
if (dispatchReceiverType.isRaw()) {
|
||||
typeForSyntheticScope = dispatchReceiverType.convertToNonRawVersion()
|
||||
useSiteForSyntheticScope =
|
||||
typeForSyntheticScope.scope(
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
)
|
||||
?: error("No scope for flexible type scope, while it's not null for $dispatchReceiverType")
|
||||
useSiteForSyntheticScope = typeForSyntheticScope.scope(
|
||||
session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: error("No scope for flexible type scope, while it's not null for $dispatchReceiverType")
|
||||
} else {
|
||||
typeForSyntheticScope = dispatchReceiverType
|
||||
useSiteForSyntheticScope = scope
|
||||
|
||||
+9
-5
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -48,12 +48,16 @@ class IntegerLiteralAndOperatorApproximationTransformer(
|
||||
private val TO_U_LONG = Name.identifier("toULong")
|
||||
}
|
||||
|
||||
private val toLongSymbol by lazy { findConversionFunction(session.builtinTypes.intType, TO_LONG)}
|
||||
private val toULongSymbol by lazy { findConversionFunction(session.builtinTypes.uIntType, TO_U_LONG)}
|
||||
private val toLongSymbol by lazy { findConversionFunction(session.builtinTypes.intType, TO_LONG) }
|
||||
private val toULongSymbol by lazy { findConversionFunction(session.builtinTypes.uIntType, TO_U_LONG) }
|
||||
|
||||
private fun findConversionFunction(receiverType: FirImplicitBuiltinTypeRef, name: Name): FirNamedFunctionSymbol {
|
||||
return receiverType.type.scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)!!
|
||||
.getFunctions(name).single()
|
||||
return receiverType.type.scope(
|
||||
useSiteSession = session,
|
||||
scopeSession = scopeSession,
|
||||
fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
)!!.getFunctions(name).single()
|
||||
}
|
||||
|
||||
override fun <E : FirElement> transformElement(element: E, data: ConeKotlinType?): E {
|
||||
|
||||
+16
-12
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.descriptors.isEnumClass
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
@@ -143,13 +142,19 @@ class FirExpectActualMatchingContext(
|
||||
true -> actualSession
|
||||
false -> symbol.moduleData.session
|
||||
}
|
||||
val scope = symbol.defaultType()
|
||||
.scope(useSiteSession = session, scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredPhase = FirResolvePhase.STATUS)
|
||||
?: return emptyList()
|
||||
|
||||
val scope = symbol.defaultType().scope(
|
||||
useSiteSession = session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return emptyList()
|
||||
|
||||
return mutableListOf<FirBasedSymbol<*>>().apply {
|
||||
for (name in scope.getCallableNames()) {
|
||||
scope.getMembersTo(this, name)
|
||||
}
|
||||
|
||||
// TODO: replace with scope lookup
|
||||
for (name in symbol.declarationSymbols.mapNotNull { (it as? FirRegularClassSymbol)?.classId?.shortClassName }) {
|
||||
addIfNotNull(scope.getSingleClassifier(name) as? FirRegularClassSymbol)
|
||||
@@ -160,14 +165,13 @@ class FirExpectActualMatchingContext(
|
||||
|
||||
override fun RegularClassSymbolMarker.getMembersForExpectClass(name: Name): List<FirCallableSymbol<*>> {
|
||||
val symbol = asSymbol()
|
||||
val scope = symbol.defaultType()
|
||||
.scope(
|
||||
useSiteSession = symbol.moduleData.session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredPhase = FirResolvePhase.STATUS
|
||||
)
|
||||
?: return emptyList()
|
||||
val scope = symbol.defaultType().scope(
|
||||
useSiteSession = symbol.moduleData.session,
|
||||
scopeSession,
|
||||
FakeOverrideTypeCalculator.DoNothing,
|
||||
requiredMembersPhase = FirResolvePhase.STATUS,
|
||||
) ?: return emptyList()
|
||||
|
||||
return mutableListOf<FirCallableSymbol<*>>().apply {
|
||||
scope.getMembersTo(this, name)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user