From 13c808d373d2f664dfd52e09742bc1f6c9f6f9a9 Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Wed, 29 Feb 2012 14:08:42 +0100 Subject: [PATCH] (re)support --dump-enums --- .../src/CS2JTranslator/CS2JMain/CS2JMain.cs | 13 +++--- .../CS2JTranslator/CS2JTransform/JavaMaker.g | 41 ++++++++++++++++++- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs index 995a15a..9ab08c6 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/CS2JMain.cs @@ -33,7 +33,7 @@ namespace Twiglet.CS2J.Translator { class CS2J { - private const string VERSION = "2011.3.3rs"; + private const string VERSION = "2012.1.1rs"; private static DirectoryHT AppEnv { get; set; } private static CS2JSettings cfg = new CS2JSettings(); private static StringTemplateGroup templates = null; @@ -46,6 +46,8 @@ namespace Twiglet.CS2J.Translator private static String[] newLines = new String[] { "\n", Environment.NewLine }; private static int numLines = (10 * 10) + 50 - 30; + private static XmlTextWriter enumXmlWriter = null; + public delegate void FileProcessor(string fName); private static Dictionary partialTypes = new Dictionary(); @@ -168,7 +170,7 @@ namespace Twiglet.CS2J.Translator // Output enum list, parsed translation files cfg.OptDumpEnums.SetIfDefault(general.GetBoolean("dump-enums", cfg.DumpEnums)); - cfg.OptEnumDir.SetIfDefault(Path.Combine(Directory.GetCurrentDirectory(), general.Get("out-enum-dir", cfg.EnumDir))); + cfg.OptEnumDir.SetIfDefault(Path.Combine(Directory.GetCurrentDirectory(), general.Get("out-enums-file", cfg.EnumDir))); cfg.OptDumpXmls.SetIfDefault(general.GetBoolean("dump-xmls", cfg.DumpXmls)); cfg.OptXmlDir.SetIfDefault(Path.Combine(Directory.GetCurrentDirectory(), general.Get("out-xml-dir", cfg.XmlDir))); @@ -220,7 +222,6 @@ namespace Twiglet.CS2J.Translator public static void CS2JMain(string[] args) { long startTime = DateTime.Now.Ticks; - XmlTextWriter enumXmlWriter = null; bool doHelp = false; // Use a try/catch block for parser exceptions @@ -247,7 +248,7 @@ namespace Twiglet.CS2J.Translator .Add ("show-tokens:", v => cfg.DisplayTokens = parseBoolOption(v)) .Add ("D=", def => cfg.OptMacroDefines.Add(mkStrings(def))) .Add ("dump-enums:", v => cfg.DumpEnums = parseBoolOption(v)) - .Add ("out-enum-dir=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir)) + .Add ("out-enums-file=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir)) .Add ("dump-xmls:", v => cfg.DumpXmls = parseBoolOption(v)) .Add ("out-xml-dir=", dir => cfg.XmlDir = Path.Combine(Directory.GetCurrentDirectory(), dir)) .Add ("out-java-dir=", dir => cfg.OutDir = dir) @@ -273,7 +274,6 @@ namespace Twiglet.CS2J.Translator .Add ("internal-isjavaish:", v => cfg.InternalIsJavaish = parseBoolOption(v)) ; - //TODO: fix enum dump // Final argument is translation target foreach (string s in p.Parse (args)) { @@ -353,6 +353,7 @@ namespace Twiglet.CS2J.Translator doFile(r, ".cs", addAppSigTranslation, cfg.ExAppRoot); // parse it if (cfg.DumpEnums) { enumXmlWriter = new XmlTextWriter(cfg.EnumDir, System.Text.Encoding.UTF8); + enumXmlWriter.WriteStartElement("enums"); } if (cfg.DumpXmls) { @@ -651,6 +652,8 @@ namespace Twiglet.CS2J.Translator javaMaker.CUKeys = new List(); javaMaker.IsJavaish = cfg.InternalIsJavaish; + javaMaker.EnumXmlWriter = enumXmlWriter; + if (cfg.DebugLevel >= 1) Console.Out.WriteLine("Translating {0} to Java", fullName); javaMaker.compilation_unit(); diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g index 1d23f07..1e60f06 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g @@ -41,6 +41,7 @@ scope TypeContext { { using System; using System.Text; + using System.Xml; using System.Globalization; using System.Text.RegularExpressions; } @@ -48,6 +49,41 @@ scope TypeContext { @members { + + private XmlTextWriter enumXmlWriter = null; + public XmlTextWriter EnumXmlWriter { + get { return enumXmlWriter; } + set { enumXmlWriter = value; } + } + + private void WriteStartEnum(String name) + { + if (enumXmlWriter != null) + { + enumXmlWriter.WriteStartElement("enum"); + enumXmlWriter.WriteAttributeString("id", name); + } + } + + private void WriteEndEnum() + { + if (enumXmlWriter != null) + { + enumXmlWriter.WriteEndElement(); + } + } + + private void WriteEnumMember(String name, int value) + { + if (enumXmlWriter != null) + { + enumXmlWriter.WriteStartElement("member"); + enumXmlWriter.WriteAttributeString("id", name); + enumXmlWriter.WriteAttributeString("value", value.ToString()); + enumXmlWriter.WriteEndElement(); + } + } + // 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 list of type names so that we can maintain the order (so comments @@ -1513,9 +1549,9 @@ scope TypeContext; } : { Cfg.EnumsAsNumericConsts }? => - e1='enum' identifier { $name = $identifier.thetext; $TypeContext::typeName = $identifier.thetext; } magicBoxedType[true,$e1.token,"System.Int32"] { constType = $magicBoxedType.tree; } (enum_base {constType = $enum_base.tree; } )? enum_body_asnumber[constType] ';'? + e1='enum' identifier { $name = $identifier.thetext; $TypeContext::typeName = $identifier.thetext; WriteStartEnum($name); } magicBoxedType[true,$e1.token,"System.Int32"] { constType = $magicBoxedType.tree; } (enum_base {constType = $enum_base.tree; } )? enum_body_asnumber[constType] ';'? { WriteEndEnum(); } -> ^(CLASS[$e1.token, "class"] { dupTree($atts) } { mangledMods } identifier enum_body_asnumber) - | e2='enum' identifier { $name = $identifier.thetext; $TypeContext::typeName = $identifier.thetext; } enum_base? enum_body ';'? + | e2='enum' identifier { $name = $identifier.thetext; $TypeContext::typeName = $identifier.thetext; WriteStartEnum($name); } enum_base? enum_body ';'? { WriteEndEnum(); } -> ^(ENUM[$e2.token, "ENUM"] { dupTree($atts) } { mangledMods } identifier enum_base? enum_body); enum_base: @@ -1534,6 +1570,7 @@ enum_member_declarations for (int i = 0; i < next; i++) { if (members.ContainsKey(i)) { adaptor.AddChild($enum_member_declarations.tree, members[i]); + WriteEnumMember(members[i].Text, i); } else { adaptor.AddChild($enum_member_declarations.tree, adaptor.Create(IDENTIFIER, $e.start.Token, "__dummyEnum__" + dummyCounter++));