Minor, add ExpressionCodegen.resolvedCall() utility

To obtain a resolved call by an expression with a non-null assertion
This commit is contained in:
Alexander Udalov
2014-05-05 17:31:32 +04:00
parent fc3db8db38
commit e4f4ea4027
@@ -322,6 +322,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return type == null ? Type.VOID_TYPE : asmType(type);
}
@NotNull
public ResolvedCall<?> resolvedCall(JetExpression expression) {
ResolvedCall<?> resolvedCall = bindingContext.get(RESOLVED_CALL, expression);
assert resolvedCall != null : "Unresolved call: " + expression.getText();
return resolvedCall;
}
@Override
public StackValue visitParenthesizedExpression(@NotNull JetParenthesizedExpression expression, StackValue receiver) {
return genQualified(receiver, expression.getExpression());
@@ -1347,8 +1354,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
assert superConstructor != null;
CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor);
Type[] argumentTypes = superCallable.getAsmMethod().getArgumentTypes();
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, superCall.getCalleeExpression());
assert resolvedCall != null;
ResolvedCall<?> resolvedCall = resolvedCall(superCall.getCalleeExpression());
pushMethodArgumentsWithoutCallReceiver(resolvedCall, Arrays.asList(argumentTypes), false, defaultCallGenerator);
}
@@ -1892,11 +1898,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
JetExpression callee = expression.getCalleeExpression();
assert callee != null;
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, callee);
if (resolvedCall == null) {
throw new CompilationException("Cannot resolve: " + callee.getText(), null, expression);
}
ResolvedCall<?> resolvedCall = resolvedCall(callee);
DeclarationDescriptor funDescriptor = resolvedCall.getResultingDescriptor();
if (!(funDescriptor instanceof FunctionDescriptor)) {
@@ -2421,9 +2423,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
FunctionDescriptor functionDescriptor = bindingContext.get(FUNCTION, expression);
assert functionDescriptor != null : "Callable reference is not resolved to descriptor: " + expression.getText();
ResolvedCall<?> resolvedCall = bindingContext.get(RESOLVED_CALL, expression.getCallableReference());
assert resolvedCall != null : "Callable reference is not resolved: " + functionDescriptor + " " + expression.getText();
JetType kFunctionType = bindingContext.get(EXPRESSION_TYPE, expression);
assert kFunctionType != null : "Callable reference is not type checked: " + expression.getText();
ClassDescriptor kFunctionImpl = functionTypeToImpl(kFunctionType);
@@ -2431,7 +2430,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type closureSuperClass = typeMapper.mapType(kFunctionImpl);
CallableReferenceGenerationStrategy strategy = new CallableReferenceGenerationStrategy(state, functionDescriptor, resolvedCall);
CallableReferenceGenerationStrategy strategy =
new CallableReferenceGenerationStrategy(state, functionDescriptor, resolvedCall(expression.getCallableReference()));
ClosureCodegen closureCodegen = new ClosureCodegen(state, expression, functionDescriptor, null, closureSuperClass, context,
KotlinSyntheticClass.Kind.CALLABLE_REFERENCE_WRAPPER,
this, strategy, getParentCodegen());
@@ -2632,8 +2632,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return generateIn(StackValue.expression(Type.INT_TYPE, expression.getLeft(), this), expression.getRight(), reference);
}
else {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, reference);
assert resolvedCall != null : "Binary expression call is unresolved: " + expression.getText();
ResolvedCall<?> resolvedCall = resolvedCall(reference);
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
Callable callable = resolveToCallable(descriptor, false);
@@ -2655,7 +2654,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
genInIntRange(leftValue, (JetBinaryExpression) deparenthesized);
}
else {
invokeFunctionByReference(operationReference);
invokeFunction(
bindingContext.get(CALL, operationReference),
StackValue.none(),
resolvedCall(operationReference)
);
}
if (operationReference.getReferencedNameElementType() == JetTokens.NOT_IN) {
genInvertBoolean(v);
@@ -2821,8 +2824,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
private StackValue generateComparison(JetBinaryExpression expression, StackValue receiver) {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null : "compareTo target should be resolved: " + expression.getText();
ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
JetExpression left = expression.getLeft();
@@ -2857,8 +2859,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
private StackValue generateAugmentedAssignment(JetBinaryExpression expression) {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null : "Augmented assignment call is unresolved: " + expression.getText();
ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
Callable callable = resolveToCallable(descriptor, false);
JetExpression lhs = expression.getLeft();
@@ -2964,8 +2965,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
DeclarationDescriptor cls = op.getContainingDeclaration();
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) {
Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference());
@@ -3047,8 +3047,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
storeType = type;
}
else {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
Callable callable = resolveToCallable((FunctionDescriptor) op, false);
CallableMethod callableMethod = (CallableMethod) callable;
callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall);
@@ -3867,12 +3866,6 @@ The "returned" value of try expression with no finally is either the last expres
return true;
}
private void invokeFunctionByReference(JetSimpleNameExpression operationReference) {
ResolvedCall<?> resolvedCall = bindingContext.get(RESOLVED_CALL, operationReference);
Call call = bindingContext.get(CALL, operationReference);
invokeFunction(call, StackValue.none(), resolvedCall);
}
private boolean isIntRangeExpr(JetExpression rangeExpression) {
if (rangeExpression instanceof JetBinaryExpression) {
JetBinaryExpression binaryExpression = (JetBinaryExpression) rangeExpression;