1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

(re)support --dump-enums

This commit is contained in:
Kevin Glynn 2012-02-29 14:08:42 +01:00
parent 6e39b1688b
commit 8e9a6c4dd5
2 changed files with 47 additions and 7 deletions

View File

@ -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<TypeRepTemplate> 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<string, ClassDescriptorSerialized> partialTypes = new Dictionary<string, ClassDescriptorSerialized>();
@ -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<string>();
javaMaker.IsJavaish = cfg.InternalIsJavaish;
javaMaker.EnumXmlWriter = enumXmlWriter;
if (cfg.DebugLevel >= 1) Console.Out.WriteLine("Translating {0} to Java", fullName);
javaMaker.compilation_unit();

View File

@ -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++));