From bf52175296d07ad2d115c69d652b1e5999b64b07 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 3 Mar 2019 23:31:48 +0100
Subject: [PATCH] create alternative reference resolving NOT setting the
 opposite directions

---
 src/main/jastadd/Backend.jadd                 | 37 ++++++++++++++-----
 .../org/jastadd/relast/compiler/Compiler.java |  1 +
 2 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index e6ae314..b079db0 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -257,7 +257,11 @@ aspect BackendDirectedAPI {
     sb.append(".get" + nameCapitalized() + "() {\n");
     if (resolverHelper) {
       sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null && get" + getImplAttributeName() + "().unresolved()) {\n");
-      sb.append(ind(3) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n");
+        sb.append(ind(3) + "if (get" + getImplAttributeName() + "().asUnresolved().get__resolve_opposite()) {\n");
+          sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n");
+        sb.append(ind(3) + "} else {\n");
+          sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n");
+        sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
     sb.append(ind(2) + "return get" + getImplAttributeName() + "();\n");
@@ -391,7 +395,7 @@ aspect BackendBidirectionalAPI {
           sb.append(ind(4) + "if (element.unresolved()) {\n");
             sb.append(ind(5) + "changed = true;\n");
             sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.asUnresolved().get__token(), i);\n");
-            sb.append(ind(5) + "if (resolvedElement != null) {\n");
+            sb.append(ind(5) + "if (resolvedElement != null && element.asUnresolved().get__resolve_opposite()) {\n");
               sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement.get" + opposite.getImplAttributeName() + "();\n");
               sb.append(ind(6) + "if (otherList == null) {\n");
                 sb.append(ind(7) + "otherList = new ArrayList<>();\n");
@@ -484,15 +488,19 @@ aspect BackendBidirectionalAPI {
           sb.append(ind(4) + "if (element.unresolved()) {\n");
             sb.append(ind(5) + "changed = true;\n");
             sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.asUnresolved().get__token(), i);\n");
-            sb.append(ind(5) + toTypeDecl() + " oldTarget = resolvedElement.get" + opposite.getImplAttributeName() + "();\n");
-            sb.append(ind(5) + "if (oldTarget != null && oldTarget != this) {\n");
-              sb.append(ind(6) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n");
-            sb.append(ind(5) + "}\n");
-            sb.append(ind(5) + "if (oldTarget == this) {\n");
-              sb.append(ind(6) + "l.remove(i);\n");
-              sb.append(ind(6) + "i--;\n");
+            sb.append(ind(5) + "if (element.asUnresolved().get__resolve_opposite()) {\n");
+              sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement.get" + opposite.getImplAttributeName() + "();\n");
+              sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n");
+                sb.append(ind(7) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n");
+              sb.append(ind(6) + "}\n");
+              sb.append(ind(6) + "if (oldTarget == this) {\n");
+                sb.append(ind(7) + "l.remove(i);\n");
+                sb.append(ind(7) + "i--;\n");
+              sb.append(ind(6) + "} else {\n");
+                sb.append(ind(7) + "resolvedElement.set" + opposite.getImplAttributeName() + "(this);\n");
+                sb.append(ind(7) + "l.set(i, resolvedElement);\n");
+              sb.append(ind(6) + "}\n");
             sb.append(ind(5) + "} else {\n");
-              sb.append(ind(6) + "resolvedElement.set" + opposite.getImplAttributeName() + "(this);\n");
               sb.append(ind(6) + "l.set(i, resolvedElement);\n");
             sb.append(ind(5) + "}\n");
           sb.append(ind(4) + "}\n");
@@ -727,6 +735,7 @@ aspect NameResolutionHelper {
 
     sb.append(ind(1) + "public interface __Unresolved {\n");
     sb.append(ind(2) + "abstract String get__token();\n");
+    sb.append(ind(2) + "abstract boolean get__resolve_opposite();\n");
     sb.append(ind(1) + "}\n\n");
 
     for (TypeDecl decl : getTypeDeclList()) {
@@ -764,6 +773,14 @@ aspect NameResolutionHelper {
     sb.append(ind(1) + "public static " + superType + " " + superType + ".createRef(String ref) {\n");
       sb.append(ind(2) + instantiableUnresolved.getID() + " unresolvedNode = new " + instantiableUnresolved.getID() + "();\n");
       sb.append(ind(2) + "unresolvedNode.set__token(ref);\n");
+      sb.append(ind(2) + "unresolvedNode.set__resolve_opposite(true);\n");
+      sb.append(ind(2) + "return unresolvedNode;\n");
+    sb.append(ind(1) + "}\n");
+
+    sb.append(ind(1) + "public static " + superType + " " + superType + ".createRefDirection(String ref) {\n");
+      sb.append(ind(2) + instantiableUnresolved.getID() + " unresolvedNode = new " + instantiableUnresolved.getID() + "();\n");
+      sb.append(ind(2) + "unresolvedNode.set__token(ref);\n");
+      sb.append(ind(2) + "unresolvedNode.set__resolve_opposite(false);\n");
       sb.append(ind(2) + "return unresolvedNode;\n");
     sb.append(ind(1) + "}\n");
   }
diff --git a/src/main/java/org/jastadd/relast/compiler/Compiler.java b/src/main/java/org/jastadd/relast/compiler/Compiler.java
index ab8b0b5..135a34b 100644
--- a/src/main/java/org/jastadd/relast/compiler/Compiler.java
+++ b/src/main/java/org/jastadd/relast/compiler/Compiler.java
@@ -59,6 +59,7 @@ public class Compiler {
         unresolvedDecl.setAbstract(typeDecl.getAbstract());
         unresolvedDecl.setSuper(new SimpleTypeUse(typeDecl.getID()));
         unresolvedDecl.addComponent(new TokenComponent("__token", new SimpleTypeUse("String")));
+        unresolvedDecl.addComponent(new TokenComponent("__resolve_opposite", new SimpleTypeUse("boolean")));
         p.addTypeDecl(unresolvedDecl);
         unresolvedDecls.add(unresolvedDecl);
       }
-- 
GitLab