template.incremental.Notification.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, 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.
ASTDecl.incValueAffectedMethod = [[
$if(IncrementalEnabled)
$if(IncrementalLevelParam)
$if(IncrementalPropLimit)
/** @apilevel internal */
public boolean #name.inc_valueAffected(String attrID, Object _parameters) {
$AttrAffectedChecks
$if(#isASTNodeDecl)
return true;
$else
return super.inc_valueAffected(attrID, _parameters);
$endif
}
$endif
$endif
$endif
]]
# TODO: Add support for more than one parameter
ASTDecl.checkAttrValueAffected = [[
$if(IsNTA)
// NTAs are always considered affected
$if(IsParameterized)
if (attrID.equals("$AttrSign") && $(AttrSign)_values != null && $(AttrSign)_values.containsKey(_parameters)) {
$else
if (attrID.equals("$AttrSign") && $(AttrSign)_computed) {
$endif
return true;
}
$else
// non-NTAs
$if(IsParameterized)
if (attrID.equals("$AttrSign") && $(AttrSign)_values != null && $(AttrSign)_values.containsKey(_parameters)) {
$if(IsPrimitiveAttr)
// store old value
$AttrType oldValue = $AttrObjectType.valueOf(($AttrObjectType)$(AttrSign)_values.get(_parameters));
// flush value
$(AttrSign)_values.remove(_parameters);
// clear dependencies in handler
$DDGNodeName handler = ($DDGNodeName)$(AttrSign)_handler.get(_parameters);
handler.clearDependencies();
// compute new value
$if(IsAttrWithOneParam)
$(AttrType) newValue = $AttrName(($ParamTypeSignature)_parameters);
$else
throw new Error("No support for more than one parameter in affected value check");
$endif
$else
// store old value
$AttrType oldValue = ($AttrType)$(AttrSign)_values.get(_parameters);
// flush value
$(AttrSign)_values.remove(_parameters);
// clear dependencies in handler
$DDGNodeName handler = ($DDGNodeName)$(AttrSign)_handler.get(_parameters);
handler.clearDependencies();
// compute new value
$if(IsAttrWithOneParam)
$AttrType newValue = $(AttrName)(($ParamTypeSignature)_parameters);
$else
throw new Error("No support for more than one parameter in affected value check");
$endif
$endif
$else
if (attrID.equals("$AttrSign") && $(AttrSign)_computed) {
// store old value + flush value
$AttrType oldValue = $(AttrSign)_value;
$AttrResetVisit
$AttrResetCache
// clear dependencies in handler
$(AttrSign)_handler.clearDependencies();
// compute new value
$AttrType newValue = $AttrName();
$endif
// compare old and new value
$if(IsPrimitiveAttr)
if (oldValue == newValue) {
$else
Object obj = (Object)oldValue;
if ((obj instanceof $ASTNode && (oldValue == newValue)) ||
(oldValue == null && newValue == null) ||
(oldValue != null && oldValue.equals(newValue))) {
$endif
return false;
}
return true;
}
$endif
]]
ASTDecl.incReactToDepChangeMethod = [[
$if(IncrementalEnabled)
$if(IncrementalLevelParam)
/** @apilevel internal */
public void #name.reactToDependencyChange(String attrID, Object _parameters) {
$if(IncrementalChangeFlush)
$include(ASTDecl.incChangeFlush)
$endif
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID, _parameters);
$endif
}
$endif
$if(IncrementalLevelAttr)
/** @apilevel internal */
public void #name.reactToDependencyChange(String attrID) {
$if(IncrementalChangeFlush)
$include(ASTDecl.incChangeFlush)
$endif
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID);
$endif
}
$endif
$if(IncrementalLevelNode)
$if(#isASTNodeDecl)
/** @apilevel internal */
public void #name.reactToDependencyChange() {
$if(IncrementalChangeFlush)
$include(ASTDecl.incChangeFlush)
$endif
}
$endif
$endif
$if(IncrementalLevelRegion)
$if(#isRegionRoot)
/** @apilevel internal */
public void #name.reactToDependencyChange() {
$if(IncrementalChangeFlush)
$include(ASTDecl.incChangeFlush)
$endif
}
$else
$if(#isASTNodeDecl)
/** @apilevel internal */
public void #name.reactToDependencyChange() {
}
$endif
$endif
$endif
$endif
]]
ASTDecl.incChangeFlush = [[
$if(IncrementalChangeFlush)
// flush children
$if(IncrementalLevelParam)
$if(#isASTNodeDecl)
if (attrID.equals("getChild")) {
int i = (Integer)_parameters;
if (children_computed != null && i < children_computed.length && children_computed[i]) {
// Make sure this condition is false before calling notify.
// There may be a circular dependency resulting in a double flush otherwise.
// A double flush will cause null to be moved in as the initial child.
children_computed[i] = false;
children[i].inc_resetRewrites();
// outer rewrites
if (init_children[i] != null) {
// set up change
$ASTNode oldChild = children[i];
$ASTNode newChild = init_children[i];
// make change
oldChild.inc_flush_subtree(getChild_handler[i]);
children[i] = newChild;
init_children[i] = null;
// set parent and notify
newChild.setParent(this);
getChild_handler[i].notifyDependencies();
} else {
// inner rewrites
inc_restoreEnclosingRewrite();
}
}
}
$endif
$endif
$if(IncrementalLevelAttr)
$if(#isASTNodeDecl)
if (attrID.equals("getChild")) {
if (inc_checkRegionForInnerRewrite()) {
$ASTNode enclosingNode = inc_locateEnclosingRewrittenNode();
enclosingNode.getChild_handler.flushRegion();
return;
} else {
inc_flushRegion_rewrites();
getChild_handler.notifyDependencies();
return;
}
}
$endif
$endif
$if(IncrementalLevelNode)
inc_flushRegionRoot();
handler.notifyDependencies();
$endif
$if(IncrementalLevelRegion)
$if(#isRegionRoot)
if (inc_flushRegionRoot()) {
handler.clearDependencies();
handler.notifyDependencies();
}
$endif
$endif
$AttrFlushChecks
$endif
]]
ASTDecl.attrFlushCheck = [[
$if(IncrementalLevelParam)
$if(IsParameterized)
if (attrID.equals("$AttrSign") && $(AttrSign)_values != null && $(AttrSign)_values.containsKey(_parameters)) {
$if(IsNTA)
$AttrType value = ($AttrType)$(AttrSign)_values.remove(_parameters);
for (int i = 0; i < $(AttrSign)_proxy.children.length; i++) {
$ASTNode child = $(AttrSign)_proxy.children[i];
if (child != null && value == child) {
// using dummy node to flush dependencies from NTA
value.inc_flush_subtree(($DDGNodeName)$(AttrSign)_handler.get(_parameters));
$(AttrSign)_proxy.removeChild(i);
break;
}
}
$else
$(AttrSign)_values.remove(_parameters);
$endif
$DDGNodeName handler = ($DDGNodeName)$(AttrSign)_handler.remove(_parameters);
handler.throwAway();
handler.notifyDependencies();
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID, _parameters);
$endif
return;
}
$else
if (attrID.equals("$AttrSign") && $(AttrSign)_computed) {
$if(IsNTA)
if ($(AttrSign)_value instanceof $ASTNode) {
$(AttrSign)_value.setParent(null);
// using dummy node to flush dependencies from NTA
$(AttrSign)_value.inc_flush_subtree($(AttrSign)_handler);
}
$endif
$AttrResetVisit
$AttrResetCache
$(AttrSign)_handler.notifyDependencies();
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID, _parameters);
$endif
return;
}
$endif
$endif
$if(IncrementalLevelAttr)
$if(IsParameterized)
if (attrID.equals("$AttrSign") && $(AttrSign)_values != null && !$(AttrSign)_values.isEmpty()) {
$if(IsNTA)
if ($(AttrSign)_proxy != null) {
$(AttrSign)_proxy.setParent(null);
// using dummy node to flush dependencies from NTA
$(AttrSign)_proxy.inc_flush_subtree($(AttrSign)_handler);
}
$endif
$AttrResetVisit
$AttrResetCache
$(AttrSign)_handler.notifyDependencies();
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID);
$endif
return;
}
$else
if (attrID.equals("$AttrSign") && $(AttrSign)_computed) {
$if(IsNTA)
if ($(AttrSign)_value instanceof $ASTNode) {
$(AttrSign)_value.setParent(null);
// using dummy node to flush dependencies from NTA
$(AttrSign)_value.inc_flush_subtree(new $DDGNodeName(new $Opt(), ""));
}
$endif
$AttrResetVisit
$AttrResetCache
$(AttrSign)_handler.notifyDependencies();
$if(!#isASTNodeDecl)
super.reactToDependencyChange(attrID);
$endif
return;
}
$endif
$endif
]]
ASTDecl.incFlushMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelNode)
/** @apilevel internal */
public void #name.inc_flush() {
$FlushAttrs
$if(!#isASTNodeDecl)
super.inc_flush();
$endif
}
$endif
$if(IncrementalLevelRegion)
/** @apilevel internal */
public void #name.inc_flush() {
$FlushAttrs
$if(!#isASTNodeDecl)
super.inc_flush();
$endif
}
$endif
$endif
$endif
]]
ASTDecl.attrFlush = [[
$if(IsNTA)
$if(IncrementalLevelRegion)
// TODO: Add a flush of non-region root NTA children
$endif
$else
$if(IsParameterized)
if ($(AttrSign)_values != null && !$(AttrSign)_values.isEmpty()) {
$AttrResetVisit
$AttrResetCache
}
$else
$AttrResetVisit
$AttrResetCache
$endif
$endif
]]
ASTNode.incFlushChildMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(#isASTNodeDecl)
$if(IncrementalLevelNode)
/** @apilevel internal */
public boolean $ASTNode.inc_flush_child($ASTNode node) {
for (int i = 0; node.mayHaveRewrite() && i < children.length; i++) {
if (children[i] == node) {
return inc_restoreInitialForIndex(i, node.handler());
}
}
return true;
}
$endif
$if(IncrementalLevelRegion)
/** @apilevel internal */
public boolean $ASTNode.inc_flush_child($ASTNode node) {
for (int i = 0; node.mayHaveRewrite() && i < children.length; i++) {
if (children[i] == node) {
return inc_restoreInitialForIndex(i, node.handler());
}
}
return true;
}
$endif
$endif
$endif
$endif
]]
ASTDecl.incFlushNTAMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelNode)
/** @apilevel internal */
public boolean #name.inc_flush_NTA($ASTNode node) {
$if(#isListDecl)
if (inc_internalNTAList) {
state().enterConstruction();
int childIndex = getIndexOfChild(node);
removeChild(childIndex);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
if (inc_internalNTAList_map.containsValue(node)) {
for (java.util.Iterator itr = inc_internalNTAList_map.keySet().iterator(); itr.hasNext();) {
Object key = itr.next();
if (inc_internalNTAList_map.get(key) == node) {
inc_internalNTAList_map.remove(key);
break;
}
}
}
return true;
}
if (parent != null) {
int index = parent.getIndexOfChild(this);
if (index >= 0 && parent.childIsNTA(index)) {
state().enterConstruction();
int childIndex = getIndexOfChild(node);
removeChild(childIndex);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
return true;
}
return false;
}
$else
$if(#isListDecl)
if (parent != null) {
int index = parent.getIndexOfChild(this);
if (index >= 0 && parent.childIsNTA(index)) {
state().enterConstruction();
node.setParent(null);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
return true;
}
return false;
}
$else
$FlushNTAs
$endif
$endif
return false;
}
$endif
$if(IncrementalLevelRegion)
/** @apilevel internal */
public boolean #name.inc_flush_NTA($ASTNode node) {
$if(#isListDecl)
if (inc_internalNTAList) {
state().enterConstruction();
int childIndex = getIndexOfChild(node);
removeChild(childIndex);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
if (inc_internalNTAList_map.containsValue(node)) {
for (java.util.Iterator itr = inc_internalNTAList_map.keySet().iterator(); itr.hasNext();) {
Object key = itr.next();
if (inc_internalNTAList_map.get(key) == node) {
inc_internalNTAList_map.remove(key);
break;
}
}
}
return true;
}
if (parent != null) {
int index = parent.getIndexOfChild(this);
if (index >= 0 && parent.childIsNTA(index)) {
state().enterConstruction();
int childIndex = getIndexOfChild(node);
removeChild(childIndex);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
return true;
}
return false;
}
$else
$if(#isListDecl)
if (parent != null) {
int index = parent.getIndexOfChild(this);
if (index >= 0 && parent.childIsNTA(index)) {
state().enterConstruction();
node.setParent(null);
node.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
state().exitConstruction();
return true;
}
return false;
}
$else
$FlushNTAs
$endif
$endif
return false;
}
$endif
$endif
$endif
]]
ASTDecl.ntaFlush = [[
if ($(AttrSign)_value == node) {
state().enterConstruction();
$(AttrSign)_value.setParent(null);
state().exitConstruction();
$(AttrSign)_value.inc_flush_subtree(node.handler());
node.handler().clearDependencies();
$AttrResetVisit
$AttrResetCache
}
]]
ASTDecl.incFlushRegionRootMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelRegion)
$if(#isRegionRoot)
/** @apilevel internal */
public boolean #name.inc_flushRegionRoot() {
// Check for rewrites
// check for inner rewrite in region root
boolean rewriteFlushed = true;
if (parent != null) {
rewriteFlushed = parent.inc_flush_child(this);
// region root had an outer rewrite which was flushed (parent == null) -> done
if (rewriteFlushed && parent == null) {
return true;
}
}
boolean innerRewrite = false;
if (rewriteFlushed) {
// the region may have inner rewrites
innerRewrite = inc_checkRegionForInnerRewrite();
} else {
// region root had an inner rewrite which wasn't flushed
innerRewrite = true;
}
// Inner rewrites in the region (including the root) means abort and notify the enclosing rewritten node
if (innerRewrite) {
$ASTNode enclosingNode = inc_locateEnclosingRewrittenNode();
enclosingNode.handler().flushRegion();
return false;
}
// Check NTAs, this may remove the region
boolean regionRemoved = false;
if (parent != null) {
regionRemoved = parent.inc_flush_NTA(this); // check NTA
}
// region is still here, flush remaining values and outer rewrites
if (!regionRemoved) {
inc_flushRegion_rewrites();
inc_flushRegion();
}
return true;
}
$else
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean #name.inc_flushRegionRoot() {
// Check for rewrites
// check for inner rewrite in region root
boolean rewriteFlushed = true;
if (parent != null) {
rewriteFlushed = parent.inc_flush_child(this);
// region root had an outer rewrite which was flushed (parent == null) -> done
if (rewriteFlushed && parent == null) {
return true;
}
}
boolean innerRewrite = false;
if (rewriteFlushed) {
// the region may have inner rewrites
innerRewrite = inc_checkRegionForInnerRewrite();
} else {
// region root had an inner rewrite which wasn't flushed
innerRewrite = true;
}
// Inner rewrites in the region (including the root) means abort and notify the enclosing rewritten node
if (innerRewrite) {
$ASTNode enclosingNode = inc_locateEnclosingRewrittenNode();
enclosingNode.handler().flushRegion();
return false;
}
// Check NTAs, this may remove the region
boolean regionRemoved = false;
if (parent != null) {
regionRemoved = parent.inc_flush_NTA(this); // check NTA
}
// region is still here, flush remaining values and outer rewrites
if (!regionRemoved) {
inc_flushRegion_rewrites();
inc_flushRegion();
}
return true;
}
$endif
$endif
$endif
$if(IncrementalLevelNode)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_flushRegionRoot() {
inc_flush();
boolean rewriteFlushed = true;
if (parent != null) {
rewriteFlushed = parent.inc_flush_child(this);
// region root had an outer rewrite which was flushed (parent == null) -> done
if (rewriteFlushed && parent == null) {
return true;
}
}
if (!rewriteFlushed) {
$ASTNode enclosingNode = inc_locateEnclosingRewrittenNode();
enclosingNode.handler().flushRegion();
return false;
}
if (parent != null) {
parent.inc_flush_NTA(this); // check NTA
}
return true;
}
$endif
$endif
$endif
$endif
]]
ASTNode.incCheckRegionForInnerRewriteMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelRegion)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_checkRegionForInnerRewrite() {
for (int i = 0; children != null && children_computed != null && i < children.length && i < children_computed.length; i++) {
$ASTNode child = children[i];
if (child != null && !child.isRegionRoot()) {
if (children_computed[i]) {
if (init_children != null && i < init_children.length && init_children[i] == null) {
return true;
}
} else {
if (child.inc_checkRegionForInnerRewrite()) {
return true;
}
}
}
}
return false;
}
$endif
$endif
$if(IncrementalLevelNode)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_checkRegionForInnerRewrite() {
for (int i = 0; children != null && children_computed != null && i < children.length && i < children_computed.length; i++) {
$ASTNode child = children[i];
if (child != null && !child.isRegionRoot()) {
if (children_computed[i]) {
if (init_children != null && i < init_children.length && init_children[i] == null) {
return true;
}
} else {
if (child.inc_checkRegionForInnerRewrite()) {
return true;
}
}
}
}
return false;
}
$endif
$endif
$if(IncrementalLevelAttr)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_checkRegionForInnerRewrite() {
for (int i = 0; children != null && children_computed != null && i < children.length && i < children_computed.length; i++) {
$ASTNode child = children[i];
if (child != null) {
if (children_computed[i]) {
if (init_children != null && i < init_children.length && init_children[i] == null) {
return true;
}
}
}
}
return false;
}
$endif
$endif
$endif
$endif
]]
ASTDecl.incFlushRegionMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelRegion)
/** @apilevel internal */
public void #name.inc_flushRegion() {
$if(#isASTNodeDecl)
inc_flush();
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child != null && !child.isRegionRoot()) {
child.inc_flushRegion();
}
}
$else
super.inc_flushRegion();
$endif
$FlushNTAsInRegion
}
$endif
$endif
$endif
]]
ASTDecl.flushNTAsInRegion = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IsNTA)
$if(IsParameterized)
if ($(AttrSign)_proxy != null) {
for (int index = 0; index < $(AttrSign)_proxy.numChildren; index++) {
$ASTNode value = $(AttrSign)_proxy.children[index];
if (!value.isRegionRoot()) {
state().enterConstruction();
$(AttrSign)_proxy.removeChild(index);
// removeChild will decrease the index of all remaining children and numChildren
// hence, to visit the remainder of the list index need to be decreased by one for each removeChild
index--;
state().exitConstruction();
value.inc_flush_subtree(handler());
// remove the value in the NTA values map
for (java.util.Iterator itr = $(AttrSign)_values.keySet().iterator(); itr.hasNext();) {
Object key = itr.next();
if ($(AttrSign)_values.get(key) == value) {
$(AttrSign)_values.remove(key);
break;
}
}
}
}
}
$else
$if(IsNtaWithTree)
if ($(AttrSign)_value != null && !$(AttrSign)_value.isRegionRoot()) {
state().enterConstruction();
$(AttrSign)_value.setParent(null);
state().exitConstruction();
$(AttrSign)_value.inc_flush_subtree(handler());
$AttrResetVisit
$AttrResetCache
}
$endif
$endif
$endif
$endif
$endif
]]
ASTNode.incFlushRegionRewritesMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelRegion)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_flushRegion_rewrites() {
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child == null || child.isRegionRoot()) {
continue;
}
// rewritten child
if (children_computed != null && i < children_computed.length && children_computed[i]) {
if (!inc_restoreInitialForIndex(i, handler())) {
return false;
}
} else {
// not rewritten child
if (!child.inc_flushRegion_rewrites()) {
return false;
}
}
}
return true;
}
$endif
$endif
$if(IncrementalLevelAttr)
$if(#isASTNodeDecl)
/** @apilevel internal */
public boolean $ASTNode.inc_flushRegion_rewrites() {
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child == null) {
continue;
}
// rewritten child
if (children_computed != null && i < children_computed.length && children_computed[i]) {
if (!inc_restoreInitialForIndex(i, getChild_handler)) {
return false;
}
}
}
return true;
}
$endif
$endif
$endif
$endif
]]
ASTDecl.incFlushSubTreeMethod = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelRegion)
/** @apilevel internal */
protected void #name.inc_flush_subtree($DDGNodeName h) {
inc_state = inc_GARBAGE;
$FlushNtaSubTrees
$if(#isASTNodeDecl)
// flush subtree of values, take sets from encountered handler and remove it from DDG
if (isRegionRoot()) {
h.transferSetsFrom(handler());
}
inc_flush();
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child != null) {
child.inc_flush_subtree(h);
}
}
$else
super.inc_flush_subtree(h);
$endif
}
$endif
$if(IncrementalLevelNode)
/** @apilevel internal */
protected void #name.inc_flush_subtree($DDGNodeName h) {
inc_state = inc_GARBAGE;
$FlushNtaSubTrees
$if(#isASTNodeDecl)
// flush subtree of values, take sets from encountered handler and remove it from DDG
h.transferSetsFrom(handler());
inc_flush();
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child != null) {
child.inc_flush_subtree(h);
}
}
$else
super.inc_flush_subtree(h);
$endif
}
$endif
$if(IncrementalLevelAttr)
/** @apilevel internal */
protected void #name.inc_flush_subtree($DDGNodeName h) {
inc_state = inc_GARBAGE;
$FlushNtaSubTrees
$TransferSetsFromAttrTokenHandlers
$if(#isASTNodeDecl)
// flush subtree of values, take sets from encountered handler and remove it from DDG
h.transferSetsFrom(getParent_handler);
h.transferSetsFrom(getChild_handler);
h.transferSetsFrom(numChildren_handler);
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child != null) {
child.inc_flush_subtree(h);
}
}
$else
super.inc_flush_subtree(h);
$endif
}
$endif
$if(IncrementalLevelParam)
/** @apilevel internal */
protected void #name.inc_flush_subtree($DDGNodeName h) {
inc_state = inc_GARBAGE;
$FlushNtaSubTrees
$TransferSetsFromAttrTokenHandlers
$if(#isASTNodeDecl)
// flush subtree of values, take sets from encountered handler and remove it from DDG
h.transferSetsFrom(getParent_handler);
h.transferSetsFrom(numChildren_handler);
for (int i = 0; getChild_handler != null && i < getChild_handler.length; i++) {
h.transferSetsFrom(getChild_handler[i]);
}
for (int i = 0; children != null && i < children.length; i++) {
$ASTNode child = children[i];
if (child != null) {
child.inc_flush_subtree(h);
}
}
$else
super.inc_flush_subtree(h);
$endif
}
$endif
$endif
$endif
]]
ASTDecl.transferSetsFromAttributeHandler = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelAttr)
h.transferSetsFrom($(AttrSign)_handler);
$endif
$if(IncrementalLevelParam)
$if(IsParameterized)
if ($(AttrSign)_handler != null) {
for (java.util.Iterator itr = $(AttrSign)_handler.values().iterator(); itr.hasNext();) {
h.transferSetsFrom(($DDGNodeName)itr.next());
}
}
$else
h.transferSetsFrom($(AttrSign)_handler);
$endif
$endif
$endif
$endif
]]
ASTDecl.transferSetsFromTokenHandler = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IncrementalLevelAttr)
h.transferSetsFrom(get$(Id)_handler);
$endif
$if(IncrementalLevelParam)
h.transferSetsFrom(get$(Id)_handler);
$endif
$endif
$endif
]]
ASTDecl.flushNtaSubtree = [[
$if(IncrementalEnabled)
$if(IncrementalChangeFlush)
$if(IsNTA)
$if(IsParameterized)
if ($(AttrSign)_proxy != null) {
$(AttrSign)_proxy.inc_flush_subtree(h);
}
$else
$if(IsNtaWithTree)
if ($(AttrSign)_value != null) {
$(AttrSign)_value.inc_flush_subtree(h);
}
$endif
$endif
$endif
$endif
$endif
]]
ASTNode.incNotifyForRemoveMethod = [[
$if(IncrementalEnabled)
$if(IncrementalLevelRegion)
$if(#isASTNodeDecl)
/** @apilevel internal */
public void $ASTNode.inc_notifyForRemove() {
handler().flushRegion();
}
$endif
$endif
$if(IncrementalLevelNode)
$if(#isASTNodeDecl)
/** @apilevel internal */
public void $ASTNode.inc_notifyForRemove() {
handler.flushRegion();
}
$endif
$endif
$if(IncrementalLevelAttr)
$if(#isASTNodeDecl)
/** @apilevel internal */
public void $ASTNode.inc_notifyForRemove() {
getParent_handler.notifyDependencies();
}
$endif
$endif
$if(IncrementalLevelParam)
$if(#isASTNodeDecl)
/** @apilevel internal */
public void $ASTNode.inc_notifyForRemove() {
getParent_handler.notifyDependencies();
}
$endif
$endif
$endif
]]