[NI] Postprocess lambda result expressions on call completion

Should update type to denotable, e.g.,
IntegerValueType(x) to proper numeric type.

TODO extract common code into some ValueArgumentPostprocessor
This commit is contained in:
Dmitry Petrov
2017-04-18 18:26:59 +03:00
committed by Stanislav Erokhin
parent 1d6ed4ef8e
commit 2bdeef7970
6 changed files with 44 additions and 16 deletions
@@ -26,7 +26,7 @@ interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
interface CommonSupertypeCalculator: (Collection<UnwrappedType>) -> UnwrappedType
interface LambdaAnalyzer {
fun analyzeAndGetRelatedCalls(
fun analyzeAndGetLambdaResultArguments(
topLevelCall: KotlinCall,
lambdaArgument: LambdaKotlinCallArgument,
receiverType: UnwrappedType?,
@@ -245,10 +245,10 @@ class KotlinCallCompleter(
val receiver = lambda.receiver?.let(::substitute)
val parameters = lambda.parameters.map(::substitute)
val expectedType = lambda.returnType.takeIf { c.canBeProper(it) }?.let(::substitute)
val callsFromLambda = lambdaAnalyzer.analyzeAndGetRelatedCalls(topLevelCall, lambda.argument, receiver, parameters, expectedType)
lambda.analyzed = true
lambda.resultArguments = lambdaAnalyzer.analyzeAndGetLambdaResultArguments(topLevelCall, lambda.argument, receiver, parameters, expectedType)
for (innerCall in callsFromLambda) {
for (innerCall in lambda.resultArguments) {
// todo strange code -- why top-level kotlinCall? may be it isn't right outer call
CheckArguments.checkArgument(topLevelCallContext, topLevelCall, c.getBuilder(), innerCall, lambda.returnType)
}
@@ -51,6 +51,8 @@ class ResolvedLambdaArgument(
override val inputType: Collection<UnwrappedType> get() = receiver?.let { parameters + it } ?: parameters
override val outputType: UnwrappedType get() = returnType
lateinit var resultArguments: List<KotlinCallArgument>
}