template.ast.CopyNode.tt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jastadd Show documentation
Show all versions of jastadd Show documentation
A metacompilation framework for Java using attribute grammars.
# Copyright (c) 2013-2016, The JastAdd Team
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the Lund University nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# Generates the ASTNode.copy() method.
ASTDecl.emitCopyNode [[
/** @apilevel internal */
#annotations
public #copyReturnType #name.copy() {
$SynchBegin
try {
$include(ASTDecl.traceCopyNode)
#name node = (#name) clone();
node.parent = null;
if (children != null) {
node.children = ($ASTNode[]) children.clone();
}
$if(IncrementalEnabled)
node.inc_state = inc_CLONED;
for (int i = 0; node.children != null && i < node.children.length; i++) {
node.children[i] = null;
}
node.init_children = null;
node.children_computed = null;
inc_copyHandlers(node);
$endif
$if(Concurrent)
node.makeFreshNode();
$endif
return node;
} catch (CloneNotSupportedException e) {
throw new Error("Error: clone not supported for " + getClass().getName());
}
$SynchEnd
}
]]
# Generates the ASTNode.fullCopy() method.
ASTDecl.emitFullCopy [[
/**
* Create a deep copy of the AST subtree at this node.
* The copy is dangling, i.e. has no parent.
* @return dangling copy of the subtree at this node
* @apilevel low-level
* @deprecated Please use treeCopy or treeCopyNoTransform instead
*/
#annotations
@Deprecated
$if(#hasAbstract)
public abstract #copyReturnType #name.fullCopy();
$else
public #copyReturnType #name.fullCopy() {
return treeCopyNoTransform();
}
$endif
]]
ASTDecl.emitTreeCopyNoTransform [[
/**
* Create a deep copy of the AST subtree at this node.
* The copy is dangling, i.e. has no parent.
* @return dangling copy of the subtree at this node
* @apilevel low-level
*/
#annotations
$if(#hasAbstract)
public abstract #copyReturnType #name.treeCopyNoTransform();
$else
public #copyReturnType #name.treeCopyNoTransform() {
$SynchBegin
#name tree = (#name) copy();
if (children != null) {
for (int i = 0; i < children.length; ++i) {
$SkipNTAs
$ASTNode child = ($ASTNode) children[i];
if (child != null) {
child = child.treeCopyNoTransform();
$if(IncrementalEnabled)
tree.children[i] = child;
child.parent = tree;
$else
tree.setChild(child, i);
$endif
}
}
}
return tree;
$SynchEnd
}
$endif
]]
ASTNode.emitDoFullTraversal [[
/**
* Performs a full traversal of the tree using getChild to trigger rewrites
* @apilevel low-level
*/
#annotations
public void $ASTNode.doFullTraversal() {
$SynchBegin
for (int i = 0; i < getNumChild(); i++) {
getChild(i).doFullTraversal();
}
$SynchEnd
}
]]
ASTDecl.emitTreeCopy [[
/**
* Create a deep copy of the AST subtree at this node.
* The subtree of this node is traversed to trigger rewrites before copy.
* The copy is dangling, i.e. has no parent.
* @return dangling copy of the subtree at this node
* @apilevel low-level
*/
#annotations
$if(#hasAbstract)
public abstract #copyReturnType #name.treeCopy();
$else
public #copyReturnType #name.treeCopy() {
$SynchBegin
$if(LegacyRewrite)
doFullTraversal();
return treeCopyNoTransform();
$else
#name tree = (#name) copy();
if (children != null) {
for (int i = 0; i < children.length; ++i) {
$SkipNTAs
$ASTNode child = ($ASTNode) getChild(i);
if (child != null) {
child = child.treeCopy();
$if(IncrementalEnabled)
tree.children[i] = child;
child.parent = tree;
$else
tree.setChild(child, i);
$endif
}
}
}
return tree;
$endif
$SynchEnd
}
$endif
]]
# Generates the ASTNode.clone() method.
#
# NOTE: We should not invoke node.flushCache() since this methods can
# flush CNTA rewrites, which should not be called during cloning.
# This is tested in the test case flush/flushRewriteAndTreeCopy01.
ASTDecl.emitCloneNode [[
/** @apilevel internal */
#annotations
public #copyReturnType #name.clone() throws CloneNotSupportedException {
$SynchBegin
#name node = (#name) super.clone();
$if(#isASTNodeDecl)
$if(LegacyRewrite)
if (node.is$$Final()) {
node.flushAttrAndCollectionCache();
}
node.in$$Circle(false);
// flush rewrites
node.is$$Final(false);
$else
node.flushAttrAndCollectionCache();
$endif
$endif
return node;
$SynchEnd
}
]]