[FIR] Code cleanup: get rid of typeProvider hack

This commit is contained in:
simon.ogorodnik
2019-12-23 21:01:21 +03:00
committed by Mikhail Glukhikh
parent caf02806d5
commit 686965c0d3
10 changed files with 28 additions and 52 deletions
@@ -128,7 +128,7 @@ class FirCallResolver(
session, session,
file, file,
transformer.components.implicitReceiverStack transformer.components.implicitReceiverStack
) { it.resultType } )
towerResolver.reset() towerResolver.reset()
val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver) val consumer = createFunctionConsumer(session, name, info, this, towerResolver.collector, towerResolver)
@@ -165,7 +165,7 @@ class FirCallResolver(
session, session,
file, file,
transformer.components.implicitReceiverStack transformer.components.implicitReceiverStack
) { it.resultType } )
towerResolver.reset() towerResolver.reset()
val consumer = createVariableAndObjectConsumer( val consumer = createVariableAndObjectConsumer(
@@ -301,7 +301,7 @@ class FirCallResolver(
session, session,
file, file,
implicitReceiverStack implicitReceiverStack
) { it.resultType } )
val candidateFactory = CandidateFactory(this, callInfo) val candidateFactory = CandidateFactory(this, callInfo)
val candidates = mutableListOf<Candidate>() val candidates = mutableListOf<Candidate>()
@@ -405,7 +405,7 @@ class FirCallResolver(
expectedType, expectedType,
outerConstraintSystemBuilder, outerConstraintSystemBuilder,
lhs lhs
) { it.resultType } )
return createCallableReferencesConsumer(session, name, info, this, resultCollector) return createCallableReferencesConsumer(session, name, info, this, resultCollector)
} }
@@ -41,8 +41,7 @@ fun Candidate.resolveArgumentExpression(
sink: CheckerSink, sink: CheckerSink,
isReceiver: Boolean, isReceiver: Boolean,
isDispatch: Boolean, isDispatch: Boolean,
isSafeCall: Boolean, isSafeCall: Boolean
typeProvider: (FirExpression) -> FirTypeRef?
) { ) {
return when (argument) { return when (argument) {
is FirFunctionCall, is FirWhenExpression, is FirTryExpression, is FirCheckNotNullCall -> resolveSubCallArgument( is FirFunctionCall, is FirWhenExpression, is FirTryExpression, is FirCheckNotNullCall -> resolveSubCallArgument(
@@ -52,8 +51,7 @@ fun Candidate.resolveArgumentExpression(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
is FirCallableReferenceAccess -> is FirCallableReferenceAccess ->
if (argument.calleeReference is FirResolvedNamedReference) if (argument.calleeReference is FirResolvedNamedReference)
@@ -64,8 +62,7 @@ fun Candidate.resolveArgumentExpression(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
else else
preprocessCallableReference(argument, expectedType) preprocessCallableReference(argument, expectedType)
@@ -77,8 +74,7 @@ fun Candidate.resolveArgumentExpression(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
// TODO:! // TODO:!
is FirAnonymousFunction -> preprocessLambdaArgument(csBuilder, argument, expectedType, expectedTypeRef) is FirAnonymousFunction -> preprocessLambdaArgument(csBuilder, argument, expectedType, expectedTypeRef)
@@ -92,8 +88,7 @@ fun Candidate.resolveArgumentExpression(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
is FirBlock -> resolveBlockArgument( is FirBlock -> resolveBlockArgument(
csBuilder, csBuilder,
@@ -103,10 +98,9 @@ fun Candidate.resolveArgumentExpression(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
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, sink: CheckerSink,
isReceiver: Boolean, isReceiver: Boolean,
isDispatch: Boolean, isDispatch: Boolean,
isSafeCall: Boolean, isSafeCall: Boolean
typeProvider: (FirExpression) -> FirTypeRef?
) { ) {
val returnArguments = block.returnExpressions() val returnArguments = block.returnExpressions()
if (returnArguments.isEmpty()) { if (returnArguments.isEmpty()) {
@@ -144,8 +137,7 @@ private fun Candidate.resolveBlockArgument(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
} }
} }
@@ -157,8 +149,7 @@ fun Candidate.resolveSubCallArgument(
sink: CheckerSink, sink: CheckerSink,
isReceiver: Boolean, isReceiver: Boolean,
isDispatch: Boolean, isDispatch: Boolean,
isSafeCall: Boolean, isSafeCall: Boolean
typeProvider: (FirExpression) -> FirTypeRef?
) { ) {
val candidate = argument.candidate() ?: return resolvePlainExpressionArgument( val candidate = argument.candidate() ?: return resolvePlainExpressionArgument(
csBuilder, csBuilder,
@@ -167,8 +158,7 @@ fun Candidate.resolveSubCallArgument(
sink, sink,
isReceiver, isReceiver,
isDispatch, isDispatch,
isSafeCall, isSafeCall
typeProvider
) )
/* /*
* It's important to extract type from argument neither from symbol, because of symbol contains * It's important to extract type from argument neither from symbol, because of symbol contains
@@ -190,11 +180,10 @@ fun Candidate.resolvePlainExpressionArgument(
sink: CheckerSink, sink: CheckerSink,
isReceiver: Boolean, isReceiver: Boolean,
isDispatch: Boolean, isDispatch: Boolean,
isSafeCall: Boolean, isSafeCall: Boolean
typeProvider: (FirExpression) -> FirTypeRef?
) { ) {
if (expectedType == null) return if (expectedType == null) return
val argumentType = typeProvider(argument)?.coneTypeSafe<ConeKotlinType>() ?: return val argumentType = argument.typeRef.coneTypeSafe<ConeKotlinType>() ?: return
resolvePlainArgumentType(csBuilder, argumentType, expectedType, sink, isReceiver, isDispatch, isSafeCall) resolvePlainArgumentType(csBuilder, argumentType, expectedType, sink, isReceiver, isDispatch, isSafeCall)
checkApplicabilityForIntegerOperatorCall(sink, argument) checkApplicabilityForIntegerOperatorCall(sink, argument)
} }
@@ -276,7 +265,6 @@ internal fun Candidate.resolveArgument(
parameter: FirValueParameter, parameter: FirValueParameter,
isReceiver: Boolean, isReceiver: Boolean,
isSafeCall: Boolean, isSafeCall: Boolean,
typeProvider: (FirExpression) -> FirTypeRef?,
sink: CheckerSink sink: CheckerSink
) { ) {
@@ -289,8 +277,7 @@ internal fun Candidate.resolveArgument(
sink, sink,
isReceiver, isReceiver,
false, false,
isSafeCall, isSafeCall
typeProvider
) )
} }
@@ -40,9 +40,7 @@ class CallInfo(
// Three properties for callable references only // Three properties for callable references only
val expectedType: ConeKotlinType? = null, val expectedType: ConeKotlinType? = null,
val outerCSBuilder: ConstraintSystemBuilder? = null, val outerCSBuilder: ConstraintSystemBuilder? = null,
val lhs: DoubleColonLHS? = null, val lhs: DoubleColonLHS? = null
val typeProvider: (FirExpression) -> FirTypeRef?
) { ) {
val argumentCount get() = arguments.size val argumentCount get() = arguments.size
@@ -113,8 +113,7 @@ class InvokeReceiverCandidateCollector(
invokeCallInfo.implicitReceiverStack, invokeCallInfo.implicitReceiverStack,
invokeCallInfo.expectedType, invokeCallInfo.expectedType,
invokeCallInfo.outerCSBuilder, invokeCallInfo.outerCSBuilder,
invokeCallInfo.lhs, invokeCallInfo.lhs
invokeCallInfo.typeProvider
).let { ).let {
if (useExtensionReceiverAsArgument) it.withReceiverAsArgument(extensionReceiverExpression) if (useExtensionReceiverAsArgument) it.withReceiverAsArgument(extensionReceiverExpression)
else it else it
@@ -74,8 +74,7 @@ fun createFunctionConsumer(
callInfo.implicitReceiverStack, callInfo.implicitReceiverStack,
callInfo.expectedType, callInfo.expectedType,
callInfo.outerCSBuilder, callInfo.outerCSBuilder,
callInfo.lhs, callInfo.lhs
callInfo.typeProvider
) )
return PrioritizedTowerDataConsumer( return PrioritizedTowerDataConsumer(
resultCollector, resultCollector,
@@ -117,7 +116,7 @@ fun createSimpleConsumer(
val factory = CandidateFactory(bodyResolveComponents, callInfo) val factory = CandidateFactory(bodyResolveComponents, callInfo)
val explicitReceiver = callInfo.explicitReceiver val explicitReceiver = callInfo.explicitReceiver
return if (explicitReceiver != null) { return if (explicitReceiver != null) {
val receiverValue = ExpressionReceiverValue(explicitReceiver, callInfo.typeProvider) val receiverValue = ExpressionReceiverValue(explicitReceiver)
if (explicitReceiver is FirResolvedQualifier) { if (explicitReceiver is FirResolvedQualifier) {
val qualified = val qualified =
QualifiedReceiverTowerDataConsumer(session, name, token, receiverValue, factory, resultCollector) QualifiedReceiverTowerDataConsumer(session, name, token, receiverValue, factory, resultCollector)
@@ -46,11 +46,10 @@ class ClassDispatchReceiverValue(val klassSymbol: FirClassSymbol<*>) : ReceiverV
} }
class ExpressionReceiverValue( class ExpressionReceiverValue(
val explicitReceiverExpression: FirExpression, val explicitReceiverExpression: FirExpression
val typeProvider: (FirExpression) -> FirTypeRef?
) : ReceiverValue { ) : ReceiverValue {
override val type: ConeKotlinType override val type: ConeKotlinType
get() = typeProvider(explicitReceiverExpression)?.coneTypeSafe() get() = explicitReceiverExpression.typeRef.coneTypeSafe()
?: ConeKotlinErrorType("No type calculated for: ${explicitReceiverExpression.renderWithType()}") // TODO: assert here ?: ConeKotlinErrorType("No type calculated for: ${explicitReceiverExpression.renderWithType()}") // TODO: assert here
override val receiverExpression: FirExpression override val receiverExpression: FirExpression
@@ -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.diagnostics.FirUnresolvedReferenceError
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType 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.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.resolve.calls.components.InferenceSession import org.jetbrains.kotlin.resolve.calls.components.InferenceSession
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
@@ -39,7 +38,6 @@ interface LambdaAnalyzer {
class PostponedArgumentsAnalyzer( class PostponedArgumentsAnalyzer(
private val lambdaAnalyzer: LambdaAnalyzer, private val lambdaAnalyzer: LambdaAnalyzer,
private val typeProvider: (FirExpression) -> FirTypeRef?,
private val components: InferenceComponents, private val components: InferenceComponents,
private val candidate: Candidate, private val candidate: Candidate,
private val replacements: MutableMap<FirExpression, FirExpression>, private val replacements: MutableMap<FirExpression, FirExpression>,
@@ -148,8 +146,7 @@ class PostponedArgumentsAnalyzer(
checkerSink, checkerSink,
isReceiver = false, isReceiver = false,
isDispatch = false, isDispatch = false,
isSafeCall = false, isSafeCall = false
typeProvider = typeProvider
) )
// resolveKtPrimitive( // resolveKtPrimitive(
// c.getBuilder(), it, lambda.returnType.let(::substitute), diagnosticHolder, isReceiver = false // c.getBuilder(), it, lambda.returnType.let(::substitute), diagnosticHolder, isReceiver = false
@@ -110,8 +110,7 @@ internal sealed class CheckReceivers : ResolutionStage() {
sink = sink, sink = sink,
isReceiver = true, isReceiver = true,
isDispatch = this is Dispatch, isDispatch = this is Dispatch,
isSafeCall = callInfo.isSafeCall, isSafeCall = callInfo.isSafeCall
typeProvider = callInfo.typeProvider
) )
sink.yieldIfNeed() sink.yieldIfNeed()
} else { } else {
@@ -156,7 +155,6 @@ internal object CheckArguments : CheckerStage() {
parameter, parameter,
isReceiver = false, isReceiver = false,
isSafeCall = false, isSafeCall = false,
typeProvider = callInfo.typeProvider,
sink = sink sink = sink
) )
if (candidate.system.hasContradiction) { if (candidate.system.hasContradiction) {
@@ -79,7 +79,7 @@ class FirCallCompleter(
val analyzer = val analyzer =
PostponedArgumentsAnalyzer( PostponedArgumentsAnalyzer(
LambdaAnalyzerImpl(replacements), { it.resultType }, inferenceComponents, candidate, replacements, LambdaAnalyzerImpl(replacements), inferenceComponents, candidate, replacements,
transformer.components.callResolver transformer.components.callResolver
) )
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.inference.FirCallCompleter 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.FirAbstractBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.resolve.withNullability
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.SyntheticCallableId import org.jetbrains.kotlin.fir.symbols.SyntheticCallableId
@@ -146,7 +145,7 @@ class FirSyntheticCallGenerator(
session = session, session = session,
containingFile = file, containingFile = file,
implicitReceiverStack = implicitReceiverStack implicitReceiverStack = implicitReceiverStack
) { it.resultType } )
private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunctionImpl { private fun generateSyntheticSelectFunction(callableId: CallableId): FirSimpleFunctionImpl {
// Synthetic function signature: // Synthetic function signature: