From a92013fafe2e85a13de067405167281c90ed1999 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 6 Oct 2022 09:56:51 +0200
Subject: [PATCH] 2.0.2

- keep original indices of children when filtered (untested)
---
 dumpAst.base/src/main/jastadd/DumpAst.relast          |  4 ++--
 dumpAst.base/src/main/jastadd/Printing.jrag           |  9 +++++++--
 dumpAst.base/src/main/jastadd/TemplateContext.jrag    |  2 +-
 dumpAst.base/src/main/jastadd/Transform.jadd          |  9 +++++++--
 .../inf/st/jastadd/featureTest/FeatureTestMain.java   | 11 +++++++----
 5 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/dumpAst.base/src/main/jastadd/DumpAst.relast b/dumpAst.base/src/main/jastadd/DumpAst.relast
index fcfd923..bca6fd7 100644
--- a/dumpAst.base/src/main/jastadd/DumpAst.relast
+++ b/dumpAst.base/src/main/jastadd/DumpAst.relast
@@ -5,9 +5,9 @@ DumpNode ::=  DumpChildNode* DumpToken* DumpRelation*
  <Name> <Label> <BackgroundColor> <TextColor> <Object:Object> <Invisible:boolean> <Computed:boolean> <ManualStereotypes>
  /InvisiblePath/ ;
 
-InnerDumpNode ;
+InnerDumpNode ::= <OriginalIndex:int>;
 rel InnerDumpNode.DumpNode <-> DumpNode.ContainerOfInner ;
-InnerRelationDumpNode;
+InnerRelationDumpNode ::= <OriginalIndex:int>;
 rel InnerRelationDumpNode.DumpNode -> DumpNode ; // .ContainerOfInner*
 
 abstract DumpChildNode ::= <Name> <Computed:boolean> ;
diff --git a/dumpAst.base/src/main/jastadd/Printing.jrag b/dumpAst.base/src/main/jastadd/Printing.jrag
index f42e6fa..2d64f5f 100644
--- a/dumpAst.base/src/main/jastadd/Printing.jrag
+++ b/dumpAst.base/src/main/jastadd/Printing.jrag
@@ -25,10 +25,15 @@ aspect Printing {
   syn String DumpNode.label() = getLabel();
   inh String InnerDumpNode.label();
   inh String InnerRelationDumpNode.label();
-  eq DumpListChildNode.getInnerDumpNode(int index).label() = label() + "[" + index + "]";
-  eq DumpListRelation.getInnerRelationDumpNode(int index).label() = label() + "[" + index + "]";
+  eq DumpListChildNode.getInnerDumpNode(int index).label() = label() + "[" +
+      chooseIndex(getInnerDumpNode(index).getOriginalIndex(), index) + "]";
+  eq DumpListRelation.getInnerRelationDumpNode(int index).label() = label() + "[" +
+      chooseIndex(getInnerRelationDumpNode(index).getOriginalIndex(), index) + "]";
   eq DumpReferenceListToken.getInnerRelationDumpNode(int index).label() = label() + "[" + index + "]";
   eq InvisiblePath.getInnerRelationDumpNode(int index).label() = null;
+  protected int ASTNode.chooseIndex(int originalIndex, int inheritedIndex) {
+    return originalIndex != 0 ? originalIndex : inheritedIndex;
+  }
 
   // --- bothVisible ---
   boolean ASTNode.bothVisible(DumpNode one, DumpNode two) {
diff --git a/dumpAst.base/src/main/jastadd/TemplateContext.jrag b/dumpAst.base/src/main/jastadd/TemplateContext.jrag
index e8d5549..a1d09c4 100644
--- a/dumpAst.base/src/main/jastadd/TemplateContext.jrag
+++ b/dumpAst.base/src/main/jastadd/TemplateContext.jrag
@@ -26,7 +26,7 @@ aspect TemplateContext {
   syn InvisiblePath DumpNode.getInvisiblePath() {
     InvisiblePath result = new InvisiblePath();
     for (DumpNode successor : reachableThroughInvisible()) {
-      result.addInnerRelationDumpNode(new InnerRelationDumpNode(successor));
+      result.addInnerRelationDumpNode(new InnerRelationDumpNode().setDumpNode(successor));
     }
     return result;
   }
diff --git a/dumpAst.base/src/main/jastadd/Transform.jadd b/dumpAst.base/src/main/jastadd/Transform.jadd
index 747a59b..bc8cfba 100644
--- a/dumpAst.base/src/main/jastadd/Transform.jadd
+++ b/dumpAst.base/src/main/jastadd/Transform.jadd
@@ -155,13 +155,15 @@ aspect Transform {
         listChild.setComputed(false);
         String childName = containmentMethod.getName();
         listChild.setName(childName);
+        int index = -1;
         for (Object target : targetList) {
+          index++;
           if (!getBuildConfig().getIncludeChildMethod().shouldInclude(obj, target, childName)) {
             continue;
           }
           DumpNode targetNode = transform(tti, target, options.asNormal(false));
           if (target != null && targetNode != null) {
-            listChild.addInnerDumpNode(new InnerDumpNode().setDumpNode(targetNode));
+            listChild.addInnerDumpNode(new InnerDumpNode().setDumpNode(targetNode).setOriginalIndex(index));
           }
         }
         if (listChild.getNumInnerDumpNode() > 0) {
@@ -229,13 +231,16 @@ aspect Transform {
         Iterable<?> targetList = (Iterable<?>) otherMethod.getMethod().invoke(obj);
         DumpListRelation listRelation = new DumpListRelation();
         listRelation.setName(otherMethod.getName());
+        int index = -1;
         for (Object target : targetList) {
+          index++;
           if (!getBuildConfig().getIncludeRelationMethod().shouldInclude(obj, target, otherMethod.getName())) {
             continue;
           }
           DumpNode targetNode = transform(tti, target, options.asRelation());
           if (target != null && targetNode != null) {
-            listRelation.addInnerRelationDumpNode(new InnerRelationDumpNode(targetNode));
+            listRelation.addInnerRelationDumpNode(new InnerRelationDumpNode().setDumpNode(targetNode)
+                .setOriginalIndex(index));
           }
         }
         if (listRelation.getNumInnerRelationDumpNode() > 0) {
diff --git a/dumpAst.prototyping/src/main/java/de/tudresden/inf/st/jastadd/featureTest/FeatureTestMain.java b/dumpAst.prototyping/src/main/java/de/tudresden/inf/st/jastadd/featureTest/FeatureTestMain.java
index 5e758f9..dc47a4a 100644
--- a/dumpAst.prototyping/src/main/java/de/tudresden/inf/st/jastadd/featureTest/FeatureTestMain.java
+++ b/dumpAst.prototyping/src/main/java/de/tudresden/inf/st/jastadd/featureTest/FeatureTestMain.java
@@ -23,18 +23,18 @@ public class FeatureTestMain {
     A a = new A().setName("A2");
     a.setB(new B().setName("B2.1"));
 //    a.setMyC(new C().setName("C2.1"));
-//    B b1 = new B().setName("B3").setOtherValue("some long text");
+    B b1 = new B().setName("B3").setOtherValue("some long text");
 //    C c = new C().setName("C4");
 //    c.setA(new A().setName("A4.1").setB(new B().setName("B4.1.1")));
 //    c.setRawReference(a);
 //    b1.setOneA(a);
-//    B b2 = new B().setName("B5").setOtherValue("#ff00ff");
+    B b2 = new B().setName("B5").setOtherValue("#ff00ff");
 //    C myC = new C().setName("C6");
 //    c.setA(new A().setName("A6.1").setB(new B().setName("B6.1.1")));
 //    a.setMyC(myC);
     root.setA(a);
-//    root.addB(b1);
-//    root.addB(b2);
+    root.addB(b1);
+    root.addB(b2);
 //    root.setC(c);
 
     Path pathToYaml = Paths.get("featureTest.yml");
@@ -51,6 +51,9 @@ public class FeatureTestMain {
           if (parentNode instanceof A && ((A) parentNode).getName().equals("A2")) {
             return false;
           }
+          if (parentNode instanceof Root && childNode instanceof B) {
+            return !"B3".equals(((B) childNode).getName());
+          }
           return !contextName.equals("MyC");
         })
         .includeRelationsWhen((sourceNode, targetNode, roleName) ->
-- 
GitLab