From e7b7302dfeac1946b1ec3a50414f695b8c54761c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Emma=20S=C3=B6derberg?= <emma.m.soderberg@gmail.com>
Date: Sun, 20 May 2018 18:43:41 +0200
Subject: [PATCH] Moves the tracking of child from getChildNoTransform to
 getChild.

This allows for capturing of dependencies during attribute evaluation
that otherwise would be lost. The handler of getChild is now added
to the attribute evaluation stack which means dependencies to rewrittenNode
and other attributes can be tracked.

Tested with the incremental/param suite, Test 120-128.
---
 src/template/ast/ASTNode.tt          |  4 +-
 src/template/incremental/Tracking.tt | 63 ++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/src/template/ast/ASTNode.tt b/src/template/ast/ASTNode.tt
index a7c28759..f1bf99b4 100644
--- a/src/template/ast/ASTNode.tt
+++ b/src/template/ast/ASTNode.tt
@@ -420,12 +420,15 @@ ASTNode.getChild [[
 $if(RewriteEnabled)
  $if(RewriteCircularNTA)
     $ASTNode node = this.getChildNoTransform(i);
+    $include(ASTNode.incHookGetChild)
     if (node != null && node.mayHaveRewrite()) {
+      $include(ASTNode.incHookGetChildEnterEval)
       $ASTNode rewritten = node.rewrittenNode();
       if (rewritten != node) {
         rewritten.setParent(this);
         node = rewritten;
       }
+      $include(ASTNode.incHookGetChildExitEval)
     }
     return (T) node;
  $else
@@ -513,7 +516,6 @@ $endif
       return null;
     }
     T child = (T) children[i];
-    $include(ASTNode.incHookGetChildNT)
     return child;
   }
 ]]
diff --git a/src/template/incremental/Tracking.tt b/src/template/incremental/Tracking.tt
index a9446267..b37e88d1 100644
--- a/src/template/incremental/Tracking.tt
+++ b/src/template/incremental/Tracking.tt
@@ -329,6 +329,69 @@ $endif
 $endif
 ]]
 
+ASTNode.incHookGetChild = [[
+$if(IncrementalEnabled)
+
+$if(IncrementalLevelParam)
+if (getChild_handler[i] == null) {
+  $if(IncrementalPropLimit)
+  getChild_handler[i] = new $DDGNodeName(this, "getChild", Integer.valueOf(i), !child.mayHaveRewrite());
+  $else
+  getChild_handler[i] = new $DDGNodeName(this, "getChild", Integer.valueOf(i));
+  $endif
+}
+state().addHandlerDepTo(getChild_handler[i]);
+$endif
+
+$if(IncrementalLevelAttr)
+state().addHandlerDepTo(getChild_handler);
+$endif
+
+$if(IncrementalLevelNode)
+if (child != null) {
+  state().addHandlerDepTo(child.handler);
+}
+$endif
+
+$if(IncrementalLevelRegion)
+$if(#isRegionRoot)
+if (state().IN_COMPUTATION > 0 && child != null) {
+  child.handler().addDependant(handler);
+}
+$endif
+$endif
+
+$endif
+]]
+
+ASTNode.incHookGetChildEnterEval = [[
+$if(IncrementalEnabled)
+
+$if(IncrementalLevelParam)
+state().enterAttrStoreEval(getChild_handler[i]);
+$endif
+
+$if(IncrementalLevelRegion)
+// TODO(emso): Add region enter getChild eval.
+$endif
+
+$endif
+]]
+
+ASTNode.incHookGetChildExitEval = [[
+$if(IncrementalEnabled)
+
+$if(IncrementalLevelParam)
+state().exitAttrStoreEval(getChild_handler[i]);
+$endif
+
+$if(IncrementalLevelRegion)
+// TODO(emso): Add region exit getChild eval.
+$endif
+
+$endif
+]]
+
 TokenComponent.incHookGetToken = [[
 $if(IncrementalEnabled)
 
-- 
GitLab