simplify AST

This commit is contained in:
develar
2012-10-25 17:41:41 +04:00
parent b5a3fbeca4
commit f43e6d272a
22 changed files with 3 additions and 455 deletions
@@ -1,13 +0,0 @@
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.google.dart.compiler.backend.js.ast;
/**
* An interface that describes the boolean evaluation of an expression.
*/
public interface CanBooleanEval {
boolean isBooleanFalse();
boolean isBooleanTrue();
}
@@ -14,21 +14,6 @@ public class ChameleonJsExpression implements JsExpression {
this.expression = expression;
}
@Override
public boolean hasSideEffects() {
return expression.hasSideEffects();
}
@Override
public boolean isDefinitelyNotNull() {
return expression.isDefinitelyNotNull();
}
@Override
public boolean isDefinitelyNull() {
return expression.isDefinitelyNull();
}
@Override
public boolean isLeaf() {
return expression.isLeaf();
@@ -28,21 +28,6 @@ public final class JsArrayAccess extends JsExpressionImpl {
return indexExpression;
}
@Override
public boolean hasSideEffects() {
return arrayExpression.hasSideEffects() || indexExpression.hasSideEffects();
}
@Override
public boolean isDefinitelyNotNull() {
return false;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
public void setArrayExpression(JsExpression arrayExpression) {
this.arrayExpression = arrayExpression;
}
@@ -26,36 +26,6 @@ public final class JsArrayLiteral extends JsLiteral {
return expressions;
}
@Override
public boolean hasSideEffects() {
for (JsExpression expr : expressions) {
if (expr.hasSideEffects()) {
return true;
}
}
return false;
}
@Override
public boolean isBooleanFalse() {
return false;
}
@Override
public boolean isBooleanTrue() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitArray(this, context);
@@ -33,38 +33,6 @@ public final class JsBinaryOperation extends JsExpressionImpl {
return op;
}
@Override
public boolean hasSideEffects() {
return op.isAssignment() || arg1.hasSideEffects() || arg2.hasSideEffects();
}
@Override
public boolean isDefinitelyNotNull() {
// Precarious coding, but none of these can have null results.
if (op.getPrecedence() > 5) {
return true;
}
if (op == JsBinaryOperator.OR) {
if (arg1 instanceof CanBooleanEval) {
if (((CanBooleanEval) arg1).isBooleanTrue()) {
assert arg1.isDefinitelyNotNull();
return true;
}
}
}
// AND and OR can return nulls
if (op.isAssignment()) {
return op != JsBinaryOperator.ASG || arg2.isDefinitelyNotNull();
}
return op == JsBinaryOperator.COMMA && arg2.isDefinitelyNotNull();
}
@Override
public boolean isDefinitelyNull() {
return op == JsBinaryOperator.AND && arg1.isDefinitelyNull();
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitBinaryExpression(this, context);
@@ -30,21 +30,6 @@ public final class JsConditional extends JsExpressionImpl {
return thenExpression;
}
@Override
public boolean hasSideEffects() {
return testExpression.hasSideEffects() || thenExpression.hasSideEffects() || elseExpression.hasSideEffects();
}
@Override
public boolean isDefinitelyNotNull() {
return thenExpression.isDefinitelyNotNull() && elseExpression.isDefinitelyNotNull();
}
@Override
public boolean isDefinitelyNull() {
return thenExpression.isDefinitelyNull() && elseExpression.isDefinitelyNull();
}
public void setElseExpression(JsExpression elseExpression) {
this.elseExpression = elseExpression;
}
@@ -26,19 +26,4 @@ public class JsDocComment extends JsExpressionImpl {
public void accept(JsVisitor v, JsContext context) {
v.visitDocComment(this, context);
}
@Override
public boolean hasSideEffects() {
return false;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
}
@@ -3,21 +3,6 @@ package com.google.dart.compiler.backend.js.ast;
import com.google.dart.compiler.common.HasSourceInfo;
public interface JsExpression extends JsNode, HasSourceInfo {
/**
* Determines whether the expression can cause side effects.
*/
boolean hasSideEffects();
/**
* True if the target expression is definitely not null.
*/
boolean isDefinitelyNotNull();
/**
* True if the target expression is definitely null.
*/
boolean isDefinitelyNull();
boolean isLeaf();
JsStatement makeStmt();
@@ -55,32 +55,6 @@ public final class JsFunction extends JsLiteral implements HasName {
return scope;
}
@Override
public boolean hasSideEffects() {
// If there's a name, the name is assigned to.
return name != null;
}
@Override
public boolean isBooleanFalse() {
return false;
}
@Override
public boolean isBooleanTrue() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
public void setBody(JsBlock body) {
this.body = body;
}
@@ -47,21 +47,6 @@ public final class JsInvocation extends JsExpressionImpl.JsExpressionHasArgument
return qualifier;
}
@Override
public boolean hasSideEffects() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return false;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
public void setQualifier(JsExpression qualifier) {
this.qualifier = qualifier;
}
@@ -4,7 +4,7 @@
package com.google.dart.compiler.backend.js.ast;
public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEval {
public abstract class JsLiteral extends JsExpressionImpl {
public static final JsValueLiteral THIS = new JsThisRef();
public static final JsNameRef UNDEFINED = new JsNameRef("undefined");
@@ -22,26 +22,6 @@ public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEv
super();
}
@Override
public boolean isBooleanFalse() {
return false;
}
@Override
public boolean isBooleanTrue() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitThis(this, context);
@@ -60,26 +40,6 @@ public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEv
return value;
}
@Override
public boolean isBooleanFalse() {
return !value;
}
@Override
public boolean isBooleanTrue() {
return value;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitBoolean(this, context);
@@ -93,11 +53,6 @@ public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEv
protected JsValueLiteral() {
}
@Override
public final boolean hasSideEffects() {
return false;
}
@Override
public final boolean isLeaf() {
return true;
@@ -9,7 +9,7 @@ import com.google.dart.compiler.common.Symbol;
/**
* Represents a JavaScript expression that references a name.
*/
public final class JsNameRef extends JsExpressionImpl implements CanBooleanEval, HasName {
public final class JsNameRef extends JsExpressionImpl implements HasName {
private String ident;
private JsName name;
private JsExpression qualifier;
@@ -54,31 +54,6 @@ public final class JsNameRef extends JsExpressionImpl implements CanBooleanEval,
return qualifier;
}
@Override
public boolean hasSideEffects() {
return qualifier != null && (!qualifier.isDefinitelyNotNull() || qualifier.hasSideEffects());
}
@Override
public boolean isBooleanFalse() {
return isDefinitelyNull();
}
@Override
public boolean isBooleanTrue() {
return false;
}
@Override
public boolean isDefinitelyNotNull() {
return false;
}
@Override
public boolean isDefinitelyNull() {
return name != null && (JsLiteral.UNDEFINED.getName() == name);
}
@Override
public boolean isLeaf() {
return qualifier == null;
@@ -24,23 +24,6 @@ public final class JsNew extends JsExpressionImpl.JsExpressionHasArguments {
return constructorExpression;
}
@Override
public boolean hasSideEffects() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
// Sadly, in JS it can be!
// TODO: analysis could probably determine most instances cannot be null.
return false;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitNew(this, context);
@@ -8,26 +8,6 @@ public final class JsNullLiteral extends JsLiteral.JsValueLiteral {
JsNullLiteral() {
}
@Override
public boolean isBooleanFalse() {
return true;
}
@Override
public boolean isBooleanTrue() {
return false;
}
@Override
public boolean isDefinitelyNotNull() {
return false;
}
@Override
public boolean isDefinitelyNull() {
return true;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitNull(this, context);
@@ -5,16 +5,6 @@
package com.google.dart.compiler.backend.js.ast;
public abstract class JsNumberLiteral extends JsLiteral.JsValueLiteral {
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
public static final class JsDoubleLiteral extends JsNumberLiteral {
public final double value;
@@ -22,16 +12,6 @@ public abstract class JsNumberLiteral extends JsLiteral.JsValueLiteral {
this.value = value;
}
@Override
public boolean isBooleanFalse() {
return value == 0.0;
}
@Override
public boolean isBooleanTrue() {
return value != 0.0;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitDouble(this, context);
@@ -49,16 +29,6 @@ public abstract class JsNumberLiteral extends JsLiteral.JsValueLiteral {
this.value = value;
}
@Override
public boolean isBooleanFalse() {
return value == 0;
}
@Override
public boolean isBooleanTrue() {
return value != 0;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitInt(this, context);
@@ -38,36 +38,6 @@ public final class JsObjectLiteral extends JsLiteral {
return properties;
}
@Override
public boolean hasSideEffects() {
for (JsPropertyInitializer prop : properties) {
if (prop.hasSideEffects()) {
return true;
}
}
return false;
}
@Override
public boolean isBooleanFalse() {
return false;
}
@Override
public boolean isBooleanTrue() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitObjectLiteral(this, context);
@@ -13,16 +13,6 @@ public final class JsPostfixOperation extends JsUnaryOperation {
super(op, arg);
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitPostfixOperation(this, context);
@@ -4,8 +4,7 @@
package com.google.dart.compiler.backend.js.ast;
public final class JsPrefixOperation extends JsUnaryOperation implements CanBooleanEval {
public final class JsPrefixOperation extends JsUnaryOperation {
public JsPrefixOperation(JsUnaryOperator op) {
this(op, null);
}
@@ -14,37 +13,6 @@ public final class JsPrefixOperation extends JsUnaryOperation implements CanBool
super(op, arg);
}
@Override
public boolean isBooleanFalse() {
if (getOperator() == JsUnaryOperator.VOID) {
return true;
}
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
CanBooleanEval eval = (CanBooleanEval) getArg();
return eval.isBooleanTrue();
}
return false;
}
@Override
public boolean isBooleanTrue() {
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
CanBooleanEval eval = (CanBooleanEval) getArg();
return eval.isBooleanFalse();
}
return getOperator() == JsUnaryOperator.TYPEOF;
}
@Override
public boolean isDefinitelyNotNull() {
return getOperator() == JsUnaryOperator.TYPEOF || getOperator() != JsUnaryOperator.VOID;
}
@Override
public boolean isDefinitelyNull() {
return getOperator() == JsUnaryOperator.VOID;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitPrefixOperation(this, context);
@@ -30,10 +30,6 @@ public class JsPropertyInitializer extends SourceInfoAwareJsNode {
return valueExpr;
}
public boolean hasSideEffects() {
return labelExpr.hasSideEffects() || valueExpr.hasSideEffects();
}
public void setValueExpr(@NotNull JsExpression valueExpr) {
this.valueExpr = valueExpr;
}
@@ -22,26 +22,6 @@ public final class JsRegExp extends JsLiteral.JsValueLiteral {
return pattern;
}
@Override
public boolean isBooleanFalse() {
return false;
}
@Override
public boolean isBooleanTrue() {
return true;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
public void setFlags(String suffix) {
flags = suffix;
}
@@ -4,9 +4,6 @@
package com.google.dart.compiler.backend.js.ast;
/**
* A JavaScript string literal expression.
*/
public final class JsStringLiteral extends JsLiteral.JsValueLiteral {
private final String value;
@@ -20,26 +17,6 @@ public final class JsStringLiteral extends JsLiteral.JsValueLiteral {
return value;
}
@Override
public boolean isBooleanFalse() {
return value.length() == 0;
}
@Override
public boolean isBooleanTrue() {
return value.length() != 0;
}
@Override
public boolean isDefinitelyNotNull() {
return true;
}
@Override
public boolean isDefinitelyNull() {
return false;
}
@Override
public void accept(JsVisitor v, JsContext context) {
v.visitString(this, context);
@@ -28,11 +28,6 @@ public abstract class JsUnaryOperation extends JsExpressionImpl {
return op;
}
@Override
public final boolean hasSideEffects() {
return op.isModifying() || arg.hasSideEffects();
}
public void setArg(JsExpression arg) {
this.arg = arg;
}