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