package polyglot.ext.jl.ast;
import polyglot.ast.*;
import polyglot.types.*;
import polyglot.visit.*;
import polyglot.util.*;
/**
* <code>Ext</code> is the super type of all node extension objects.
* It contains a pointer back to the node it is extending and a possibly-null
* pointer to another extension node.
*/
public abstract class Ext_c implements Ext {
protected Node node;
protected Ext ext;
public Ext_c(Ext ext) {
this.node = null;
this.ext = ext;
}
public Ext_c() {
this(null);
this.node = null;
}
/** Initialize the extension object's pointer back to the node.
* This also initializes the back pointers for all extensions of
* the extension.
*/
public void init(Node node) {
if (this.node != null) {
throw new InternalCompilerError("Already initialized.");
}
this.node = node;
if (this.ext != null) {
this.ext.init(node);
}
}
/**
* Return the node we ultimately extend.
*/
public Node node() {
return node;
}
/**
* Return our extension object, or null.
*/
public Ext ext() {
return ext;
}
public Ext ext(Ext ext) {
Ext old = this.ext;
this.ext = null;
Ext_c copy = (Ext_c) copy();
copy.ext = ext;
this.ext = old;
return copy;
}
/**
* Copy the extension.
*/
public Object copy() {
try {
Ext_c copy = (Ext_c) super.clone();
if (ext != null) {
copy.ext = (Ext) ext.copy();
}
copy.node = null; // uninitialize
return copy;
}
catch (CloneNotSupportedException e) {
throw new InternalCompilerError("Java clone() weirdness.");
}
}
public String toString() {
return StringUtil.getShortNameComponent(getClass().getName());
}
/**
* Dump the AST node for debugging purposes.
*/
public void dump(CodeWriter w) {
w.write(toString());
}
}