Package org.lilystudio.javascript.expression

Source Code of org.lilystudio.javascript.expression.ConditionalExpression

package org.lilystudio.javascript.expression;

import java.io.IOException;
import java.io.Writer;

import org.lilystudio.javascript.AbstractNode;
import org.lilystudio.javascript.Environment;
import org.lilystudio.javascript.IExpression;
import org.lilystudio.javascript.scope.Scope;
import org.mozilla.javascript.Node;
import org.mozilla.javascript.ScriptOrFnNode;

import sun.org.mozilla.javascript.internal.Token;

/**
* 三元条件表达式节点
*
* @version 1.0.0, 2010/01/01
* @author 欧阳先伟
* @since Common 0.1
*/
public class ConditionalExpression extends AbstractNode implements IExpression {

  /** 条件表达式 */
  private IExpression checkExpression;

  /** 条件为真时的表达式 */
  private IExpression trueExpression;

  /** 条件为假时的表达式 */
  private IExpression falseExpression;

  /**
   * 创建三元条件表达式节点
   *
   * @param node
   *          表达式子节点对应的rhino节点
   * @param root
   *          表达式子节点对应的rhino根节点
   * @param scope
   *          表达式子节点生存域
   */
  public ConditionalExpression(Node node, ScriptOrFnNode root, Scope scope) {
    super(node.getLineno());
    Node firstChild = node.getFirstChild();
    checkExpression = addExpression(firstChild, root, scope);
    trueExpression = addExpression(firstChild.getNext(), root, scope);
    falseExpression = addExpression(node.getLastChild(), root, scope);
  }

  @Override
  public boolean equals(Object obj) {
    return obj.getClass() == this.getClass()
        && checkExpression
            .equals(((ConditionalExpression) obj).checkExpression)
        && trueExpression.equals(((ConditionalExpression) obj).trueExpression)
        && falseExpression
            .equals(((ConditionalExpression) obj).falseExpression);
  }

  public int getLevel() {
    return 120;
  }

  public boolean isNeedLeftSeparator() {
    if (checkExpression.getLevel() <= this.getLevel()) {
      return checkExpression.isNeedLeftSeparator();
    }
    return false;
  }

  public boolean isNeedRightSeparator() {
    if (falseExpression.getLevel() <= this.getLevel()) {
      return falseExpression.isNeedRightSeparator();
    }
    return false;
  }

  public void write(Writer writer, Environment env) throws IOException {
    if (checkExpression.getLevel() <= this.getLevel()) {
      checkExpression.write(writer, env);
    } else {
      writer.write("(");
      checkExpression.write(writer, env);
      writer.write(")");
    }

    writer.write("?");

    if (trueExpression.getLevel() <= this.getLevel()) {
      trueExpression.write(writer, env);
    } else {
      writer.write("(");
      trueExpression.write(writer, env);
      writer.write(")");
    }

    writer.write(":");

    if (falseExpression instanceof BinaryExpression
        && ((BinaryExpression) falseExpression).getType() == Token.COMMA) {
      writer.write("(");
      falseExpression.write(writer, env);
      writer.write(")");
    } else {
      falseExpression.write(writer, env);
    }
  }
}
TOP

Related Classes of org.lilystudio.javascript.expression.ConditionalExpression

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.