From 59b01b5b85f144be4cec8d40d9f15564d9fecd7b Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Fri, 29 May 2020 18:08:07 +0200
Subject: [PATCH] Testing default only write.

- base: fixed bug when multiple dependency definitions have same source (used to generate multiple getter/setter)
- added test case for writing all supported types for default mapping definitions
- inherited attributes for token-attributes are not supported (because no "$token_reset()" is generated by JastAdd)
- added short test descriptions
---
 src/main/jastadd/Navigation.jrag         | 10 ++++++
 src/main/jastadd/backend/Generation.jadd | 42 ++++++++++++++++--------
 2 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/src/main/jastadd/Navigation.jrag b/src/main/jastadd/Navigation.jrag
index ce20294..49b86d0 100644
--- a/src/main/jastadd/Navigation.jrag
+++ b/src/main/jastadd/Navigation.jrag
@@ -15,6 +15,10 @@ aspect Navigation {
   syn boolean Component.isTypeComponent() = false;
   eq TypeComponent.isTypeComponent() = true;
 
+  // --- asTypeComponent (should be in preprocessor) ---
+  syn TypeComponent Component.asTypeComponent() = null;
+  eq TypeComponent.asTypeComponent() = this;
+
   // --- isWriteToMqttDefinition ---
   syn boolean UpdateDefinition.isWriteToMqttDefinition() = false;
   eq WriteToMqttDefinition.isWriteToMqttDefinition() = true;
@@ -38,4 +42,10 @@ aspect Navigation {
   // --- isDefaultMappingDefinition ---
   syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
   eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
+
+  // --- allTokenComponents ---
+  coll java.util.Set<TokenComponent> Program.allTokenComponents() [new java.util.HashSet<>()] root Program;
+  TokenComponent contributes this
+    to Program.allTokenComponents()
+    for program();
 }
diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd
index 7a134ec..82c1ae0 100644
--- a/src/main/jastadd/backend/Generation.jadd
+++ b/src/main/jastadd/backend/Generation.jadd
@@ -101,6 +101,9 @@ aspect AspectGeneration {
     for (DependencyDefinition def : getDependencyDefinitionList()) {
       def.generateAspect(sb);
     }
+    for (TokenComponent token : getProgram().allTokenComponents()) {
+      token.generateAspect(sb);
+    }
 
     sb.append("}\n");
   }
@@ -235,27 +238,40 @@ aspect AspectGeneration {
       .append(dependencyMethod()).append("(").append(sourceParentTypeName).append(" source) {\n");
     sb.append(ind(2)).append("add").append(internalRelationPrefix()).append("Source(source);\n");
     sb.append(ind(1)).append("}\n\n");
+  }
+
+  void TokenComponent.generateAspect(StringBuilder sb) {
+    if (getDependencySourceDefinitionList().isEmpty()) { return; }
 
+    String parentTypeName = containingTypeDecl().getName();
     // virtual setter
-    sb.append(ind(1)).append("public ").append(sourceParentTypeName).append(" ")
-      .append(sourceParentTypeName).append(".set").append(getSource().getName()).append("(");
-    getSource().getJavaTypeUse().generateAbstractGrammar(sb);
+    sb.append(ind(1)).append("public ").append(parentTypeName).append(" ")
+      .append(parentTypeName).append(".set").append(getName()).append("(");
+    getJavaTypeUse().generateAbstractGrammar(sb);
     sb.append(" value) {\n");
-    sb.append(ind(2)).append("set").append(internalTokenName()).append("(value);\n");
-    sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get")
-      .append(internalRelationPrefix()).append("TargetList()) {\n");
-    sb.append(ind(3)).append("if (target.").append(targetUpdateDefinition().updateMethod()).append("()) {\n");
-    sb.append(ind(4)).append("target.").append(targetUpdateDefinition().writeMethod()).append("();\n");
-    sb.append(ind(3)).append("}\n");
-    sb.append(ind(2)).append("}\n");
+    sb.append(ind(2)).append("set").append(internalName()).append("(value);\n");
+
+    for (DependencyDefinition dependencyDefinition : getDependencySourceDefinitionList()) {
+      String targetParentTypeName = dependencyDefinition.getTarget().containingTypeDecl().getName();
+      sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get")
+        .append(dependencyDefinition.internalRelationPrefix()).append("TargetList()) {\n");
+      sb.append(ind(3)).append("if (target.")
+        .append(dependencyDefinition.targetUpdateDefinition().updateMethod())
+        .append("()) {\n");
+      sb.append(ind(4)).append("target.")
+        .append(dependencyDefinition.targetUpdateDefinition().writeMethod())
+        .append("();\n");
+      sb.append(ind(3)).append("}\n");
+      sb.append(ind(2)).append("}\n");
+    }
     sb.append(ind(2)).append("return this;\n");
     sb.append(ind(1)).append("}\n\n");
 
     // virtual getter
     sb.append(ind(1)).append("public ");
-    getSource().getJavaTypeUse().generateAbstractGrammar(sb);
-    sb.append(" ").append(sourceParentTypeName).append(".get").append(getSource().getName()).append("() {\n");
-    sb.append(ind(2)).append("return get").append(internalTokenName()).append("();\n");
+    getJavaTypeUse().generateAbstractGrammar(sb);
+    sb.append(" ").append(parentTypeName).append(".get").append(getName()).append("() {\n");
+    sb.append(ind(2)).append("return get").append(internalName()).append("();\n");
     sb.append(ind(1)).append("}\n\n");
   }
 }
-- 
GitLab