| Index: dart/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/processor/ObjectSemanticProcessor.java
|
| ===================================================================
|
| --- dart/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/processor/ObjectSemanticProcessor.java (revision 29785)
|
| +++ dart/editor/util/plugins/com.google.dart.java2dart/src/com/google/dart/java2dart/processor/ObjectSemanticProcessor.java (working copy)
|
| @@ -42,6 +42,7 @@
|
| import com.google.dart.java2dart.Context;
|
| import com.google.dart.java2dart.util.JavaUtils;
|
|
|
| +import static com.google.dart.java2dart.util.ASTFactory.argumentList;
|
| import static com.google.dart.java2dart.util.ASTFactory.assignmentExpression;
|
| import static com.google.dart.java2dart.util.ASTFactory.binaryExpression;
|
| import static com.google.dart.java2dart.util.ASTFactory.booleanLiteral;
|
| @@ -156,6 +157,21 @@
|
| return null;
|
| }
|
| }
|
| + // Dart has no "bool &=" operator
|
| + if (node.getOperator().getType() == TokenType.AMPERSAND_EQ) {
|
| + Expression leftExpr = node.getLeftHandSide();
|
| + ITypeBinding argTypeBinding = context.getNodeTypeBinding(leftExpr);
|
| + if (JavaUtils.isTypeNamed(argTypeBinding, "boolean")) {
|
| + Expression rightExpr = node.getRightHandSide();
|
| + replaceNode(
|
| + node,
|
| + assignmentExpression(
|
| + leftExpr,
|
| + TokenType.EQ,
|
| + methodInvocation("javaBooleanAnd", leftExpr, rightExpr)));
|
| + return null;
|
| + }
|
| + }
|
| // String += 'c'
|
| if (node.getOperator().getType() == TokenType.PLUS_EQ) {
|
| Expression leftExpr = node.getLeftHandSide();
|
| @@ -202,19 +218,30 @@
|
| return null;
|
| }
|
| }
|
| - // super
|
| - super.visitBinaryExpression(node);
|
| // in Java "true | false" will compute both operands
|
| if (node.getOperator().getType() == TokenType.BAR) {
|
| - Expression leftOperand = node.getLeftOperand();
|
| - ITypeBinding argTypeBinding = context.getNodeTypeBinding(leftOperand);
|
| + ITypeBinding argTypeBinding = context.getNodeTypeBinding(node.getLeftOperand());
|
| + super.visitBinaryExpression(node);
|
| if (JavaUtils.isTypeNamed(argTypeBinding, "boolean")) {
|
| replaceNode(
|
| node,
|
| - methodInvocation("javaBooleanOr", leftOperand, node.getRightOperand()));
|
| + methodInvocation("javaBooleanOr", node.getLeftOperand(), node.getRightOperand()));
|
| return null;
|
| }
|
| }
|
| + // in Java "true & false" will compute both operands
|
| + if (node.getOperator().getType() == TokenType.AMPERSAND) {
|
| + ITypeBinding argTypeBinding = context.getNodeTypeBinding(node.getLeftOperand());
|
| + super.visitBinaryExpression(node);
|
| + if (JavaUtils.isTypeNamed(argTypeBinding, "boolean")) {
|
| + replaceNode(
|
| + node,
|
| + methodInvocation("javaBooleanAnd", node.getLeftOperand(), node.getRightOperand()));
|
| + return null;
|
| + }
|
| + }
|
| + // super
|
| + super.visitBinaryExpression(node);
|
| // done
|
| return null;
|
| }
|
| @@ -583,10 +610,28 @@
|
| @Override
|
| public Void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
|
| super.visitSuperConstructorInvocation(node);
|
| + NodeList<Expression> args = node.getArgumentList().getArguments();
|
| IMethodBinding binding = (IMethodBinding) context.getNodeBinding(node);
|
| - if (isMethodInClass2(binding, "<init>(java.lang.Throwable)", "java.lang.Exception")) {
|
| + if (isMethodInExactClass(binding, "<init>(java.lang.Throwable)", "java.lang.Exception")) {
|
| node.setConstructorName(identifier("withCause"));
|
| }
|
| + if (isMethodInExactClass(
|
| + binding,
|
| + "<init>(java.lang.Throwable)",
|
| + "java.lang.RuntimeException")) {
|
| + node.setArgumentList(argumentList(namedExpression("cause", args.get(0))));
|
| + }
|
| + if (isMethodInExactClass(binding, "<init>(java.lang.String)", "java.lang.RuntimeException")) {
|
| + node.setArgumentList(argumentList(namedExpression("message", args.get(0))));
|
| + }
|
| + if (isMethodInExactClass(
|
| + binding,
|
| + "<init>(java.lang.String,java.lang.Throwable)",
|
| + "java.lang.RuntimeException")) {
|
| + node.setArgumentList(argumentList(
|
| + namedExpression("message", args.get(0)),
|
| + namedExpression("cause", args.get(0))));
|
| + }
|
| return null;
|
| }
|
|
|
|
|