public static void CS2JMain(string[] args) { long startTime = DateTime.Now.Ticks; bool doHelp = false; // Use a try/catch block for parser exceptions try { // if we have at least one command-line argument if (args.Length > 0) { if (cfg.Verbosity >= 2) { Console.Error.WriteLine("Parsing Command Line Arguments..."); } OptionSet p = new OptionSet() .Add("config=", f => updateFromConfigFile(f, cfg)) .Add("v", v => cfg.Verbosity = cfg.OptVerbosity.IsDefault ? 1 : cfg.Verbosity + 1) .Add("debug=", v => cfg.DebugLevel = Int32.Parse(v)) .Add("debug-template-extraction:", v => cfg.DebugTemplateExtraction = parseBoolOption(v)) .Add("warnings:", v => cfg.Warnings = parseBoolOption(v)) .Add("warnings-resolve-failures:", v => cfg.WarningsFailedResolves = parseBoolOption(v)) .Add("version:", v => { if (parseBoolOption(v)) { showVersion(); } }) .Add("help|h|?", v => { doHelp = true; doEarlyExit = true; }) .Add("show-csharp:", v => cfg.DumpCSharp = parseBoolOption(v)) .Add("show-java:", v => cfg.DumpJava = parseBoolOption(v)) .Add("show-javasyntax:", v => cfg.DumpJavaSyntax = parseBoolOption(v)) .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-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) .Add("cheat-dir=", dir => cfg.CheatDir = dir) .Add("net-templates-dir=", dirs => cfg.OptNetRoot.Add(mkDirectories(dirs))) .Add("ex-net-templates-dir=", dirs => cfg.OptExNetRoot.Add(mkDirectories(dirs))) .Add("net-schema-dir=", dirs => cfg.OptNetSchemaDir.Add(mkDirectories(dirs))) .Add("app-dir=", dirs => cfg.OptAppRoot.Add(mkDirectories(dirs))) .Add("ex-app-dir=", dirs => cfg.OptExAppRoot.Add(mkDirectories(dirs))) .Add("cs-dir=", dirs => cfg.OptCsDir.Add(mkDirectories(dirs))) .Add("ex-cs-dir=", dirs => cfg.OptExCsDir.Add(mkDirectories(dirs))) .Add("alt-translations=", alts => cfg.OptAltTranslations.Add(mkStrings(alts))) .Add("keep-parens:", v => cfg.TranslatorKeepParens = parseBoolOption(v)) .Add("timestamp-files:", v => cfg.TranslatorAddTimeStamp = parseBoolOption(v)) .Add("blanket-throw:", v => cfg.TranslatorBlanketThrow = parseBoolOption(v)) .Add("exception-is-throwable:", v => cfg.TranslatorExceptionIsThrowable = parseBoolOption(v)) .Add("make-javadoc-comments:", v => cfg.TranslatorMakeJavadocComments = parseBoolOption(v)) .Add("make-java-naming-conventions:", v => cfg.TranslatorMakeJavaNamingConventions = parseBoolOption(v)) .Add("experimental-enums-to-numeric-consts:", v => cfg.EnumsAsNumericConsts = parseBoolOption(v)) .Add("experimental-unsigned-to-signed:", v => cfg.UnsignedNumbersToSigned = parseBoolOption(v)) .Add("experimental-unsigned-to-bigger-signed:", v => cfg.UnsignedNumbersToBiggerSignedNumbers = parseBoolOption(v)) .Add("experimental-transforms:", v => cfg.ExperimentalTransforms = parseBoolOption(v)) .Add("internal-isjavaish:", v => cfg.InternalIsJavaish = parseBoolOption(v)) ; // Final argument is translation target foreach (string s in p.Parse(args)) { if (s.StartsWith("-") || s.StartsWith("/")) { Console.WriteLine("ERROR: Unrecognized Option: " + s); doEarlyExit = true; } else { cfg.OptCsDir.Add(mkDirectories(s)); } } if (cfg.Verbosity > 0) { showVersion(); } if (doHelp) { showUsage(); } if (!doEarlyExit && (cfg.CsDir == null || cfg.CsDir.Count == 0)) { // No work Console.WriteLine("Please specify files to translate with -cs-dir option"); doEarlyExit = true; } if (doEarlyExit) { Environment.Exit(0); } AppEnv = new DirectoryHT <TypeRepTemplate>(); if (cfg.TranslatorMakeJavaNamingConventions) { // Search lowerCamelCase AppEnv.Alts.Add("LCC"); } foreach (string alt in cfg.AltTranslations) { AppEnv.Alts.Add(alt); } // Load .Net templates // Do we have schemas for the templates? if (cfg.NetSchemaDir.Count == 0) { // By default look for schemas in net dirs cfg.NetSchemaDir = new List <string>(cfg.NetRoot); } // Comment out for now. I don't see how to wrie an xsd file that will allow elements to appear in any order // foreach (string schemadir in cfg.NetSchemaDir) // doFile(schemadir, ".xsd", addNetSchema, null); foreach (string r in cfg.NetRoot) { doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot); } // Load Application Class Signatures (i.e. generate templates) if (cfg.AppRoot.Count == 0) { // By default translation target is application root foreach (string s in cfg.CsDir) { cfg.AppRoot.Add(s); } } foreach (string r in cfg.AppRoot) { 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) { // Get package name and convert to directory name foreach (KeyValuePair <string, TypeRepTemplate> de in AppEnv) { String xmlFName = Path.Combine(cfg.XmlDir, ((string)de.Key).Replace('.', Path.DirectorySeparatorChar) + ".xml"); String xmlFDir = Path.GetDirectoryName(xmlFName); if (!Directory.Exists(xmlFDir)) { Directory.CreateDirectory(xmlFDir); } XmlSerializer s = new XmlSerializer(de.Value.GetType(), CS2JConstants.TranslationTemplateNamespace); TextWriter w = new StreamWriter(xmlFName); s.Serialize(w, de.Value); w.Close(); } } // load in T.stg template group, put in templates variable string templateLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.Combine("templates", "java.stg")); if (File.Exists(templateLocation)) { TextReader groupFileR = new StreamReader(templateLocation); templates = new StringTemplateGroup(groupFileR); groupFileR.Close(); } else { templates = new StringTemplateGroup(new StringReader(Templates.JavaTemplateGroup)); } foreach (string r in cfg.CsDir) { doFile(r, ".cs", translateFile, cfg.ExCsDir); // translate it } if (cfg.DebugLevel >= 1 && partialTypes.Count > 0) { Console.Out.WriteLine("Writing out collected partial types"); } foreach (KeyValuePair <string, ClassDescriptorSerialized> entry in partialTypes) { emitPartialType(entry.Key, entry.Value); } if (cfg.DumpEnums) { enumXmlWriter.WriteEndElement(); enumXmlWriter.Close(); } } else { showUsage(); } } catch (System.Exception e) { Console.Error.WriteLine("exception: " + e); Console.Error.WriteLine(e.StackTrace); // so we can get stack trace // don't continue on errors Environment.Exit(1); } double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0; if (cfg.Verbosity >= 1) { System.Console.Out.WriteLine("Total run time was {0} seconds.", elapsedTime); } }
public static void CS2JMain(string[] args) { long startTime = DateTime.Now.Ticks; bool doHelp = false; // Use a try/catch block for parser exceptions try { // if we have at least one command-line argument if (args.Length > 0) { if (cfg.Verbosity >= 2) Console.Error.WriteLine("Parsing Command Line Arguments..."); OptionSet p = new OptionSet () .Add ("config=", f => updateFromConfigFile(f, cfg)) .Add ("v", v => cfg.Verbosity = cfg.OptVerbosity.IsDefault ? 1 : cfg.Verbosity + 1) .Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v)) .Add ("debug-template-extraction:", v => cfg.DebugTemplateExtraction = parseBoolOption(v)) .Add ("warnings:", v => cfg.Warnings = parseBoolOption(v)) .Add ("warnings-resolve-failures:", v => cfg.WarningsFailedResolves = parseBoolOption(v)) .Add ("version:", v => { if (parseBoolOption(v)) showVersion(); }) .Add ("help|h|?", v => {doHelp = true; doEarlyExit = true; }) .Add ("show-csharp:", v => cfg.DumpCSharp = parseBoolOption(v)) .Add ("show-java:", v => cfg.DumpJava = parseBoolOption(v)) .Add ("show-javasyntax:", v => cfg.DumpJavaSyntax = parseBoolOption(v)) .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-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) .Add ("cheat-dir=", dir => cfg.CheatDir = dir) .Add ("net-templates-dir=", dirs => cfg.OptNetRoot.Add(mkDirectories(dirs))) .Add ("ex-net-templates-dir=", dirs => cfg.OptExNetRoot.Add(mkDirectories(dirs))) .Add ("net-schema-dir=", dirs => cfg.OptNetSchemaDir.Add(mkDirectories(dirs))) .Add ("app-dir=", dirs => cfg.OptAppRoot.Add(mkDirectories(dirs))) .Add ("ex-app-dir=", dirs => cfg.OptExAppRoot.Add(mkDirectories(dirs))) .Add ("cs-dir=", dirs => cfg.OptCsDir.Add(mkDirectories(dirs))) .Add ("ex-cs-dir=", dirs => cfg.OptExCsDir.Add(mkDirectories(dirs))) .Add ("alt-translations=", alts => cfg.OptAltTranslations.Add(mkStrings(alts))) .Add ("keep-parens:", v => cfg.TranslatorKeepParens = parseBoolOption(v)) .Add ("timestamp-files:", v => cfg.TranslatorAddTimeStamp = parseBoolOption(v)) .Add ("blanket-throw:", v => cfg.TranslatorBlanketThrow = parseBoolOption(v)) .Add ("exception-is-throwable:", v => cfg.TranslatorExceptionIsThrowable = parseBoolOption(v)) .Add ("make-javadoc-comments:", v => cfg.TranslatorMakeJavadocComments = parseBoolOption(v)) .Add ("make-java-naming-conventions:", v => cfg.TranslatorMakeJavaNamingConventions = parseBoolOption(v)) .Add ("experimental-enums-to-numeric-consts:", v => cfg.EnumsAsNumericConsts = parseBoolOption(v)) .Add ("experimental-unsigned-to-signed:", v => cfg.UnsignedNumbersToSigned = parseBoolOption(v)) .Add ("experimental-unsigned-to-bigger-signed:", v => cfg.UnsignedNumbersToBiggerSignedNumbers = parseBoolOption(v)) .Add ("experimental-transforms:", v => cfg.ExperimentalTransforms = parseBoolOption(v)) .Add ("internal-isjavaish:", v => cfg.InternalIsJavaish = parseBoolOption(v)) ; // Final argument is translation target foreach (string s in p.Parse (args)) { if (s.StartsWith("-") || s.StartsWith("/")) { Console.WriteLine("ERROR: Unrecognized Option: " + s); doEarlyExit = true; } else { cfg.OptCsDir.Add(mkDirectories(s)); } } if (cfg.Verbosity > 0) showVersion(); if (doHelp) showUsage(); if (!doEarlyExit && (cfg.CsDir == null || cfg.CsDir.Count == 0)) { // No work Console.WriteLine("Please specify files to translate with -cs-dir option"); doEarlyExit = true; } if (doEarlyExit) { Environment.Exit(0); } AppEnv = new DirectoryHT<TypeRepTemplate>(); if (cfg.TranslatorMakeJavaNamingConventions) { // Search lowerCamelCase AppEnv.Alts.Add("LCC"); } foreach (string alt in cfg.AltTranslations) { AppEnv.Alts.Add(alt); } // Load .Net templates // Do we have schemas for the templates? if (cfg.NetSchemaDir.Count == 0) { // By default look for schemas in net dirs cfg.NetSchemaDir = new List<string>(cfg.NetRoot); } // Comment out for now. I don't see how to wrie an xsd file that will allow elements to appear in any order // foreach (string schemadir in cfg.NetSchemaDir) // doFile(schemadir, ".xsd", addNetSchema, null); foreach (string r in cfg.NetRoot) doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot); // Load Application Class Signatures (i.e. generate templates) if (cfg.AppRoot.Count == 0) { // By default translation target is application root foreach (string s in cfg.CsDir) { cfg.AppRoot.Add(s); } } foreach (string r in cfg.AppRoot) 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) { // Get package name and convert to directory name foreach (KeyValuePair<string,TypeRepTemplate> de in AppEnv) { String xmlFName = Path.Combine(cfg.XmlDir, ((string)de.Key).Replace('.', Path.DirectorySeparatorChar) + ".xml"); String xmlFDir = Path.GetDirectoryName(xmlFName); if (!Directory.Exists(xmlFDir)) { Directory.CreateDirectory(xmlFDir); } XmlSerializer s = new XmlSerializer(de.Value.GetType(), CS2JConstants.TranslationTemplateNamespace); TextWriter w = new StreamWriter(xmlFName); s.Serialize(w, de.Value); w.Close(); } } // load in T.stg template group, put in templates variable string templateLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.Combine("templates", "java.stg")); if (File.Exists(templateLocation)) { TextReader groupFileR = new StreamReader(templateLocation); templates = new StringTemplateGroup(groupFileR); groupFileR.Close(); } else { templates = new StringTemplateGroup(new StringReader(Templates.JavaTemplateGroup)); } foreach (string r in cfg.CsDir) doFile(r, ".cs", translateFile, cfg.ExCsDir); // translate it if (cfg.DebugLevel >= 1 && partialTypes.Count > 0) Console.Out.WriteLine("Writing out collected partial types"); foreach (KeyValuePair<string, ClassDescriptorSerialized> entry in partialTypes) emitPartialType(entry.Key, entry.Value); if (cfg.DumpEnums) { enumXmlWriter.WriteEndElement(); enumXmlWriter.Close(); } } else { showUsage(); } } catch (System.Exception e) { Console.Error.WriteLine("exception: " + e); Console.Error.WriteLine(e.StackTrace); // so we can get stack trace } double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0; if (cfg.Verbosity >= 1) { System.Console.Out.WriteLine("Total run time was {0} seconds.", elapsedTime); } }