[FIR IDE] Insert ensure resolve into checkers and scopes
This commit is contained in:
+5
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.chain
|
||||
import org.jetbrains.kotlin.fir.scopes.FakeOverrideSubstitution
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
@@ -222,6 +224,7 @@ class FirClassSubstitutionScope(
|
||||
val receiverType = member.receiverTypeRef?.coneType
|
||||
val newReceiverType = receiverType?.substitute(substitutor)
|
||||
|
||||
member.symbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
val fakeOverrideSubstitution = runIf(returnType == null) { FakeOverrideSubstitution(substitutor, member.symbol) }
|
||||
val newReturnType = returnType?.substitute(substitutor)
|
||||
@@ -233,6 +236,7 @@ class FirClassSubstitutionScope(
|
||||
val member = original.fir
|
||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||
|
||||
member.symbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
// TODO: do we have fields with implicit type?
|
||||
val newReturnType = returnType?.substitute() ?: return original
|
||||
@@ -245,6 +249,7 @@ class FirClassSubstitutionScope(
|
||||
val member = original.fir as FirSyntheticProperty
|
||||
if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
|
||||
|
||||
member.symbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
val fakeOverrideSubstitution = runIf(returnType == null) { FakeOverrideSubstitution(substitutor, original) }
|
||||
val newReturnType = returnType?.substitute()
|
||||
|
||||
+4
-1
@@ -108,6 +108,8 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
|
||||
overrideCandidate: FirCallableDeclaration,
|
||||
baseDeclaration: FirCallableDeclaration
|
||||
): ConeSubstitutor? {
|
||||
overrideCandidate.ensureResolved(FirResolvePhase.TYPES)
|
||||
baseDeclaration.ensureResolved(FirResolvePhase.TYPES)
|
||||
val substitutor = buildSubstitutorForOverridesCheck(overrideCandidate, baseDeclaration, session) ?: return null
|
||||
if (
|
||||
overrideCandidate.typeParameters.isNotEmpty() &&
|
||||
@@ -134,7 +136,6 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
|
||||
|
||||
overrideCandidate.ensureResolved(FirResolvePhase.TYPES)
|
||||
baseDeclaration.ensureResolved(FirResolvePhase.TYPES)
|
||||
|
||||
if (!isEqualReceiverTypes(overrideCandidate.receiverTypeRef, baseDeclaration.receiverTypeRef, substitutor)) return false
|
||||
|
||||
return overrideCandidate.valueParameters.zip(baseDeclaration.valueParameters).all { (memberParam, selfParam) ->
|
||||
@@ -150,6 +151,8 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
|
||||
|
||||
if (overrideCandidate !is FirProperty) return false
|
||||
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false
|
||||
overrideCandidate.ensureResolved(FirResolvePhase.TYPES)
|
||||
baseDeclaration.ensureResolved(FirResolvePhase.TYPES)
|
||||
return isEqualReceiverTypes(overrideCandidate.receiverTypeRef, baseDeclaration.receiverTypeRef, substitutor)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user