Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }