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