From 75f973c257dc9b68b6248b1cf130642bed1c31bd Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Fri, 14 Aug 2020 19:23:25 +0200
Subject: [PATCH] Update to version 0.2.2

- allow normal tokens to be sent
---
 ragconnect.base/build.gradle                     |  6 +++---
 ragconnect.base/src/main/jastadd/Analysis.jrag   | 16 +++++++++++++++-
 ragconnect.base/src/main/jastadd/Errors.jrag     |  4 ----
 ragconnect.base/src/main/jastadd/Navigation.jrag |  4 ++++
 .../src/main/jastadd/RagConnect.relast           |  2 +-
 .../src/main/jastadd/backend/Generation.jadd     | 13 +++++++++++--
 .../jastadd/ragconnect/compiler/Compiler.java    | 13 ++++---------
 .../main/resources/ragConnectVersion.properties  |  4 ++--
 .../src/main/resources/sendDefinition.mustache   |  2 ++
 .../src/main/resources/tokenComponent.mustache   |  5 +++++
 10 files changed, 47 insertions(+), 22 deletions(-)

diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle
index 953e9c5..5fd73e5 100644
--- a/ragconnect.base/build.gradle
+++ b/ragconnect.base/build.gradle
@@ -51,9 +51,9 @@ task newVersion() {
     }
 }
 
-sourceSets.main.java {
-    srcDir "src/gen/java"
-}
+File genSrc = file("src/gen/java");
+sourceSets.main.java.srcDir genSrc
+idea.module.generatedSourceDirs += genSrc
 
 jar {
     manifest {
diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index b623999..a1367a9 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -24,9 +24,17 @@ aspect Analysis {
   }
 
   // --- isAlreadyDefined ---
-  syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinitions(getToken()).size() > 1;
+  syn boolean TokenEndpointDefinition.isAlreadyDefined() {
+    return lookupTokenEndpointDefinitions(getToken()).stream()
+      .filter(this::matchesType)
+      .count() > 1;
+  }
   syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this;
 
+  syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other);
+  eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition();
+  eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition();
+
   syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target);
   eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target);
   eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) {
@@ -54,4 +62,10 @@ aspect Analysis {
       default: return getName();
     }
   }
+
+  // --- shouldSendValue ---
+  syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA();
+
+  // --- needProxyToken ---
+  syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue);
 }
diff --git a/ragconnect.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag
index fe2fcd5..88f3aec 100644
--- a/ragconnect.base/src/main/jastadd/Errors.jrag
+++ b/ragconnect.base/src/main/jastadd/Errors.jrag
@@ -28,10 +28,6 @@ aspect Errors {
           getToken().effectiveJavaTypeUse())
       to RagConnect.errors();
 
-    SendTokenEndpointDefinition contributes error("Sending target token must be an NTA token!")
-      when !getToken().getNTA()
-      to RagConnect.errors();
-
     SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName())
       when isAlreadyDefined()
       to RagConnect.errors();
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 752fc36..f6fc20b 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -35,6 +35,10 @@ aspect Navigation {
   syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null;
   eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this;
 
+  // --- isReceiveTokenEndpointDefinition ---
+  syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false;
+  eq ReceiveTokenEndpointDefinition.isReceiveTokenEndpointDefinition() = true;
+
   // --- asReceiveTokenEndpointDefinition ---
   syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null;
   eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this;
diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
index accc617..9958106 100644
--- a/ragconnect.base/src/main/jastadd/RagConnect.relast
+++ b/ragconnect.base/src/main/jastadd/RagConnect.relast
@@ -5,7 +5,7 @@ abstract EndpointDefinition ::= <AlwaysApply:boolean> ;
 rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
 
 abstract TokenEndpointDefinition : EndpointDefinition;
-rel TokenEndpointDefinition.Token -> TokenComponent;
+rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*;
 
 ReceiveTokenEndpointDefinition : TokenEndpointDefinition;
 SendTokenEndpointDefinition : TokenEndpointDefinition;
diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
index 4b8d357..6b63992 100644
--- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
@@ -71,6 +71,7 @@ aspect AttributesForMustache {
   syn String MSendDefinition.updateMethod() = "_update_" + tokenName();
   syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
   syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset";
+  syn boolean MSendDefinition.shouldSendValue() = endpointDef().shouldSendValue();
 
   // --- MMappingDefinition ---
   syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
@@ -96,8 +97,16 @@ aspect AttributesForMustache {
   syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
   syn String MTokenComponent.name() = getTokenComponent().getName();
   syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint();
-  syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name();
+  syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName();
   syn String MTokenComponent.externalName() = name();
+  syn MSendDefinition MTokenComponent.normalTokenSendDef() {
+    for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) {
+      if (endpointDef.shouldSendValue()) {
+        return endpointDef.asSendTokenEndpointDefinition().toMustache();
+      }
+    }
+    return null;
+  }
 
   // --- toMustache ---
   syn lazy MRagConnect RagConnect.toMustache() {
@@ -118,7 +127,7 @@ aspect AttributesForMustache {
       result.addDependencyDefinition(def.toMustache());
     }
     for (TokenComponent token : getProgram().allTokenComponents()) {
-      if (!token.getDependencySourceDefinitionList().isEmpty()) {
+      if (token.needProxyToken()) {
         result.addTokenComponent(token.toMustache());
       }
     }
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index 711169e..28a3f20 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -216,6 +216,7 @@ public class Compiler extends AbstractCompiler {
     if (!atLeastOneGrammar && !atLeastOneRagConnect) {
       System.exit(1);
     }
+    ragConnect.flushTreeCache();
     ragConnect.treeResolveAll();
     ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
     ASTNode.loggingEnabledForReads = optionLogReads.value();
@@ -264,15 +265,9 @@ public class Compiler extends AbstractCompiler {
   }
 
   private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) {
-    for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) {
-      ragConnect.addEndpointDefinition(endpointDefinition);
-    }
-    for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) {
-      ragConnect.addMappingDefinition(mappingDefinition);
-    }
-    for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) {
-      ragConnect.addDependencyDefinition(dependencyDefinition);
-    }
+    ragConnect.setEndpointDefinitionList(ragConnectToIntegrate.getEndpointDefinitionList());
+    ragConnect.setMappingDefinitionList(ragConnectToIntegrate.getMappingDefinitionList());
+    ragConnect.setDependencyDefinitionList(ragConnectToIntegrate.getDependencyDefinitionList());
   }
 
 //  protected void printUsage() {
diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties
index 768893e..a2fe048 100644
--- a/ragconnect.base/src/main/resources/ragConnectVersion.properties
+++ b/ragconnect.base/src/main/resources/ragConnectVersion.properties
@@ -1,2 +1,2 @@
-#Fri Aug 14 13:28:32 CEST 2020
-version=0.2.1
+#Fri Aug 14 19:22:30 CEST 2020
+version=0.2.2
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
index d6601aa..60f5efc 100644
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ b/ragconnect.base/src/main/resources/sendDefinition.mustache
@@ -36,7 +36,9 @@ public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterNam
 }
 
 protected boolean {{parentTypeName}}.{{updateMethod}}() {
+  {{^shouldSendValue}}
   {{tokenResetMethod}}();
+  {{/shouldSendValue}}
   {{> mappingApplication}}
   {{lastValue}} = {{lastResult}};
   // normally we would return true here. unless no connect method was called so far to initialize {{sender}} yet
diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
index ec91e68..169f5f6 100644
--- a/ragconnect.base/src/main/resources/tokenComponent.mustache
+++ b/ragconnect.base/src/main/resources/tokenComponent.mustache
@@ -9,6 +9,11 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
     {{/targetEndpointDefinition}}
   }
   {{/DependencyDefinitions}}
+  {{#normalTokenSendDef}}
+  if ({{updateMethod}}()) {
+    {{writeMethod}}();
+  }
+  {{/normalTokenSendDef}}
   return this;
 }
 
-- 
GitLab