2004-02-06 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / ilasm / Driver.cs
index 997d4bb0ca42d03893ed9047d158564a39be9186..6121796e2ff143b310cb91f6b08d0990c1d9d1f4 100644 (file)
@@ -25,15 +25,25 @@ namespace Mono.ILASM {
                 public static int Main (string[] args)
                 {
                         DriverMain driver = new DriverMain (args);
-                        driver.Run ();
+                        try {
+                                driver.Run ();
+                        } catch (Exception e) {
+                                Console.WriteLine (e);
+                                Console.WriteLine ("Error while compiling.");
+                                return 1;
+                        }
+                        Console.WriteLine ("Compilation succeeded");
                         return 0;
                 }
 
                 private class DriverMain {
 
                         private ArrayList il_file_list;
+                        private Report report;
                         private string output_file;
                         private Target target = Target.Exe;
+                        private string target_string = "exe";
+                        private bool quiet = false;
                         private bool show_tokens = false;
                         private bool show_method_def = false;
                         private bool show_method_ref = false;
@@ -45,23 +55,26 @@ namespace Mono.ILASM {
                         {
                                 il_file_list = new ArrayList ();
                                 ParseArgs (args);
+                                report = new Report (quiet);
                         }
 
                         public void Run ()
                         {
-                                if (il_file_list.Count == 0) {
-                                        Usage ();
-                                        return;
+                                try {
+                                        if (il_file_list.Count == 0)
+                                                Usage ();
+                                        if (output_file == null)
+                                                output_file = CreateOutputFile ();
+                                        codegen = new CodeGen (output_file, target == Target.Dll, true, report);
+                                        foreach (string file_path in il_file_list)
+                                                ProcessFile (file_path);
+                                        if (scan_only)
+                                                return;
+
+                                        codegen.Write ();
+                                } catch {
+                                        throw;
                                 }
-                                if (output_file == null)
-                                        output_file = CreateOutputFile ();
-                                codegen = new CodeGen (output_file, target == Target.Dll, true);
-                                foreach (string file_path in il_file_list)
-                                        ProcessFile (file_path);
-                                if (scan_only)
-                                        return;
-                                codegen.ClassTable.CheckForUndefined ();
-                                codegen.PEFile.WritePEFile ();
                         }
 
                         private void ProcessFile (string file_path)
@@ -71,15 +84,17 @@ namespace Mono.ILASM {
                                                 file_path);
                                         Environment.Exit (2);
                                 }
+                                report.AssembleFile (file_path, null,
+                                                target_string, output_file);
                                 StreamReader reader = File.OpenText (file_path);
                                 ILTokenizer scanner = new ILTokenizer (reader);
 
                                 if (show_tokens)
                                         scanner.NewTokenEvent += new NewTokenEvent (ShowToken);
-                                if (show_method_def)
-                                        MethodTable.MethodDefinedEvent += new MethodDefinedEvent (ShowMethodDef);
-                                if (show_method_ref)
-                                        MethodTable.MethodReferencedEvent += new MethodReferencedEvent (ShowMethodRef);
+                                //if (show_method_def)
+                                //        MethodTable.MethodDefinedEvent += new MethodDefinedEvent (ShowMethodDef);
+                                //if (show_method_ref)
+                                //       MethodTable.MethodReferencedEvent += new MethodReferencedEvent (ShowMethodRef);
 
                                 if (scan_only) {
                                         ILToken tok;
@@ -89,18 +104,24 @@ namespace Mono.ILASM {
                                         return;
                                 }
 
-                                ILParser parser = new ILParser (codegen);
-                                if (show_parser)
-                                        parser.yyparse (new ScannerAdapter (scanner),  new yydebug.yyDebugSimple ());
-                                else
-                                        parser.yyparse (new ScannerAdapter (scanner),  null);
+                                ILParser parser = new ILParser (codegen, reader);
+                                try {
+                                        if (show_parser)
+                                                parser.yyparse (new ScannerAdapter (scanner),
+                                                                new yydebug.yyDebugSimple ());
+                                        else
+                                                parser.yyparse (new ScannerAdapter (scanner),  null);
+                                } catch {
+                                        Console.WriteLine ("Error at: " + scanner.Reader.Location);
+                                        throw;
+                                }
                         }
 
                         public void ShowToken (object sender, NewTokenEventArgs args)
                         {
                                 Console.WriteLine ("token: '{0}'", args.Token);
                         }
-
+                        /*
                         public void ShowMethodDef (object sender, MethodDefinedEventArgs args)
                         {
                                 Console.WriteLine ("***** Method defined *****");
@@ -121,7 +142,7 @@ namespace Mono.ILASM {
                                 Console.WriteLine ("-- return type: {0}", args.ReturnType);
                                 Console.WriteLine ("-- is in table: {0}", args.IsInTable);
                         }
-
+                        */
                         private void ParseArgs (string[] args)
                         {
                                 string command_arg;
@@ -131,40 +152,63 @@ namespace Mono.ILASM {
                                                 continue;
                                         }
                                         switch (GetCommand (str, out command_arg)) {
-                                                case "out":
-                                                        output_file = command_arg;
-                                                        break;
-                                                case "exe":
-                                                        target = Target.Exe;
+                                        case "out":
+                                                output_file = command_arg;
+                                                break;
+                                        case "exe":
+                                                target = Target.Exe;
+                                                target_string = "exe";
+                                                break;
+                                        case "dll":
+                                                target = Target.Dll;
+                                                target_string = "dll";
+                                                break;
+                                        case "quiet":
+                                                quiet = true;
+                                                break;
+                                        // Stubs to stay commandline compatible with MS 
+                                        case "listing":
+                                        case "nologo":
+                                        case "debug":
+                                        case "clock":
+                                        case "error":
+                                        case "subsystem":
+                                        case "flags":
+                                        case "alignment":
+                                        case "base":
+                                        case "key":
+                                        case "resource":
+                                                break;
+                                        case "scan_only":
+                                                scan_only = true;
+                                                break;
+                                        case "show_tokens":
+                                                show_tokens = true;
+                                                break;
+                                        case "show_method_def":
+                                                show_method_def = true;
+                                                break;
+                                        case "show_method_ref":
+                                                show_method_ref = true;
+                                                break;
+                                        case "show_parser":
+                                                show_parser = true;
+                                                break;
+                                        case "-about":
+                                                if (str[0] != '-')
                                                         break;
-                                                case "dll":
-                                                        target = Target.Dll;
+                                                About ();
+                                                break;
+                                        case "-version":
+                                                if (str[0] != '-')
                                                         break;
-                                                case "scan_only":
-                                                        scan_only = true;
-                                                        break;
-                                                case "show_tokens":
-                                                        show_tokens = true;
-                                                        break;
-                                                case "show_method_def":
-                                                        show_method_def = true;
-                                                        break;
-                                                case "show_method_ref":
-                                                        show_method_ref = true;
-                                                        break;
-                                                case "show_parser":
-                                                        show_parser = true;
-                                                        break;
-                                                case "-about":
-                                                        if (str[0] != '-')
-                                                                break;
-                                                        About ();
-                                                        break;
-                                                case "-version":
-                                                        if (str[0] != '-')
-                                                                break;
-                                                        Version ();
+                                                Version ();
+                                                break;
+                                        default:
+                                                if (str [0] == '-')
                                                         break;
+                                                il_file_list.Add (str);
+                                                break;
                                         }
                                 }
                         }
@@ -196,7 +240,7 @@ namespace Mono.ILASM {
                                         ext_index = file_name.Length;
 
                                 return String.Format ("{0}.{1}", file_name.Substring (0, ext_index),
-                                        target.ToString ().ToLower ());
+                                        target_string);
                         }
 
                         private void Usage ()
@@ -209,6 +253,7 @@ namespace Mono.ILASM {
                                         "   /exe               Compile to executable.\n" +
                                         "   /dll               Compile to library.\n" +
                                         "Options can be of the form -option or /option\n");
+                                Environment.Exit (1);
                         }
 
                         private void About ()