[FIR] fix resolve contract violation from scopes

We cannot call lazy resolve to STATUS phase from scopes as scopes may be accessed on a STATUS phase or earlier

^KT-54890
^KTIJ-23587 fixed
This commit is contained in:
Ilya Kirillov
2022-12-28 09:59:12 +01:00
committed by teamcity
parent 0d1e7e83b5
commit 1bbcae5ed2
311 changed files with 108 additions and 347 deletions
@@ -43,8 +43,8 @@ import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtElement
@@ -85,6 +85,7 @@ internal class KtFirScopeProvider(
override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope {
return memberScopeCache.getOrPut(classSymbol) {
val firScope = classSymbol.withFirForScope { fir ->
fir.lazyResolveToPhase(FirResolvePhase.STATUS)
val firSession = analysisSession.useSiteSession
fir.unsubstitutedScope(
firSession,
@@ -124,6 +125,7 @@ internal class KtFirScopeProvider(
?: return delegatedMemberScopeCache.getOrPut(classSymbol) { getEmptyScope() }
return delegatedMemberScopeCache.getOrPut(classSymbol) {
val firScope = classSymbol.withFirForScope { fir ->
fir.lazyResolveToPhase(FirResolvePhase.STATUS)
val delegateFields = fir.delegateFields
if (delegateFields.isNotEmpty()) {
val firSession = analysisSession.useSiteSession
@@ -170,7 +172,8 @@ internal class KtFirScopeProvider(
val firTypeScope = type.coneType.scope(
firSession,
scopeSession,
FakeOverrideTypeCalculator.Forced
FakeOverrideTypeCalculator.Forced,
requiredPhase = FirResolvePhase.STATUS,
) ?: return null
return KtCompositeTypeScope(
listOfNotNull(
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.utils.*
@@ -58,7 +59,8 @@ internal class KtFirPropertySetterSymbol(
val containingClassScope = firSymbol.dispatchReceiverType?.scope(
session,
firResolveSession.getScopeSessionFor(session),
FakeOverrideTypeCalculator.DoNothing
FakeOverrideTypeCalculator.DoNothing,
requiredPhase = FirResolvePhase.STATUS,
) ?: return false
val overriddenProperties = containingClassScope.getDirectOverriddenProperties(propertySymbol)
overriddenProperties.any { it.isVar }
@@ -14,9 +14,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
private val ownerPointer: KtSymbolPointer<KtSymbolWithMembers>,
@@ -28,6 +30,7 @@ internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
val scope = with(analysisSession) {
val ownerSymbol = ownerPointer.restoreSymbol() ?: return null
val owner = ownerSymbol.firSymbol as? FirClassSymbol ?: return null
owner.lazyResolveToPhase(FirResolvePhase.STATUS)
getSearchScope(owner)
} ?: return null
@@ -157,7 +157,7 @@ FILE: anonymousObjectInInvalidPosition.kt
private [BODY_RESOLVE] get(): <ERROR TYPE REF: Wrong number of type arguments>
public abstract [TYPES] interface A<[TYPES] T> : R|kotlin/Any| {
public abstract [STATUS] fun x(): R|kotlin/Unit|
public abstract [TYPES] fun x(): R|kotlin/Unit|
}