/*
* This file is part of the X10 project (http://x10-lang.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* This file was originally derived from the Polyglot extensible compiler framework.
*
* (C) Copyright 2000-2007 Polyglot project group, Cornell University
* (C) Copyright IBM Corporation 2007-2012.
*/
package polyglot.ast;
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 Ext_c 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());
}
}