getQualifiedExpressionTypeInfo refactoring
This commit is contained in:
+22
-21
@@ -275,6 +275,26 @@ class CallExpressionResolver(
|
|||||||
return noTypeInfo(context)
|
return noTypeInfo(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtQualifiedExpression.elementChain(context: ExpressionTypingContext) =
|
||||||
|
qualifiedExpressionResolver.resolveQualifierInExpressionAndUnroll(this, context) {
|
||||||
|
nameExpression ->
|
||||||
|
val temporaryForVariable = TemporaryTraceAndCache.create(
|
||||||
|
context, "trace to resolve as local variable or property", nameExpression)
|
||||||
|
val call = CallMaker.makePropertyCall(null, null, nameExpression)
|
||||||
|
val contextForVariable = BasicCallResolutionContext.create(
|
||||||
|
context.replaceTraceAndCache(temporaryForVariable),
|
||||||
|
call, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS)
|
||||||
|
val resolutionResult = callResolver.resolveSimpleProperty(contextForVariable)
|
||||||
|
|
||||||
|
if (resolutionResult.isSingleResult && resolutionResult.resultingDescriptor is FakeCallableDescriptorForObject) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
else when (resolutionResult.resultCode) {
|
||||||
|
NAME_NOT_FOUND, CANDIDATES_WITH_WRONG_RECEIVER -> false
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Visits a qualified expression like x.y or x?.z controlling data flow information changes.
|
* Visits a qualified expression like x.y or x?.z controlling data flow information changes.
|
||||||
|
|
||||||
@@ -284,27 +304,8 @@ class CallExpressionResolver(
|
|||||||
val currentContext = context.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(INDEPENDENT)
|
val currentContext = context.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(INDEPENDENT)
|
||||||
val trace = currentContext.trace
|
val trace = currentContext.trace
|
||||||
|
|
||||||
val elementChain = qualifiedExpressionResolver.resolveQualifierInExpressionAndUnroll(expression, context) {
|
val elementChain = expression.elementChain(context)
|
||||||
nameExpression ->
|
val firstReceiver = elementChain.first().receiver
|
||||||
val temporaryForVariable = TemporaryTraceAndCache.create(
|
|
||||||
context, "trace to resolve as local variable or property", nameExpression)
|
|
||||||
val call = CallMaker.makePropertyCall(null, null, nameExpression)
|
|
||||||
val contextForVariable = BasicCallResolutionContext.create(
|
|
||||||
context.replaceTraceAndCache(temporaryForVariable),
|
|
||||||
call, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS)
|
|
||||||
val resolutionResult = callResolver.resolveSimpleProperty(contextForVariable)
|
|
||||||
|
|
||||||
if (resolutionResult.isSingleResult && resolutionResult.resultingDescriptor is FakeCallableDescriptorForObject) {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
else when (resolutionResult.resultCode) {
|
|
||||||
NAME_NOT_FOUND, CANDIDATES_WITH_WRONG_RECEIVER -> false
|
|
||||||
else -> true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val firstElement = elementChain.first()
|
|
||||||
val firstReceiver = firstElement.receiver
|
|
||||||
|
|
||||||
var receiverTypeInfo = when (trace.get(BindingContext.QUALIFIER, firstReceiver)) {
|
var receiverTypeInfo = when (trace.get(BindingContext.QUALIFIER, firstReceiver)) {
|
||||||
null -> expressionTypingServices.getTypeInfo(firstReceiver, currentContext)
|
null -> expressionTypingServices.getTypeInfo(firstReceiver, currentContext)
|
||||||
|
|||||||
Reference in New Issue
Block a user