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:
@@ -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(),
|
||||||
|
|||||||
+1
@@ -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)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user