Pseudocode: Use call element stored in resolved calls to generate

call/read instructions
This commit is contained in:
Alexey Sedunov
2014-07-09 14:25:26 +04:00
parent 49edae7469
commit fd21b6cbe9
@@ -305,7 +305,7 @@ public class JetControlFlowProcessor {
ResolvedCall<?> resolvedCall = getResolvedCall(expression, trace.getBindingContext()); ResolvedCall<?> resolvedCall = getResolvedCall(expression, trace.getBindingContext());
if (resolvedCall instanceof VariableAsFunctionResolvedCall) { if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall; VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall;
generateCall(expression, variableAsFunctionResolvedCall.getVariableCall()); generateCall(variableAsFunctionResolvedCall.getVariableCall());
} }
else if (!generateCall(expression) && !(expression.getParent() instanceof JetCallExpression)) { else if (!generateCall(expression) && !(expression.getParent() instanceof JetCallExpression)) {
createNonSyntheticValue(expression, generateAndGetReceiverIfAny(expression)); createNonSyntheticValue(expression, generateAndGetReceiverIfAny(expression));
@@ -339,7 +339,7 @@ public class JetControlFlowProcessor {
else if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsKey(operationType)) { else if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsKey(operationType)) {
ResolvedCall<?> resolvedCall = getResolvedCall(expression, trace.getBindingContext()); ResolvedCall<?> resolvedCall = getResolvedCall(expression, trace.getBindingContext());
if (resolvedCall != null) { if (resolvedCall != null) {
PseudoValue rhsValue = generateCall(expression, resolvedCall).getOutputValue(); PseudoValue rhsValue = generateCall(resolvedCall).getOutputValue();
Name assignMethodName = OperatorConventions.getNameForOperationSymbol((JetToken) expression.getOperationToken()); Name assignMethodName = OperatorConventions.getNameForOperationSymbol((JetToken) expression.getOperationToken());
if (!resolvedCall.getResultingDescriptor().getName().equals(assignMethodName)) { if (!resolvedCall.getResultingDescriptor().getName().equals(assignMethodName)) {
/* At this point assignment of the form a += b actually means a = a + b /* At this point assignment of the form a += b actually means a = a + b
@@ -588,7 +588,7 @@ public class JetControlFlowProcessor {
PseudoValue rhsValue; PseudoValue rhsValue;
if (resolvedCall != null) { if (resolvedCall != null) {
rhsValue = generateCall(expression, resolvedCall).getOutputValue(); rhsValue = generateCall(resolvedCall).getOutputValue();
} }
else { else {
generateInstructions(baseExpression); generateInstructions(baseExpression);
@@ -1412,15 +1412,17 @@ public class JetControlFlowProcessor {
builder.compilationError(callElement, "No resolved call"); builder.compilationError(callElement, "No resolved call");
return false; return false;
} }
generateCall(callElement, resolvedCall); generateCall(resolvedCall);
return true; return true;
} }
@NotNull @NotNull
private InstructionWithValue generateCall(@NotNull JetElement callElement, @NotNull ResolvedCall<?> resolvedCall) { private InstructionWithValue generateCall(@NotNull ResolvedCall<?> resolvedCall) {
JetElement callElement = resolvedCall.getCall().getCallElement();
if (resolvedCall instanceof VariableAsFunctionResolvedCall) { if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall; VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall;
return generateCall(callElement, variableAsFunctionResolvedCall.getFunctionCall()); return generateCall(variableAsFunctionResolvedCall.getFunctionCall());
} }
CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor();