generate elvis

This commit is contained in:
Dmitry Jemerov
2011-04-15 15:02:09 +02:00
parent 4987b8460c
commit c27341b460
2 changed files with 29 additions and 2 deletions
@@ -27,6 +27,8 @@ public class ExpressionCodegen extends JetVisitor {
private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder";
private static final String CLASS_COMPARABLE = "java/lang/Comparable";
private static final Type TYPE_OBJECT = Type.getObjectType(CLASS_OBJECT);
private final Stack<Label> myLoopStarts = new Stack<Label>();
private final Stack<Label> myLoopEnds = new Stack<Label>();
private final Stack<StackValue> myStack = new Stack<StackValue>();
@@ -387,7 +389,7 @@ public class ExpressionCodegen extends JetVisitor {
final JetDotQualifiedExpression parent = (JetDotQualifiedExpression) expression.getParent();
if (!resolvesToClassOrPackage(parent.getReceiverExpression())) {
// we have a receiver on stack
myStack.pop().put(Type.getObjectType(CLASS_OBJECT), v);
myStack.pop().put(TYPE_OBJECT, v);
}
}
}
@@ -521,6 +523,9 @@ public class ExpressionCodegen extends JetVisitor {
opToken == JetTokens.GT || opToken == JetTokens.GTEQ) {
generateCompareOp(expression, opToken, expressionType(expression.getLeft()));
}
else if (opToken == JetTokens.ELVIS) {
generateElvis(expression);
}
else {
DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference());
if (op instanceof FunctionDescriptor) {
@@ -614,6 +619,21 @@ public class ExpressionCodegen extends JetVisitor {
}
}
private void generateElvis(JetBinaryExpression expression) {
final Type exprType = expressionType(expression);
gen(expression.getLeft(), exprType);
v.dup();
Label end = new Label();
Label ifNull = new Label();
v.ifnull(ifNull);
v.goTo(end);
v.mark(ifNull);
v.pop();
gen(expression.getRight(), exprType);
v.mark(end);
myStack.push(StackValue.onStack(exprType));
}
private static boolean isNumberPrimitive(DeclarationDescriptor descriptor) {
if (!(descriptor instanceof ClassDescriptor)) {
return false;
@@ -756,7 +776,7 @@ public class ExpressionCodegen extends JetVisitor {
Type exprType = expressionType(expr);
gen(expr, exprType);
Method appendDescriptor = new Method("append", Type.getObjectType(CLASS_STRING_BUILDER),
new Type[] { exprType.getSort() == Type.OBJECT ? Type.getObjectType(CLASS_OBJECT) : exprType});
new Type[] { exprType.getSort() == Type.OBJECT ? TYPE_OBJECT : exprType});
v.invokevirtual(CLASS_STRING_BUILDER, "append", appendDescriptor.getDescriptor());
}
@@ -268,6 +268,13 @@ public class NamespaceGenTest extends CodegenTestCase {
assertEquals(Boolean.FALSE, main.invoke(null, "Jet", "Java"));
}
public void testElvis() throws Exception {
loadText("fun foo(s: String?) = s ?: \"null\"");
final Method main = generateFunction();
assertEquals("jet", main.invoke(null, "jet"));
assertEquals("null", main.invoke(null, new Object[] { null }));
}
public void _testVarargs() throws Exception {
loadText("fun foo() = java.util.Arrays.asList(\"IntelliJ\", \"IDEA\")");
final Method main = generateFunction();