Don't commit trace with inapplicable provideDelegate operator
This helps in NI as there we have different logic for delegates inference
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -213,19 +213,30 @@ class DelegatedPropertyResolver(
|
|||||||
delegateExpression: KtExpression,
|
delegateExpression: KtExpression,
|
||||||
delegateType: KotlinType,
|
delegateType: KotlinType,
|
||||||
operatorRequired: Boolean = true
|
operatorRequired: Boolean = true
|
||||||
) {
|
): Boolean {
|
||||||
val expectedFunction = renderCall(delegateOperatorCall, trace.bindingContext)
|
val expectedFunction = renderCall(delegateOperatorCall, trace.bindingContext)
|
||||||
|
|
||||||
when {
|
val resolutionErrorFactory = when {
|
||||||
delegateOperatorResults.isSingleResult ||
|
delegateOperatorResults.isSingleResult ||
|
||||||
delegateOperatorResults.isIncomplete ||
|
delegateOperatorResults.isIncomplete ||
|
||||||
delegateOperatorResults.resultCode == OverloadResolutionResults.Code.MANY_FAILED_CANDIDATES ->
|
delegateOperatorResults.resultCode == OverloadResolutionResults.Code.MANY_FAILED_CANDIDATES -> DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE
|
||||||
trace.report(DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE.on(delegateExpression, expectedFunction, delegateOperatorResults.resultingCalls))
|
|
||||||
delegateOperatorResults.isAmbiguity ->
|
delegateOperatorResults.isAmbiguity -> DELEGATE_SPECIAL_FUNCTION_AMBIGUITY
|
||||||
trace.report(DELEGATE_SPECIAL_FUNCTION_AMBIGUITY.on(delegateExpression, expectedFunction, delegateOperatorResults.resultingCalls))
|
|
||||||
else ->
|
else -> null
|
||||||
if (operatorRequired) trace.report(DELEGATE_SPECIAL_FUNCTION_MISSING.on(delegateExpression, expectedFunction, delegateType))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (resolutionErrorFactory != null) {
|
||||||
|
trace.report(resolutionErrorFactory.on(delegateExpression, expectedFunction, delegateOperatorResults.resultingCalls))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (operatorRequired) {
|
||||||
|
trace.report(DELEGATE_SPECIAL_FUNCTION_MISSING.on(delegateExpression, expectedFunction, delegateType))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveProvideDelegateMethod(
|
private fun resolveProvideDelegateMethod(
|
||||||
@@ -239,16 +250,25 @@ class DelegatedPropertyResolver(
|
|||||||
if (!isOperatorProvideDelegateSupported) return
|
if (!isOperatorProvideDelegateSupported) return
|
||||||
if (trace.bindingContext.get(BindingContext.PROVIDE_DELEGATE_CALL, propertyDescriptor) != null) return
|
if (trace.bindingContext.get(BindingContext.PROVIDE_DELEGATE_CALL, propertyDescriptor) != null) return
|
||||||
|
|
||||||
|
val traceForProvideDelegate = TemporaryBindingTrace.create(trace, "trace to resolve provideDelegate method")
|
||||||
|
|
||||||
val provideDelegateResults = getProvideDelegateMethod(propertyDescriptor, byExpression, byExpressionType,
|
val provideDelegateResults = getProvideDelegateMethod(propertyDescriptor, byExpression, byExpressionType,
|
||||||
trace, initializerScope, dataFlowInfo)
|
traceForProvideDelegate, initializerScope, dataFlowInfo)
|
||||||
if (!provideDelegateResults.isSuccess) {
|
if (!provideDelegateResults.isSuccess) {
|
||||||
val call = trace.bindingContext.get(BindingContext.PROVIDE_DELEGATE_CALL, propertyDescriptor)
|
val call = traceForProvideDelegate.bindingContext.get(BindingContext.PROVIDE_DELEGATE_CALL, propertyDescriptor)
|
||||||
?: throw AssertionError("'getDelegatedPropertyConventionMethod' didn't record a call")
|
?: throw AssertionError("'getDelegatedPropertyConventionMethod' didn't record a call")
|
||||||
reportDelegateOperatorResolutionError(trace, call, provideDelegateResults, byExpression, byExpressionType,
|
val shouldCommitTrace = reportDelegateOperatorResolutionError(
|
||||||
operatorRequired = false)
|
traceForProvideDelegate, call, provideDelegateResults, byExpression, byExpressionType, operatorRequired = false)
|
||||||
|
|
||||||
|
if (shouldCommitTrace) {
|
||||||
|
traceForProvideDelegate.commit()
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
traceForProvideDelegate.commit()
|
||||||
|
|
||||||
val resultingDescriptor = provideDelegateResults.resultingDescriptor
|
val resultingDescriptor = provideDelegateResults.resultingDescriptor
|
||||||
if (!resultingDescriptor.isOperator) {
|
if (!resultingDescriptor.isOperator) {
|
||||||
// TODO resolved 'provideDelegate' function, which is not an operator - warning?
|
// TODO resolved 'provideDelegate' function, which is not an operator - warning?
|
||||||
|
|||||||
Reference in New Issue
Block a user