generate elvis
This commit is contained in:
@@ -27,6 +27,8 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder";
|
private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder";
|
||||||
private static final String CLASS_COMPARABLE = "java/lang/Comparable";
|
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> myLoopStarts = new Stack<Label>();
|
||||||
private final Stack<Label> myLoopEnds = new Stack<Label>();
|
private final Stack<Label> myLoopEnds = new Stack<Label>();
|
||||||
private final Stack<StackValue> myStack = new Stack<StackValue>();
|
private final Stack<StackValue> myStack = new Stack<StackValue>();
|
||||||
@@ -387,7 +389,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
final JetDotQualifiedExpression parent = (JetDotQualifiedExpression) expression.getParent();
|
final JetDotQualifiedExpression parent = (JetDotQualifiedExpression) expression.getParent();
|
||||||
if (!resolvesToClassOrPackage(parent.getReceiverExpression())) {
|
if (!resolvesToClassOrPackage(parent.getReceiverExpression())) {
|
||||||
// we have a receiver on stack
|
// 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) {
|
opToken == JetTokens.GT || opToken == JetTokens.GTEQ) {
|
||||||
generateCompareOp(expression, opToken, expressionType(expression.getLeft()));
|
generateCompareOp(expression, opToken, expressionType(expression.getLeft()));
|
||||||
}
|
}
|
||||||
|
else if (opToken == JetTokens.ELVIS) {
|
||||||
|
generateElvis(expression);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference());
|
DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference());
|
||||||
if (op instanceof FunctionDescriptor) {
|
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) {
|
private static boolean isNumberPrimitive(DeclarationDescriptor descriptor) {
|
||||||
if (!(descriptor instanceof ClassDescriptor)) {
|
if (!(descriptor instanceof ClassDescriptor)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -756,7 +776,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
Type exprType = expressionType(expr);
|
Type exprType = expressionType(expr);
|
||||||
gen(expr, exprType);
|
gen(expr, exprType);
|
||||||
Method appendDescriptor = new Method("append", Type.getObjectType(CLASS_STRING_BUILDER),
|
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());
|
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"));
|
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 {
|
public void _testVarargs() throws Exception {
|
||||||
loadText("fun foo() = java.util.Arrays.asList(\"IntelliJ\", \"IDEA\")");
|
loadText("fun foo() = java.util.Arrays.asList(\"IntelliJ\", \"IDEA\")");
|
||||||
final Method main = generateFunction();
|
final Method main = generateFunction();
|
||||||
|
|||||||
Reference in New Issue
Block a user