/*
* xtc - The eXTensible Compiler
* Copyright (C) 2007 New York University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.typical;
import java.util.Iterator;
import xtc.util.Pair;
import xtc.util.SymbolTable;
/**
* The base class of all NameSpace names.
*
* @author Anh Le
* @version $Revision: 1.6 $
*/
public abstract class Name<T extends Tuple> extends Variant<T> {
/** The tags for subclasses. */
public static enum Tag {
SimpleNameT,
QualifiedNameT
}
/** Create a new name. */
protected Name() {
//empty
}
/**
* Get the tag of this class
*
* @return The tag
*/
public abstract Tag tag();
/**
* Tests if this name is simple.
*
* @return <code>true</code> if simple, false otherwise.
*/
public boolean isSimpleName() {
return false;
}
/**
* Tests if this name is qualified.
*
* @return <code>true</code> if simple, false otherwise.
*/
public boolean isQualifiedName() {
return false;
}
/**
* Convert the name into a name suitable for symbol table access.
*
* @param ns The namespace.
*/
public abstract String mangle(String ns);
/** The simple namespace name. */
public static class SimpleName extends Name<Tuple.T1<String>> {
/**
* Create a new simple name.
*
* @param member1 The simple name.
*/
public SimpleName(String member1) {
tuple = new Tuple.T1<String>(member1);
}
public final Tag tag() {
return Tag.SimpleNameT;
}
public boolean isSimpleName() {
return true;
}
public String getName() {
return "SimpleName";
}
public String toString() {
return "SimpleName of " + tuple.toString();
}
public String mangle(String ns) {
if ("default".equals(ns)) return tuple.get1();
else return SymbolTable.toNameSpace(tuple.get1(), ns);
}
}
/** The qualified namespace name. */
public static class QualifiedName extends Name<Tuple.T1<Pair<String>>> {
/**
* Create a new Qualified name.
*
* @param member1 The qualifier.
*/
public QualifiedName(Pair<String> member1) {
tuple = new Tuple.T1<Pair<String>>(member1);
}
public final Tag tag() {
return Tag.QualifiedNameT;
}
public boolean isQualifiedName() {
return true;
}
public String getName() {
return "QualifiedName";
}
public String toString() {
return "QualifiedName of " + tuple.toString();
}
public String mangle(String ns) {
StringBuilder buf = new StringBuilder();
for (Iterator<String> iter = tuple.get1().iterator(); iter.hasNext(); ) {
if (iter.hasNext()) {
buf.append(iter.next());
buf.append('.');
} else {
if (!"default".equals(ns)) {
buf.append(SymbolTable.toNameSpace(iter.next(), ns));
} else {
buf.append(iter.next());
}
}
}
return buf.toString();
}
}
}