/*
 * Copyright 2009 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.jjs.impl.gflow.cfg;

import com.google.gwt.dev.jjs.ast.JExpression;
import com.google.gwt.dev.jjs.ast.JNode;
import com.google.gwt.dev.jjs.ast.JVariable;
import com.google.gwt.dev.jjs.ast.JVariableRef;

/**
 * Node corresponding to write operation.
 */
public class CfgWriteNode extends CfgSimpleNode<JNode> {
  private final JExpression target;
  private final JExpression value;

  public CfgWriteNode(CfgNode<?> parent, JNode node, JExpression target, 
      JExpression value) {
    super(parent, node);
    this.target = target;
    this.value = value;
  }

  @Override
  public void accept(CfgVisitor visitor) {
    visitor.visitWriteNode(this);
  }

  /**
   * Get operation target. I.e. expression, describing what's changed.
   */
  public JExpression getTarget() {
    return target;
  }

  /**
   * Get target variable if target is variable reference. Returns 
   * <code>null</code> otherwise (e.g. target is array reference).
   */
 public JVariable getTargetVariable() {
    return target instanceof JVariableRef ? ((JVariableRef) target).getTarget() 
        : null;
  }

 /**
  * Get expression which is assigned to value. 
  * <code>null</code> when new value expression can't be statically determined.
  */
  public JExpression getValue() {
    return value;
  }

  @Override
  public String toDebugString() {
    String targets = target.toString();
    if (getTargetVariable() != null) {
      targets = getTargetVariable().getName();
    }
    return "WRITE(" + targets + ", " + value + ")";
  }

  @Override
  protected CfgNode<?> cloneImpl() {
    return new CfgWriteNode(getParent(), getJNode(), target, value);
  }
}
