diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs index ac188dc..4f871b9 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs @@ -258,8 +258,11 @@ namespace RusticiSoftware.Translator.CSharp TemplateExtracter templateWalker = new TemplateExtracter(csTree); templateWalker.Filename = fullName; templateWalker.TraceDestination = Console.Error; - - templateWalker.compilation_unit(cfg, AppEnv); + + templateWalker.Cfg = cfg; + templateWalker.AppEnv = AppEnv; + + templateWalker.compilation_unit(); } } @@ -274,17 +277,24 @@ namespace RusticiSoftware.Translator.CSharp if (csTree != null) { // Make java compilation units from C# file - Dictionary cus = new Dictionary(); JavaMaker javaMaker = new JavaMaker(csTree); javaMaker.Filename = fullName; javaMaker.TraceDestination = Console.Error; - - JavaMaker.compilation_unit_return java = javaMaker.compilation_unit(cfg, cus); - foreach (KeyValuePair package in cus) { - Console.WriteLine (package.Key); - string claName = package.Key.Substring(package.Key.LastIndexOf('.')+1); - string nsDir = package.Key.Substring(0,package.Key.LastIndexOf('.')).Replace('.', Path.DirectorySeparatorChar); + javaMaker.Cfg = cfg; + javaMaker.CUMap = new Dictionary(); + javaMaker.CUKeys = new List(); + + JavaMaker.compilation_unit_return java = javaMaker.compilation_unit(); + + for (int i = 0; i < javaMaker.CUKeys.Count; i++) + { + string typeName = javaMaker.CUKeys[i]; + CommonTree typeAST = javaMaker.CUMap[typeName]; + Console.WriteLine (typeName); + + string claName = typeName.Substring(typeName.LastIndexOf('.')+1); + string nsDir = typeName.Substring(0,typeName.LastIndexOf('.')).Replace('.', Path.DirectorySeparatorChar); if (cfg.CheatDir != "") { @@ -314,12 +324,14 @@ namespace RusticiSoftware.Translator.CSharp } // Translate calls to .Net to calls to Java libraries - CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(package.Value); + CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(typeAST); javaSyntaxNodes.TokenStream = csTree.TokenStream; NetMaker netMaker = new NetMaker(javaSyntaxNodes); netMaker.Filename = fullName; netMaker.TraceDestination = Console.Error; + + netMaker.Cfg = cfg; NetMaker.compilation_unit_return javaCompilationUnit = netMaker.compilation_unit(); @@ -331,6 +343,9 @@ namespace RusticiSoftware.Translator.CSharp outputMaker.Filename = fullName; outputMaker.TraceDestination = Console.Error; outputMaker.TemplateLib = templates; + + outputMaker.Cfg = cfg; + outputMaker.IsLast = i == (javaMaker.CUKeys.Count - 1); StreamWriter javaW = new StreamWriter(javaFName); javaW.Write(outputMaker.compilation_unit().ToString()); diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs b/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs index 96d50ce..6eddbbc 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs @@ -9,7 +9,7 @@ namespace RusticiSoftware.Translator.CSharp { public class CommonWalker : TreeParser { - protected CS2JSettings Cfg { get; set; } + public CS2JSettings Cfg { get; set; } public string Filename { get; set; } protected CommonWalker(ITreeNodeStream input, RecognizerSharedState state) diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g index c018479..0d67a58 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g @@ -30,7 +30,12 @@ scope NSContext { @members { - private IDictionary CUs { get; set; } + // Since a CS file may comtain multiple top level types (and so generate multiple Java + // files) we build a map from type name to AST for each top level type + // We also build a lit of type names so that we can maintain the order (so comments + // at the end of the file will get included when we emit the java for the last type) + public IDictionary CUMap { get; set; } + public IList CUKeys { get; set; } protected string ParentNameSpace { get { @@ -45,10 +50,9 @@ scope NSContext { /////////////////////////////////////////////////////// -compilation_unit[CS2JSettings inCfg, IDictionary inCus /*, DirectoryHT inAppEnv*/] +compilation_unit scope NSContext; @init { - CUs = inCus; $NSContext::currentNS = ""; } : @@ -90,7 +94,8 @@ namespace_member_declaration: type_declaration_pkg @init { string ns = $NSContext::currentNS; } @after { - CUs.Add(ns+"."+$pkg.name, $type_declaration_pkg.tree); + CUMap.Add(ns+"."+$pkg.name, $type_declaration_pkg.tree); + CUKeys.Add(ns+"."+$pkg.name); } : pkg=type_declaration -> ^(PACKAGE PAYLOAD[ns] $pkg); diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g index 67eafd2..4f18e04 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g @@ -18,7 +18,12 @@ options { @members { + + public bool IsLast { get; set; } protected int emittedCommentTokenIdx = 0; + + // Collect all comments from previous position to endIdx + // comments are the text from tokens on the Hidden channel protected List collectComments(int endIdx) { List rets = new List(); List toks = ((CommonTokenStream)this.GetTreeNodeStream().TokenStream).GetTokens(emittedCommentTokenIdx,endIdx); @@ -30,12 +35,17 @@ options { emittedCommentTokenIdx = endIdx+1; return rets; } - + protected List collectComments() { + return collectComments(((CommonTokenStream)this.GetTreeNodeStream().TokenStream).GetTokens().Count - 1); + } } compilation_unit: ^(PACKAGE nm=PAYLOAD type_declaration) -> - package(now = {DateTime.Now}, includeDate = {true}, packageName = {$nm.text}, comments = {collectComments($type_declaration.start.TokenStartIndex)}, type = {$type_declaration.st}); + package(now = {DateTime.Now}, includeDate = {true}, packageName = {$nm.text}, + comments = {collectComments($type_declaration.start.TokenStartIndex)}, + type = {$type_declaration.st}, + endComments = {IsLast ? collectComments() : null}); type_declaration: class_declaration diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g index 7c8e280..5f01647 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g @@ -12,10 +12,6 @@ options { @members { - protected bool is_class_modifier() - { - return false; - } } compilation_unit: diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g index ade7028..d12a4fa 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g @@ -37,7 +37,7 @@ scope NSContext { // This is the environment that we are building, it maps fully qualified type names to their // translation templates - protected DirectoryHT AppEnv {get; set;} + public DirectoryHT AppEnv {get; set;} protected UseRepTemplate[] NameSpaceContext { get { @@ -75,11 +75,9 @@ scope NSContext { /////////////////////////////////////////////////////// -compilation_unit[CS2JSettings inCfg, DirectoryHT inAppEnv] +compilation_unit scope NSContext; @init{ - Cfg = inCfg; - AppEnv = inAppEnv; // For initial, file level scope $NSContext::nss = new List(); $NSContext::currentNS = ""; diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/minDriver.cs b/CSharpTranslator/antlr3/src/cs2j/CSharp/minDriver.cs index a248df0..7315694 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/minDriver.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/minDriver.cs @@ -53,7 +53,9 @@ namespace RusticiSoftware.Translator.CSharp nodes.TokenStream = tokens; TemplateExtracter templateWalker = new TemplateExtracter(nodes); - templateWalker.compilation_unit(new CS2JSettings(), new DirectoryHT()); + templateWalker.Cfg = new CS2JSettings(); + templateWalker.AppEnv = new DirectoryHT(); + templateWalker.compilation_unit(); } } diff --git a/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg index f11ffd5..6050735 100644 --- a/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg +++ b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg @@ -16,11 +16,13 @@ itsmine(now, includeDate) ::= << >> -package(now, includeDate, packageName, comments, type) ::= << +package(now, includeDate, packageName, comments, type, endComments) ::= << package ; + + >>