From 992a2d556af406d1d3bb5804b689e3d344c5410a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 27 Aug 2020 18:10:33 +0300 Subject: [PATCH] FIR: Add ensureResolved calls for types of sub-expressions These calls resolve a class that a type of expression is built upon --- .../kotlin/fir/resolve/ScopeUtils.kt | 4 ++++ .../kotlin/fir/resolve/calls/Arguments.kt | 3 +++ ...rCallCompletionResultsWriterTransformer.kt | 1 + .../fir/resolve/transformers/PhaseUtils.kt | 21 +++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 9a6cb4c54e7..396d10c2888 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -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) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index 9f7b68b316f..250e6f88ed8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -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(), diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index d4b16382171..2da1104e6e2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -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) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt index 70d43c7f909..24bf43d8c65 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/PhaseUtils.kt @@ -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()?.ensureResolvedTypeDeclaration(useSiteSession) +}