From 686965c0d37c93de76952085e3d297a96749984b Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Mon, 23 Dec 2019 21:01:21 +0300 Subject: [PATCH] [FIR] Code cleanup: get rid of typeProvider hack --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 8 ++-- .../kotlin/fir/resolve/calls/Arguments.kt | 41 +++++++------------ .../kotlin/fir/resolve/calls/Candidate.kt | 4 +- .../fir/resolve/calls/CandidateCollector.kt | 3 +- .../fir/resolve/calls/ConsumerFactories.kt | 5 +-- .../kotlin/fir/resolve/calls/FirReceivers.kt | 5 +-- .../calls/PostponedArgumentsAnalyzer.kt | 5 +-- .../kotlin/fir/resolve/calls/ResolverParts.kt | 4 +- .../fir/resolve/inference/FirCallCompleter.kt | 2 +- .../transformers/FirSyntheticCallGenerator.kt | 3 +- 10 files changed, 28 insertions(+), 52 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 06a598feb6f..93655ce82f6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -128,7 +128,7 @@ class FirCallResolver( session, file, transformer.components.implicitReceiverStack - ) { it.resultType } + ) towerResolver.reset() val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver) @@ -165,7 +165,7 @@ class FirCallResolver( session, file, transformer.components.implicitReceiverStack - ) { it.resultType } + ) towerResolver.reset() val consumer = createVariableAndObjectConsumer( @@ -301,7 +301,7 @@ class FirCallResolver( session, file, implicitReceiverStack - ) { it.resultType } + ) val candidateFactory = CandidateFactory(this, callInfo) val candidates = mutableListOf() @@ -405,7 +405,7 @@ class FirCallResolver( expectedType, outerConstraintSystemBuilder, lhs - ) { it.resultType } + ) return createCallableReferencesConsumer(session, name, info, this, resultCollector) } 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 faf31a04fbb..83bb7644403 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 @@ -41,8 +41,7 @@ fun Candidate.resolveArgumentExpression( sink: CheckerSink, isReceiver: Boolean, isDispatch: Boolean, - isSafeCall: Boolean, - typeProvider: (FirExpression) -> FirTypeRef? + isSafeCall: Boolean ) { return when (argument) { is FirFunctionCall, is FirWhenExpression, is FirTryExpression, is FirCheckNotNullCall -> resolveSubCallArgument( @@ -52,8 +51,7 @@ fun Candidate.resolveArgumentExpression( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) is FirCallableReferenceAccess -> if (argument.calleeReference is FirResolvedNamedReference) @@ -64,8 +62,7 @@ fun Candidate.resolveArgumentExpression( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) else preprocessCallableReference(argument, expectedType) @@ -77,8 +74,7 @@ fun Candidate.resolveArgumentExpression( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) // TODO:! is FirAnonymousFunction -> preprocessLambdaArgument(csBuilder, argument, expectedType, expectedTypeRef) @@ -92,8 +88,7 @@ fun Candidate.resolveArgumentExpression( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) is FirBlock -> resolveBlockArgument( csBuilder, @@ -103,10 +98,9 @@ fun Candidate.resolveArgumentExpression( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) - else -> resolvePlainExpressionArgument(csBuilder, argument, expectedType, sink, isReceiver, isDispatch, isSafeCall, typeProvider) + else -> resolvePlainExpressionArgument(csBuilder, argument, expectedType, sink, isReceiver, isDispatch, isSafeCall) } } @@ -118,8 +112,7 @@ private fun Candidate.resolveBlockArgument( sink: CheckerSink, isReceiver: Boolean, isDispatch: Boolean, - isSafeCall: Boolean, - typeProvider: (FirExpression) -> FirTypeRef? + isSafeCall: Boolean ) { val returnArguments = block.returnExpressions() if (returnArguments.isEmpty()) { @@ -144,8 +137,7 @@ private fun Candidate.resolveBlockArgument( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) } } @@ -157,8 +149,7 @@ fun Candidate.resolveSubCallArgument( sink: CheckerSink, isReceiver: Boolean, isDispatch: Boolean, - isSafeCall: Boolean, - typeProvider: (FirExpression) -> FirTypeRef? + isSafeCall: Boolean ) { val candidate = argument.candidate() ?: return resolvePlainExpressionArgument( csBuilder, @@ -167,8 +158,7 @@ fun Candidate.resolveSubCallArgument( sink, isReceiver, isDispatch, - isSafeCall, - typeProvider + isSafeCall ) /* * It's important to extract type from argument neither from symbol, because of symbol contains @@ -190,11 +180,10 @@ fun Candidate.resolvePlainExpressionArgument( sink: CheckerSink, isReceiver: Boolean, isDispatch: Boolean, - isSafeCall: Boolean, - typeProvider: (FirExpression) -> FirTypeRef? + isSafeCall: Boolean ) { if (expectedType == null) return - val argumentType = typeProvider(argument)?.coneTypeSafe() ?: return + val argumentType = argument.typeRef.coneTypeSafe() ?: return resolvePlainArgumentType(csBuilder, argumentType, expectedType, sink, isReceiver, isDispatch, isSafeCall) checkApplicabilityForIntegerOperatorCall(sink, argument) } @@ -276,7 +265,6 @@ internal fun Candidate.resolveArgument( parameter: FirValueParameter, isReceiver: Boolean, isSafeCall: Boolean, - typeProvider: (FirExpression) -> FirTypeRef?, sink: CheckerSink ) { @@ -289,8 +277,7 @@ internal fun Candidate.resolveArgument( sink, isReceiver, false, - isSafeCall, - typeProvider + isSafeCall ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt index 971ae4c20ba..e38dd1f8593 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt @@ -40,9 +40,7 @@ class CallInfo( // Three properties for callable references only val expectedType: ConeKotlinType? = null, val outerCSBuilder: ConstraintSystemBuilder? = null, - val lhs: DoubleColonLHS? = null, - - val typeProvider: (FirExpression) -> FirTypeRef? + val lhs: DoubleColonLHS? = null ) { val argumentCount get() = arguments.size diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateCollector.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateCollector.kt index 7f3477071cd..7bbf65ac9a7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateCollector.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateCollector.kt @@ -113,8 +113,7 @@ class InvokeReceiverCandidateCollector( invokeCallInfo.implicitReceiverStack, invokeCallInfo.expectedType, invokeCallInfo.outerCSBuilder, - invokeCallInfo.lhs, - invokeCallInfo.typeProvider + invokeCallInfo.lhs ).let { if (useExtensionReceiverAsArgument) it.withReceiverAsArgument(extensionReceiverExpression) else it diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConsumerFactories.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConsumerFactories.kt index dcdb58cc291..91d9e0563bc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConsumerFactories.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConsumerFactories.kt @@ -74,8 +74,7 @@ fun createFunctionConsumer( callInfo.implicitReceiverStack, callInfo.expectedType, callInfo.outerCSBuilder, - callInfo.lhs, - callInfo.typeProvider + callInfo.lhs ) return PrioritizedTowerDataConsumer( resultCollector, @@ -117,7 +116,7 @@ fun createSimpleConsumer( val factory = CandidateFactory(bodyResolveComponents, callInfo) val explicitReceiver = callInfo.explicitReceiver return if (explicitReceiver != null) { - val receiverValue = ExpressionReceiverValue(explicitReceiver, callInfo.typeProvider) + val receiverValue = ExpressionReceiverValue(explicitReceiver) if (explicitReceiver is FirResolvedQualifier) { val qualified = QualifiedReceiverTowerDataConsumer(session, name, token, receiverValue, factory, resultCollector) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index 556242d576a..3e815f6da99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -46,11 +46,10 @@ class ClassDispatchReceiverValue(val klassSymbol: FirClassSymbol<*>) : ReceiverV } class ExpressionReceiverValue( - val explicitReceiverExpression: FirExpression, - val typeProvider: (FirExpression) -> FirTypeRef? + val explicitReceiverExpression: FirExpression ) : ReceiverValue { override val type: ConeKotlinType - get() = typeProvider(explicitReceiverExpression)?.coneTypeSafe() + get() = explicitReceiverExpression.typeRef.coneTypeSafe() ?: ConeKotlinErrorType("No type calculated for: ${explicitReceiverExpression.renderWithType()}") // TODO: assert here override val receiverExpression: FirExpression diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArgumentsAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArgumentsAnalyzer.kt index 1a019ceeb75..d95aa941d54 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArgumentsAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArgumentsAnalyzer.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.references.impl.FirErrorNamedReferenceImpl import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedReferenceError import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference import org.jetbrains.kotlin.fir.types.ConeKotlinType -import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.resolve.calls.components.InferenceSession import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer @@ -39,7 +38,6 @@ interface LambdaAnalyzer { class PostponedArgumentsAnalyzer( private val lambdaAnalyzer: LambdaAnalyzer, - private val typeProvider: (FirExpression) -> FirTypeRef?, private val components: InferenceComponents, private val candidate: Candidate, private val replacements: MutableMap, @@ -148,8 +146,7 @@ class PostponedArgumentsAnalyzer( checkerSink, isReceiver = false, isDispatch = false, - isSafeCall = false, - typeProvider = typeProvider + isSafeCall = false ) // resolveKtPrimitive( // c.getBuilder(), it, lambda.returnType.let(::substitute), diagnosticHolder, isReceiver = false diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt index e4aedf6d0cf..1ed909341dc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolverParts.kt @@ -110,8 +110,7 @@ internal sealed class CheckReceivers : ResolutionStage() { sink = sink, isReceiver = true, isDispatch = this is Dispatch, - isSafeCall = callInfo.isSafeCall, - typeProvider = callInfo.typeProvider + isSafeCall = callInfo.isSafeCall ) sink.yieldIfNeed() } else { @@ -156,7 +155,6 @@ internal object CheckArguments : CheckerStage() { parameter, isReceiver = false, isSafeCall = false, - typeProvider = callInfo.typeProvider, sink = sink ) if (candidate.system.hasContradiction) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index b73b605ca0e..87503ed28be 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -79,7 +79,7 @@ class FirCallCompleter( val analyzer = PostponedArgumentsAnalyzer( - LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents, candidate, replacements, + LambdaAnalyzerImpl(replacements), inferenceComponents, candidate, replacements, transformer.components.callResolver ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt index 1c5e6808c2e..6942ad756b4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.inference.FirCallCompleter import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer -import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.SyntheticCallableId @@ -146,7 +145,7 @@ class FirSyntheticCallGenerator( session = session, containingFile = file, implicitReceiverStack = implicitReceiverStack - ) { it.resultType } + ) private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunctionImpl { // Synthetic function signature: