FIR: Add ensureResolved calls for types of sub-expressions

These calls resolve a class that a type of expression is built upon
This commit is contained in:
Denis Zharkov
2020-08-27 18:10:33 +03:00
parent d05e947d25
commit 992a2d556a
4 changed files with 29 additions and 0 deletions
@@ -9,7 +9,9 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolved
import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerLiteralTypeScope import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerLiteralTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker
@@ -28,6 +30,8 @@ fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession)
val fullyExpandedType = fullyExpandedType(useSiteSession) val fullyExpandedType = fullyExpandedType(useSiteSession)
val fir = fullyExpandedType.lookupTag.toSymbol(useSiteSession)?.fir as? FirClass<*> ?: return null val fir = fullyExpandedType.lookupTag.toSymbol(useSiteSession)?.fir as? FirClass<*> ?: return null
fir.symbol.ensureResolved(FirResolvePhase.STATUS, useSiteSession)
val substitution = createSubstitution(fir.typeParameters, fullyExpandedType.typeArguments, useSiteSession) val substitution = createSubstitution(fir.typeParameters, fullyExpandedType.typeArguments, useSiteSession)
fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession, skipPrivateMembers = false) fir.scope(substitutorByMap(substitution), useSiteSession, scopeSession, skipPrivateMembers = false)
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.inference.preprocessCallableReference
import org.jetbrains.kotlin.fir.resolve.inference.preprocessLambdaArgument import org.jetbrains.kotlin.fir.resolve.inference.preprocessLambdaArgument
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedTypeDeclaration
import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.returnExpressions
import org.jetbrains.kotlin.fir.scopes.impl.FirILTTypeRefPlaceHolder import org.jetbrains.kotlin.fir.scopes.impl.FirILTTypeRefPlaceHolder
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator
@@ -291,6 +292,8 @@ internal fun Candidate.resolveArgument(
sink: CheckerSink sink: CheckerSink
) { ) {
argument.resultType.ensureResolvedTypeDeclaration(sink.components.session)
val expectedType = prepareExpectedType(sink.components.session, argument, parameter) val expectedType = prepareExpectedType(sink.components.session, argument, parameter)
resolveArgumentExpression( resolveArgumentExpression(
this.system.getBuilder(), this.system.getBuilder(),
@@ -138,6 +138,7 @@ class FirCallCompletionResultsWriterTransformer(
val subCandidate = calleeReference.candidate val subCandidate = calleeReference.candidate
val resultType = typeRef.substituteTypeRef(subCandidate) val resultType = typeRef.substituteTypeRef(subCandidate)
resultType.ensureResolvedTypeDeclaration(session)
result.replaceTypeRef(resultType) result.replaceTypeRef(resultType)
if (mode == Mode.DelegatedPropertyCompletion) { if (mode == Mode.DelegatedPropertyCompletion) {
@@ -10,7 +10,13 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe
fun AbstractFirBasedSymbol<*>.ensureResolved( fun AbstractFirBasedSymbol<*>.ensureResolved(
requiredPhase: FirResolvePhase, requiredPhase: FirResolvePhase,
@@ -37,3 +43,18 @@ fun AbstractFirBasedSymbol<*>.ensureResolvedForCalls(
ensureResolved(requiredPhase, useSiteSession) ensureResolved(requiredPhase, useSiteSession)
} }
fun ConeKotlinType.ensureResolvedTypeDeclaration(
useSiteSession: FirSession,
) {
if (this !is ConeClassLikeType) return
lookupTag.toSymbol(useSiteSession)?.ensureResolved(FirResolvePhase.STATUS, useSiteSession)
fullyExpandedType(useSiteSession).lookupTag.toSymbol(useSiteSession)?.ensureResolved(FirResolvePhase.STATUS, useSiteSession)
}
fun FirTypeRef.ensureResolvedTypeDeclaration(
useSiteSession: FirSession,
) {
coneTypeSafe<ConeKotlinType>()?.ensureResolvedTypeDeclaration(useSiteSession)
}