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.FirClass
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.transformers.ensureResolved
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerLiteralTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker
@@ -28,6 +30,8 @@ fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession)
val fullyExpandedType = fullyExpandedType(useSiteSession)
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)
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.transformers.body.resolve.firUnsafe
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.scopes.impl.FirILTTypeRefPlaceHolder
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator
@@ -291,6 +292,8 @@ internal fun Candidate.resolveArgument(
sink: CheckerSink
) {
argument.resultType.ensureResolvedTypeDeclaration(sink.components.session)
val expectedType = prepareExpectedType(sink.components.session, argument, parameter)
resolveArgumentExpression(
this.system.getBuilder(),
@@ -138,6 +138,7 @@ class FirCallCompletionResultsWriterTransformer(
val subCandidate = calleeReference.candidate
val resultType = typeRef.substituteTypeRef(subCandidate)
resultType.ensureResolvedTypeDeclaration(session)
result.replaceTypeRef(resultType)
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.FirProperty
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.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(
requiredPhase: FirResolvePhase,
@@ -37,3 +43,18 @@ fun AbstractFirBasedSymbol<*>.ensureResolvedForCalls(
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)
}