package polyglot.ext.jl.ast;

import polyglot.ast.*;
import polyglot.types.*;
import polyglot.visit.*;
import polyglot.util.*;
import java.util.*;

/**
 * An <code>AmbExpr</code> is an ambiguous AST node composed of a single
 * identifier that must resolve to an expression.
 */
public class AmbExpr_c extends Expr_c implements AmbExpr
{
  protected String name;

  public AmbExpr_c(Position pos, String name) {
    super(pos);
    this.name = name;
  }

  /** Get the name of the expression. */
  public String name() {
    return this.name;
  }

  /** Set the name of the expression. */
  public AmbExpr name(String name) {
    AmbExpr_c n = (AmbExpr_c) copy();
    n.name = name;
    return n;
  }

  /** Disambiguate the expression. */
  public Node disambiguate(AmbiguityRemover ar) throws SemanticException {
    Node n = ar.nodeFactory().disamb().disambiguate(this, ar, position(),
                                                    null, name);

    if (n instanceof Expr) {
      return n;
    }

    throw new SemanticException("Could not find field or local " +
                                "variable \"" + name + "\".", position());
  }

  /** Type check the expression. */
  public Node typeCheck(TypeChecker tc) throws SemanticException {
    throw new InternalCompilerError(position(),
                                    "Cannot type check ambiguous node "
                                    + this + ".");
  } 

  /** Check exceptions thrown by the expression. */
  public Node exceptionCheck(ExceptionChecker ec) throws SemanticException {
    throw new InternalCompilerError(position(),
                                    "Cannot exception check ambiguous node "
                                    + this + ".");
  } 

  /** Write the expression to an output file. */
  public void prettyPrint(CodeWriter w, PrettyPrinter tr) {
    w.write(name);
  }

  public void translate(CodeWriter w, Translator tr) {
    throw new InternalCompilerError(position(),
                                    "Cannot translate ambiguous node "
                                    + this + ".");
  }

  public String toString() {
    return name + "{amb}";
  }

  /**
   * Return the first (sub)term performed when evaluating this
   * term.
   */
  public Term entry() {
      return this;
  }

  /**
   * Visit this term in evaluation order.
   */
  public List acceptCFG(CFGBuilder v, List succs) {
      return succs;
  }

  public void dump(CodeWriter w) {
    super.dump(w);
    w.allowBreak(4, " ");
    w.begin(0);
    w.write("(name \"" + name + "\")");
    w.end();
  }
}

@@ -444,24 +444,137 @@
  name;%0A  %7D%0A%0A
+  /** Get the precedence of the field. */%0A  public Precedence precedence() %7B%0A    return Precedence.LITERAL;%0A  %7D%0A%0A
   /** Get th

Set precedence of ambiguous expr to same as locals. Makes pretty-printed ambiguous code prettier.