package polyglot.ext.jl.parse; import polyglot.ast.*; import polyglot.parse.*; import polyglot.types.*; import polyglot.util.*; /** * Represents an ambiguous, possibly qualified, identifier encountered while parsing. */ public class Name { public final Name prefix; public final String name; public final Position pos; NodeFactory nf; TypeSystem ts; public Name(BaseParser parser, Position pos, String name) { this(parser, pos, null, name); } public Name(BaseParser parser, Position pos, Name prefix, String name) { this.nf = parser.nf; this.ts = parser.ts; this.pos = pos; this.prefix = prefix; this.name = name; } // expr public Expr toExpr() { if (prefix == null) { return nf.AmbExpr(pos, name); } return nf.Field(pos, prefix.toReceiver(), name); } // expr or type public Receiver toReceiver() { if (prefix == null) { return nf.AmbReceiver(pos, name); } return nf.AmbReceiver(pos, prefix.toPrefix(), name); } // expr, type, or package public Prefix toPrefix() { if (prefix == null) { return nf.AmbPrefix(pos, name); } return nf.AmbPrefix(pos, prefix.toPrefix(), name); } // type or package public QualifierNode toQualifier() { if (prefix == null) { return nf.AmbQualifierNode(pos, name); } return nf.AmbQualifierNode(pos, prefix.toQualifier(), name); } // package public PackageNode toPackage() { if (prefix == null) { return nf.PackageNode(pos, ts.createPackage(null, name)); } else { return nf.PackageNode(pos, ts.createPackage(prefix.toPackage().package_(), name)); } } // type public TypeNode toType() { if (prefix == null) { return nf.AmbTypeNode(pos, name); } return nf.AmbTypeNode(pos, prefix.toQualifier(), name); } public String toString() { if (prefix == null) { return name; } return prefix.toString() + "." + name; } }