package polyglot.ext.jl.ast; import polyglot.ast.*; import polyglot.types.*; import polyglot.visit.*; import polyglot.util.*; /** * An <code>AmbQualifierNode</code> is an ambiguous AST node composed of * dot-separated list of identifiers that must resolve to a type qualifier. */ public class AmbQualifierNode_c extends Node_c implements AmbQualifierNode { protected Qualifier qualifier; protected QualifierNode qual; protected String name; public AmbQualifierNode_c(Position pos, QualifierNode qual, String name) { super(pos); this.qual = qual; this.name = name; } public Qualifier qualifier() { return this.qualifier; } public String name() { return this.name; } public AmbQualifierNode name(String name) { AmbQualifierNode_c n = (AmbQualifierNode_c) copy(); n.name = name; return n; } public QualifierNode qual() { return this.qual; } public AmbQualifierNode qual(QualifierNode qual) { AmbQualifierNode_c n = (AmbQualifierNode_c) copy(); n.qual = qual; return n; } public AmbQualifierNode qualifier(Qualifier qualifier) { AmbQualifierNode_c n = (AmbQualifierNode_c) copy(); n.qualifier = qualifier; return n; } protected AmbQualifierNode_c reconstruct(QualifierNode qual) { if (qual != this.qual) { AmbQualifierNode_c n = (AmbQualifierNode_c) copy(); n.qual = qual; return n; } return this; } public Node visitChildren(NodeVisitor v) { QualifierNode qual = (QualifierNode) visitChild(this.qual, v); return reconstruct(qual); } public Node buildTypes(TypeBuilder tb) throws SemanticException { return qualifier(tb.typeSystem().unknownQualifier(position())); } public Node disambiguate(AmbiguityRemover sc) throws SemanticException { Node n = sc.nodeFactory().disamb().disambiguate(this, sc, position(), qual, name); if (n instanceof QualifierNode) { return n; } throw new SemanticException("Could not find type or package \"" + (qual == null ? name : qual.toString() + "." + name) + "\".", position()); } public Node typeCheck(TypeChecker tc) throws SemanticException { throw new InternalCompilerError(position(), "Cannot type check ambiguous node " + this + "."); } public Node exceptionCheck(ExceptionChecker ec) throws SemanticException { throw new InternalCompilerError(position(), "Cannot exception check ambiguous node " + this + "."); } public void prettyPrint(CodeWriter w, PrettyPrinter tr) { if (qual != null) { print(qual, w, tr); w.write("."); } w.write(name); } public void translate(CodeWriter w, Translator tr) { throw new InternalCompilerError(position(), "Cannot translate ambiguous node " + this + "."); } public String toString() { return (qual == null ? name : qual.toString() + "." + name) + "{amb}"; } public void dump(CodeWriter w) { super.dump(w); w.allowBreak(4, " "); w.begin(0); w.write("(name \"" + name + "\")"); w.end(); } }