From dbae91b4ff79e432dee1d0c6929f7698c3eb2da1 Mon Sep 17 00:00:00 2001
From: Sven Gestegard Robertz <sven.robertz@cs.lth.se>
Date: Wed, 18 Jun 2014 10:00:50 +0200
Subject: [PATCH] cherry-pick 271122318

---
 compiler/Java_CodeGen.jrag | 72 ++++++++++++++++++--------------------
 1 file changed, 34 insertions(+), 38 deletions(-)

diff --git a/compiler/Java_CodeGen.jrag b/compiler/Java_CodeGen.jrag
index c87f531..242c533 100644
--- a/compiler/Java_CodeGen.jrag
+++ b/compiler/Java_CodeGen.jrag
@@ -352,26 +352,42 @@ aspect Java_Class {
       env.println("/* ");
       pp(env.getPrintStream());
 
-      // temporary experiment with listing user type dependencies
-      // This should generate actual register(...) code
-      if( !references().isEmpty() ) {
-          Iterator<Decl> it = references().iterator();
-          while(it.hasNext()) {
-            Decl t = it.next();
-            env.println(" //Depends (directly) on "+t.getName() + " (" + t +") " );
-            //TODO: traverse AST to find indirect dependencies
-            Iterator<Decl> iit = t.references().iterator();
-            while(iit.hasNext()) {
-                Decl tt = iit.next();
-                env.println(" //Depends (indirectly) on "+tt.getName() + " (" + tt +") " );
-              }
-          }
-      } else {
-          env.println(" //no user type dependencies ");
-      }
+      Java_emitUserTypeDeps(env, null, false);
       env.println("*/");
 
   }
+ 
+  public void Decl.Java_emitUserTypeDeps(Java_env env, String via, boolean outputCode) {
+    if( !references().isEmpty() ) {
+        Iterator<Decl> it = references().iterator();
+        while(it.hasNext()) {
+            Decl t = it.next();
+
+            t.Java_emitUserTypeDeps(env, t.getName(), outputCode);
+            if(outputCode) {
+               env.println(t.getName()+".register(e);");
+            } else {  // Just output a comment
+	        String refpath = (via == null) ? "directly" : "indirectly via "+via;
+	       //env.println(" //Depends ("+refpath+") on "+t.getName() + " (" + t +") " );
+	       env.println(" //Depends ("+refpath+") on "+t.getName() );
+            }
+        }
+    } 
+//    else {
+//        env.println(" //no more deps ");
+//    }
+  }
+
+  public void Decl.Java_emitRegisterEncoder(Java_env env) {
+    env.println("public static void register(Encoder e) throws IOException {");
+    env.indent();
+
+    Java_emitUserTypeDeps(env, null, false); //XXX false -> generate no code
+    env.println("e.register(new Dispatcher());");
+    env.unindent();
+    env.println("}");
+    env.println(); 
+  }
 
   public void TypeDecl.Java_emitClass(Java_env env, String pack) {
       Java_emitDeclPP(env);
@@ -444,27 +460,7 @@ aspect Java_Class {
     env.println("}");
     env.println();
 
-    env.println("public static void register(Encoder e) throws IOException {");
-    env.indent();
-
-    if( !references().isEmpty() ) {
-        Iterator<Decl> it = references().iterator();
-        while(it.hasNext()) {
-          Decl t = it.next();
-          env.println(" //Depends (directly) on "+t.getName() + " (" + t +") " );
-          Iterator<Decl> iit = t.references().iterator();
-          while(iit.hasNext()) {
-             Decl tt = iit.next();
-             env.println(" //Depends (indirectly) on "+tt.getName() + " (" + tt +") " );
-           }
-        }
-    } else {
-        env.println(" //no more deps ");
-    }
-    env.println("e.register(new Dispatcher());");
-    env.unindent();
-    env.println("}");
-    env.println(); 
+    Java_emitRegisterEncoder(env);
 
     env.println("private static class Dispatcher implements SampleDispatcher {");
     env.indent();
-- 
GitLab