From 001af931fa2d1b113c755179274a914c7d9db05d Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 18 Mar 2019 18:11:05 +0100
Subject: [PATCH] remove some indirections and attribute usage when only
 serialization is used

---
 src/main/jastadd/Backend.jadd                 | 60 ++++++++++++-------
 .../org/jastadd/relast/compiler/Compiler.java |  5 +-
 2 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index b4d174d..012e232 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -871,8 +871,8 @@ aspect NameResolutionHelper {
   }
 
   public void TypeDecl.generateContextIndependentNameResolution(StringBuilder sb) {
-
     sb.append(ind(1) + "// context-independent name resolution\n");
+    sb.append(ind(1) + "uncache ASTNode.globallyResolve" + getID() + "ByToken(String id);\n");
     sb.append(ind(1) + "syn " + getID() + " ASTNode.globallyResolve" + getID() + "ByToken(String id) {\n");
     if (serializer) {
       sb.append(ind(2) + "return (" + getID() + ") globallyResolveASTNodeByUID(id);\n");
@@ -908,24 +908,36 @@ aspect NameResolutionHelper {
     generateDirectedContextDependentNameResolution(sb);
   }
   public void ManyRelationComponent.generateContextDependentNameResolution(StringBuilder sb) {
-    sb.append(ind(1) + "// context-dependent name resolution\n");
-    sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n");
-      sb.append(ind(2) + "// default to context-independent name resolution\n");
-      sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n");
-    sb.append(ind(1) + "}\n");
+    System.out.println("serializer: " + serializer);
+    System.out.println("ResolverHelper: " + resolverHelper);
+
+    if (serializer && !resolverHelper) {
+      sb.append(ind(1) + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n");
+        sb.append(ind(2) + "return (" + ofTypeDecl() + ") globallyResolveASTNodeByUID(id);\n");
+      sb.append(ind(1) + "}\n");
+    } else {
+      sb.append(ind(1) + "// context-dependent name resolution\n");
+      sb.append(ind(1) + "uncache " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position);\n");
+      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id, int position) {\n");
+        sb.append(ind(2) + "// default to context-independent name resolution\n");
+        sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n");
+      sb.append(ind(1) + "}\n");
+    }
   }
 
   public void RelationComponent.generateDirectedContextDependentNameResolution(StringBuilder sb) {
-    // // context-dependent name resolution
-    // NamedElement A.resolveRel1(String id) {
-    //   // default to context-independent name resolution
-    //   return resolveNamedElement(id);
-    // }
-    sb.append(ind(1) + "// context-dependent name resolution\n");
-    sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n");
-      sb.append(ind(2) + "// default to context-independent name resolution\n");
-      sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n");
-    sb.append(ind(1) + "}\n");
+    if (serializer && !resolverHelper) {
+      sb.append(ind(1) + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n");
+        sb.append(ind(2) + "return (" + ofTypeDecl() + ") globallyResolveASTNodeByUID(id);\n");
+      sb.append(ind(1) + "}\n");
+    } else {
+      sb.append(ind(1) + "// context-dependent name resolution\n");
+      sb.append(ind(1) + "uncache " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id);\n");
+      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + toTypeDecl() + ".resolve" + nameCapitalized() + "ByToken(String id) {\n");
+        sb.append(ind(2) + "// default to context-independent name resolution\n");
+        sb.append(ind(2) + "return globallyResolve" + ofTypeDecl() + "ByToken(id);\n");
+      sb.append(ind(1) + "}\n");
+    }
   }
 
   public void Program.resolveAll(StringBuilder sb) {
@@ -1345,13 +1357,15 @@ aspect Serializer {
     sb.append(ind(2) + "return null;\n");
     sb.append(ind(1) + "}\n");
 
-    sb.append(ind(1) + "syn ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n");
-    sb.append(ind(2) + "if (getParent() == null) {\n");
-    sb.append(ind(3) + "return __uidMap().get(uid);\n");
-    sb.append(ind(2) + "} else {\n");
-    sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n");
-    sb.append(ind(2) + "}\n");
-    sb.append(ind(1) + "}\n");
+    if (serializer) {
+      sb.append(ind(1) + "ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n");
+      sb.append(ind(2) + "if (getParent() == null) {\n");
+      sb.append(ind(3) + "return __uidMap().get(uid);\n");
+      sb.append(ind(2) + "} else {\n");
+      sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n");
+      sb.append(ind(2) + "}\n");
+      sb.append(ind(1) + "}\n");
+    }
 
     sb.append(ind(1) + "syn java.util.Map<String, ASTNode> ASTNode.__uidMap() {\n");
     sb.append(ind(2) + "return(__uidMap(new java.util.HashMap()));\n");
diff --git a/src/main/java/org/jastadd/relast/compiler/Compiler.java b/src/main/java/org/jastadd/relast/compiler/Compiler.java
index 9100db9..124aed2 100644
--- a/src/main/java/org/jastadd/relast/compiler/Compiler.java
+++ b/src/main/java/org/jastadd/relast/compiler/Compiler.java
@@ -89,8 +89,11 @@ public class Compiler {
           }
         }
 
-        if (optionResolverHelper.isSet() || optionSerializer.isSet()) {
+        if (optionResolverHelper.isSet()) {
           ASTNode.resolverHelper = true;
+        }
+
+        if (optionResolverHelper.isSet() || optionSerializer.isSet()) {
           writeToFile(grammarName + "ResolverStubs.jrag", p.generateResolverStubs());
         }
 
-- 
GitLab