diff --git a/compiler/Java_CodeGen.jrag b/compiler/Java_CodeGen.jrag index 242c533767d24d1cac00f8198f2142a0ca5da382..b03b3e074b1f1dce7e782c2ef4257b7153359508 100644 --- a/compiler/Java_CodeGen.jrag +++ b/compiler/Java_CodeGen.jrag @@ -337,6 +337,9 @@ aspect User_Types { when parentDecl() != null && getType().isUserType() to Decl.references() for parentDecl(); + + syn boolean Decl.hasReferences(); + eq Decl.hasReferences() = !references().isEmpty(); } aspect Java_Class { @@ -358,7 +361,7 @@ aspect Java_Class { } public void Decl.Java_emitUserTypeDeps(Java_env env, String via, boolean outputCode) { - if( !references().isEmpty() ) { + if( hasReferences() ) { Iterator<Decl> it = references().iterator(); while(it.hasNext()) { Decl t = it.next(); @@ -392,27 +395,36 @@ aspect Java_Class { public void TypeDecl.Java_emitClass(Java_env env, String pack) { Java_emitDeclPP(env); if (pack != null && pack.length() > 0) { - env.println("package " + pack + ";"); + env.println("package " + pack + ";"); } - env.println("import se.lth.control.labcomm"+env.verStr+".SampleType;"); - if (getType().Java_needInstance()) { - env.println("import java.io.IOException;"); - env.println("import se.lth.control.labcomm"+env.verStr+".Encoder;"); - env.println("import se.lth.control.labcomm"+env.verStr+".Decoder;"); - env.println(); - } - //For types not needing an instance, currently just an empty class is generated + env.println("import se.lth.control.labcomm"+env.verStr+".SampleType;"); + if (getType().Java_needInstance()) { + env.println("import java.io.IOException;"); + env.println("import se.lth.control.labcomm"+env.verStr+".Decoder;"); + } + if (getType().Java_needInstance() || hasReferences()) { + env.println("import se.lth.control.labcomm"+env.verStr+".Encoder;"); + env.println(); + } + + // For types without references and not needing an instance, + // currently just an empty class is generated env.println("public class " + getName() + " implements SampleType {"); env.println(); - if (getType().Java_needInstance()) { env.indent(); - getType().Java_emitInstance(env); - Java_emitEncoder(env); - Java_emitDecoder(env); - } + if(hasReferences()) { + // XXX Java_emitRegisterEncoder(env); + // XXX Java_emitDispatcher(env, false); + } + + if (getType().Java_needInstance()) { + getType().Java_emitInstance(env); + Java_emitEncoder(env); + Java_emitDecoder(env); + } env.unindent(); env.println("}"); } @@ -461,7 +473,36 @@ aspect Java_Class { env.println(); Java_emitRegisterEncoder(env); + Java_emitDispatcher(env, true); + Java_emitEncoder(env); + Java_emitDecoder(env); + env.println("private static byte[] signature = new byte[] {"); + env.indent(); + SignatureList signature = signature(env.version); + for (int i = 0 ; i < signature.size() ; i++) { + String comment = signature.getComment(i); + if (comment != null) { + env.println(signature.getIndent(i) + "// " + comment); + } + byte[] data = signature.getData(i); + if (data != null) { + env.print(signature.getIndent(i)); + for (int j = 0 ; j < data.length ; j++) { + env.print(data[j] + ", "); + } + env.println(); + } + } + env.unindent(); + env.println("};"); + env.unindent(); + env.println(); + env.println("}"); + + } + + public void Decl.Java_emitDispatcher(Java_env env, boolean canDecodeAndHandle) { env.println("private static class Dispatcher implements SampleDispatcher {"); env.indent(); env.println(); @@ -483,14 +524,24 @@ aspect Java_Class { env.unindent(); env.println("}"); env.println(); + env.println("public boolean isSample() {"); + env.indent(); + env.println("return "+canDecodeAndHandle+";"); + env.unindent(); + env.println("}"); + env.println(); env.println("public void decodeAndHandle(Decoder d,"); env.println(" SampleHandler h) throws Exception {"); env.indent(); - if (isVoid()) { - env.println(getName() + ".decode(d);"); - env.println("((Handler)h).handle_" + getName() + "();"); + if( canDecodeAndHandle) { + if (isVoid()) { + env.println(getName() + ".decode(d);"); + env.println("((Handler)h).handle_" + getName() + "();"); + } else { + env.println("((Handler)h).handle_" + getName() + "(" + getName() + ".decode(d));"); + } } else { - env.println("((Handler)h).handle_" + getName() + "(" + getName() + ".decode(d));"); + env.println("throw new Exception(\"A typedef has no handler, the corresponding method on the sample class should be called.\");"); } env.unindent(); env.println("}"); @@ -499,31 +550,7 @@ aspect Java_Class { env.println("}"); env.println(""); - Java_emitEncoder(env); - Java_emitDecoder(env); - env.println("private static byte[] signature = new byte[] {"); - env.indent(); - SignatureList signature = signature(env.version); - for (int i = 0 ; i < signature.size() ; i++) { - String comment = signature.getComment(i); - if (comment != null) { - env.println(signature.getIndent(i) + "// " + comment); - } - byte[] data = signature.getData(i); - if (data != null) { - env.print(signature.getIndent(i)); - for (int j = 0 ; j < data.length ; j++) { - env.print(data[j] + ", "); - } - env.println(); - } - } - env.unindent(); - env.println("};"); - env.unindent(); - env.println(); - env.println("}"); - } + } public void TypeDecl.Java_emitEncoder(Java_env env) { env.print("public static void encode(Encoder e");