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); 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 @Override
public StackValue visitParenthesizedExpression(@NotNull JetParenthesizedExpression expression, StackValue receiver) { public StackValue visitParenthesizedExpression(@NotNull JetParenthesizedExpression expression, StackValue receiver) {
return genQualified(receiver, expression.getExpression()); return genQualified(receiver, expression.getExpression());
@@ -1347,8 +1354,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
assert superConstructor != null; assert superConstructor != null;
CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor); CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor);
Type[] argumentTypes = superCallable.getAsmMethod().getArgumentTypes(); Type[] argumentTypes = superCallable.getAsmMethod().getArgumentTypes();
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, superCall.getCalleeExpression()); ResolvedCall<?> resolvedCall = resolvedCall(superCall.getCalleeExpression());
assert resolvedCall != null;
pushMethodArgumentsWithoutCallReceiver(resolvedCall, Arrays.asList(argumentTypes), false, defaultCallGenerator); pushMethodArgumentsWithoutCallReceiver(resolvedCall, Arrays.asList(argumentTypes), false, defaultCallGenerator);
} }
@@ -1892,11 +1898,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
JetExpression callee = expression.getCalleeExpression(); JetExpression callee = expression.getCalleeExpression();
assert callee != null; assert callee != null;
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, callee); ResolvedCall<?> resolvedCall = resolvedCall(callee);
if (resolvedCall == null) {
throw new CompilationException("Cannot resolve: " + callee.getText(), null, expression);
}
DeclarationDescriptor funDescriptor = resolvedCall.getResultingDescriptor(); DeclarationDescriptor funDescriptor = resolvedCall.getResultingDescriptor();
if (!(funDescriptor instanceof FunctionDescriptor)) { if (!(funDescriptor instanceof FunctionDescriptor)) {
@@ -2421,9 +2423,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
FunctionDescriptor functionDescriptor = bindingContext.get(FUNCTION, expression); FunctionDescriptor functionDescriptor = bindingContext.get(FUNCTION, expression);
assert functionDescriptor != null : "Callable reference is not resolved to descriptor: " + expression.getText(); 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); JetType kFunctionType = bindingContext.get(EXPRESSION_TYPE, expression);
assert kFunctionType != null : "Callable reference is not type checked: " + expression.getText(); assert kFunctionType != null : "Callable reference is not type checked: " + expression.getText();
ClassDescriptor kFunctionImpl = functionTypeToImpl(kFunctionType); ClassDescriptor kFunctionImpl = functionTypeToImpl(kFunctionType);
@@ -2431,7 +2430,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type closureSuperClass = typeMapper.mapType(kFunctionImpl); 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, ClosureCodegen closureCodegen = new ClosureCodegen(state, expression, functionDescriptor, null, closureSuperClass, context,
KotlinSyntheticClass.Kind.CALLABLE_REFERENCE_WRAPPER, KotlinSyntheticClass.Kind.CALLABLE_REFERENCE_WRAPPER,
this, strategy, getParentCodegen()); 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); return generateIn(StackValue.expression(Type.INT_TYPE, expression.getLeft(), this), expression.getRight(), reference);
} }
else { else {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, reference); ResolvedCall<?> resolvedCall = resolvedCall(reference);
assert resolvedCall != null : "Binary expression call is unresolved: " + expression.getText();
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
Callable callable = resolveToCallable(descriptor, false); Callable callable = resolveToCallable(descriptor, false);
@@ -2655,7 +2654,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
genInIntRange(leftValue, (JetBinaryExpression) deparenthesized); genInIntRange(leftValue, (JetBinaryExpression) deparenthesized);
} }
else { else {
invokeFunctionByReference(operationReference); invokeFunction(
bindingContext.get(CALL, operationReference),
StackValue.none(),
resolvedCall(operationReference)
);
} }
if (operationReference.getReferencedNameElementType() == JetTokens.NOT_IN) { if (operationReference.getReferencedNameElementType() == JetTokens.NOT_IN) {
genInvertBoolean(v); genInvertBoolean(v);
@@ -2821,8 +2824,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
private StackValue generateComparison(JetBinaryExpression expression, StackValue receiver) { private StackValue generateComparison(JetBinaryExpression expression, StackValue receiver) {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
assert resolvedCall != null : "compareTo target should be resolved: " + expression.getText();
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
JetExpression left = expression.getLeft(); JetExpression left = expression.getLeft();
@@ -2857,8 +2859,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
private StackValue generateAugmentedAssignment(JetBinaryExpression expression) { private StackValue generateAugmentedAssignment(JetBinaryExpression expression) {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
assert resolvedCall != null : "Augmented assignment call is unresolved: " + expression.getText();
FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
Callable callable = resolveToCallable(descriptor, false); Callable callable = resolveToCallable(descriptor, false);
JetExpression lhs = expression.getLeft(); JetExpression lhs = expression.getLeft();
@@ -2964,8 +2965,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
DeclarationDescriptor cls = op.getContainingDeclaration(); DeclarationDescriptor cls = op.getContainingDeclaration();
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
assert resolvedCall != null;
if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) { if (isPrimitiveNumberClassDescriptor(cls) || !(op.getName().asString().equals("inc") || op.getName().asString().equals("dec"))) {
Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference()); Call call = bindingContext.get(BindingContext.CALL, expression.getOperationReference());
@@ -3047,8 +3047,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
storeType = type; storeType = type;
} }
else { else {
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); ResolvedCall<?> resolvedCall = resolvedCall(expression.getOperationReference());
assert resolvedCall != null;
Callable callable = resolveToCallable((FunctionDescriptor) op, false); Callable callable = resolveToCallable((FunctionDescriptor) op, false);
CallableMethod callableMethod = (CallableMethod) callable; CallableMethod callableMethod = (CallableMethod) callable;
callableMethod.invokeWithNotNullAssertion(v, state, resolvedCall); 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; 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) { private boolean isIntRangeExpr(JetExpression rangeExpression) {
if (rangeExpression instanceof JetBinaryExpression) { if (rangeExpression instanceof JetBinaryExpression) {
JetBinaryExpression binaryExpression = (JetBinaryExpression) rangeExpression; JetBinaryExpression binaryExpression = (JetBinaryExpression) rangeExpression;