[NI] Fix coroutine inference for qualified chained call with stub type

This commit is contained in:
Mikhail Zarechenskiy
2020-02-26 14:16:41 +03:00
parent a47c818a3c
commit 5ed28b38be
4 changed files with 108 additions and 6 deletions
@@ -304,23 +304,31 @@ class CallExpressionResolver(
private fun KtQualifiedExpression.elementChain(context: ExpressionTypingContext) =
qualifiedExpressionResolver.resolveQualifierInExpressionAndUnroll(this, context) { nameExpression ->
val resolutionResult = resolveSimpleName(context, nameExpression)
val temporaryTraceAndCache =
TemporaryTraceAndCache.create(context, "trace to resolve as local variable or property", nameExpression)
val resolutionResult = resolveSimpleName(context, nameExpression, temporaryTraceAndCache)
if (resolutionResult.isSingleResult && resolutionResult.resultingDescriptor is FakeCallableDescriptorForObject) {
false
} else when (resolutionResult.resultCode) {
NAME_NOT_FOUND, CANDIDATES_WITH_WRONG_RECEIVER -> false
else -> !context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference) || resolutionResult.isSuccess
else -> {
val newInferenceEnabled = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
val success = !newInferenceEnabled || resolutionResult.isSuccess
if (newInferenceEnabled && success) {
temporaryTraceAndCache.commit()
}
success
}
}
}
private fun resolveSimpleName(
context: ExpressionTypingContext, expression: KtSimpleNameExpression
context: ExpressionTypingContext, expression: KtSimpleNameExpression, traceAndCache: TemporaryTraceAndCache
): OverloadResolutionResults<VariableDescriptor> {
val temporaryForVariable = TemporaryTraceAndCache.create(context, "trace to resolve as local variable or property", expression)
val call = CallMaker.makePropertyCall(null, null, expression)
val contextForVariable = BasicCallResolutionContext.create(
context.replaceTraceAndCache(temporaryForVariable), call, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS
context.replaceTraceAndCache(traceAndCache), call, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS
)
return callResolver.resolveSimpleProperty(contextForVariable)
}