All Downloads are FREE. Search and download functionalities are using the official Maven repository.

template.ast.CopyNode.tt Maven / Gradle / Ivy

There is a newer version: 2.3.6
Show newest version
# 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() {
    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;
      }
      inc_copyHandlers(node);
$endif
$if(Concurrent)
      node.makeFreshNode();
$endif
      return node;
    } catch (CloneNotSupportedException e) {
      throw new Error("Error: clone not supported for " + getClass().getName());
    }
  }
]]

# 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() {
    #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;
  }
$endif
]]

ASTNode.emitDoFullTraversal [[
  /**
   * Performs a full traversal of the tree using getChild to trigger rewrites
   * @apilevel low-level
   */
  #annotations
  public void $ASTNode.doFullTraversal() {
    for (int i = 0; i < getNumChild(); i++) {
      getChild(i).doFullTraversal();
    }
  }
]]

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() {
  $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
  }
$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 {
    #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;
  }
]]




© 2015 - 2024 Weber Informatics LLC | Privacy Policy