2005-09-19 Chris Toshok <toshok@ximian.com>
[mono.git] / mcs / mcs / driver.cs
index 0fdfd91a138fc123014a3662d800dd1a7c72b932..a8130b6139c977a75001b09a36644b4e5c776f49 100644 (file)
@@ -6,7 +6,7 @@
 // Licensed under the terms of the GNU GPL
 //
 // (C) 2001, 2002, 2003 Ximian, Inc (http://www.ximian.com)
-// (C) 2004 Novell, Inc
+// (C) 2004, 2005 Novell, Inc
 //
 
 namespace Mono.CSharp
@@ -91,15 +91,11 @@ namespace Mono.CSharp
                static DateTime last_time, first_time;
 
                //
-               // Encoding: ISO-Latin1 is 28591
+               // Encoding.
                //
+               static Encoding defaultEncoding;
                static Encoding encoding;
 
-               //
-               // Whether the user has specified a different encoder manually
-               //
-               static bool using_default_encoder = true;
-
 
                static public void Reset ()
                {
@@ -113,8 +109,7 @@ namespace Mono.CSharp
                        win32ResourceFile = win32IconFile = null;
                        defines = null;
                        output_file = null;
-                       encoding = null;
-                       using_default_encoder = true;
+                       encoding = defaultEncoding = null;
                        first_source = null;
                }
 
@@ -153,12 +148,12 @@ namespace Mono.CSharp
                        try {
                                input = File.OpenRead (file.Name);
                        } catch {
-                               Report.Error (2001, "Source file '" + file.Name + "' could not be opened");
+                               Report.Error (2001, "Source file `" + file.Name + "' could not be found");
                                return;
                        }
 
                        using (input){
-                               SeekableStreamReader reader = new SeekableStreamReader (input, encoding, using_default_encoder);
+                               SeekableStreamReader reader = new SeekableStreamReader (input, encoding);
                                Tokenizer lexer = new Tokenizer (reader, file, defines);
                                int token, tokens = 0, errors = 0;
 
@@ -182,12 +177,20 @@ namespace Mono.CSharp
                        try {
                                input = File.OpenRead (file.Name);
                        } catch {
-                               Report.Error (2001, "Source file '" + file.Name + "' could not be opened");
+                               Report.Error (2001, "Source file `" + file.Name + "' could not be found");
                                return;
                        }
 
-                       SeekableStreamReader reader = new SeekableStreamReader (input, encoding, using_default_encoder);
-                               
+                       SeekableStreamReader reader = new SeekableStreamReader (input, encoding);
+
+                       // Check 'MZ' header
+                       if (reader.Read () == 77 && reader.Read () == 90) {
+                               Report.Error (2015, "Source file `{0}' is a binary file and not a text file", file.Name);
+                               input.Close ();
+                               return;
+                       }
+
+                       reader.Position = 0;
                        parser = new CSharpParser (reader, file, defines);
                        parser.ErrorOutput = Report.Stderr;
                        try {
@@ -216,7 +219,7 @@ namespace Mono.CSharp
                static void Usage ()
                {
                        Console.WriteLine (
-                               "Mono C# compiler, (C) 2001 - 2003 Ximian, Inc.\n" +
+                               "Mono C# compiler, (C) 2001 - 2005 Novell, Inc.\n" +
                                "mcs [options] source-files\n" +
                                "   --about            About the Mono C# compiler\n" +
                                "   -addmodule:MODULE  Adds the module to the generated assembly\n" + 
@@ -258,13 +261,13 @@ namespace Mono.CSharp
 
                static void TargetUsage ()
                {
-                       Report.Error (2019, "Valid options for -target: are exe, winexe, library or module");
+                       Report.Error (2019, "Invalid target type for -target. Valid options are `exe', `winexe', `library' or `module'");
                }
                
                static void About ()
                {
                        Console.WriteLine (
-                               "The Mono C# compiler is (C) 2001, 2002, 2003 Ximian, Inc.\n\n" +
+                               "The Mono C# compiler is (C) 2001-2005, Novell, Inc.\n\n" +
                                "The compiler source code is released under the terms of the GNU GPL\n\n" +
 
                                "For more information on Mono, visit the project Web site\n" +
@@ -276,8 +279,10 @@ namespace Mono.CSharp
 
                public static int counter1, counter2;
                
-       public static int Main (string[] args)
+               public static int Main (string[] args)
                {
+                       Location.InEmacs = Environment.GetEnvironmentVariable ("EMACS") == "t";
+
                        bool ok = MainDriver (args);
                        
                        if (ok && Report.Errors == 0) {
@@ -601,25 +606,26 @@ namespace Mono.CSharp
                                soft_references.Insert (p++, def);
                }
 
-               static void SetOutputFile (string name)
+               public static string OutputFile
                {
-                       output_file = name;
+                       set {
+                               output_file = value;
+                       }
+                       get {
+                               return Path.GetFileName (output_file);
+                       }
                }
 
                static void SetWarningLevel (string s)
                {
-                       int level = 0;
+                       int level = -1;
 
                        try {
                                level = Int32.Parse (s);
                        } catch {
-                               Report.Error (
-                                       1900,
-                                       "--wlevel requires a value from 0 to 4");
-                               return;
                        }
                        if (level < 0 || level > 4){
-                               Report.Error (1900, "Warning level must be 0 to 4");
+                               Report.Error (1900, "Warning level must be in the range 0-4");
                                return;
                        }
                        RootContext.WarningLevel = level;
@@ -715,7 +721,7 @@ namespace Mono.CSharp
                                        Usage ();
                                        Environment.Exit (1);
                                }
-                               SetOutputFile (args [++i]);
+                               OutputFile = args [++i];
                                return true;
 
                        case "--checked":
@@ -953,7 +959,7 @@ namespace Mono.CSharp
                                        Usage ();
                                        Environment.Exit (1);
                                }
-                               SetOutputFile (value);
+                               OutputFile = value;
                                return true;
 
                        case "/optimize":
@@ -1059,10 +1065,10 @@ namespace Mono.CSharp
                                        embedded_resources = new ArrayList ();
                                
                                if (embedded_resources.Contains (value)) {
-                                       Report.Error (1508, String.Format ("The resource identifier '{0}' has already been used in this assembly.", value));
+                                       Report.Error (1508, String.Format ("The resource identifier `{0}' has already been used in this assembly.", value));
                                }
                                else if (value.IndexOf (',') != -1 && embedded_resources.Contains (value.Split (',')[1])) {
-                                       Report.Error (1508, String.Format ("The resource identifier '{0}' has already been used in this assembly.", value));
+                                       Report.Error (1508, String.Format ("The resource identifier `{0}' has already been used in this assembly.", value));
                                }
                                else {
                                        embedded_resources.Add (value);
@@ -1207,7 +1213,7 @@ namespace Mono.CSharp
                                                }
                                                Report.SetIgnoreWarning (warn);
                                        } catch {
-                                               Report.Error (1904, String.Format("'{0}' is not a valid warning number", wc));
+                                               Report.Error (1904, String.Format("`{0}' is not a valid warning number", wc));
                                        }
                                }
                                return true;
@@ -1291,36 +1297,30 @@ namespace Mono.CSharp
                                                SetupV2 ();
                                                return true;
                                }
-                               Report.Error (1617, "Invalid option '{0}' for /langversion; must be ISO-1 or Default", value);
+                               Report.Error (1617, "Invalid option `{0}' for /langversion. It must be either `ISO-1' or `Default'", value);
                                return true;
 
                        case "/codepage":
-                               int cp = -1;
-
-                               if (value == "utf8"){
+                               switch (value) {
+                               case "utf8":
                                        encoding = new UTF8Encoding();
-                                       using_default_encoder = false;
-                                       return true;
-                               }
-                               if (value == "reset"){
-                                       //
-                                       // 28591 is the code page for ISO-8859-1 encoding.
-                                       //
-                                       cp = 28591;
-                                       using_default_encoder = true;
-                               }
-                               
-                               try {
-                                       cp = Int32.Parse (value);
-                                       encoding = Encoding.GetEncoding (cp);
-                                       using_default_encoder = false;
-                               } catch {
-                                       Report.Error (2016, String.Format("Code page '{0}' is invalid or not installed", cp));
+                                       break;
+                               case "reset":
+                                       encoding = defaultEncoding;
+                                       break;
+                               default:
+                                       try {
+                                               encoding = Encoding.GetEncoding (
+                                               Int32.Parse (value));
+                                       } catch {
+                                               Report.Error (2016, "Code page `{0}' is invalid or not installed", value);
+                                       }
+                                       break;
                                }
                                return true;
                        }
 
-                       //Report.Error (2007, String.Format ("Unrecognized command-line option: '{0}'", option));
+                       //Report.Error (2007, String.Format ("Unrecognized command-line option: `{0}'", option));
                        //Environment.Exit (1);
                        return false;
                }
@@ -1365,12 +1365,14 @@ namespace Mono.CSharp
                        bool parsing_options = true;
 
                        try {
-                               encoding = Encoding.GetEncoding (28591);
-                       } catch {
-                               Console.WriteLine ("Error: could not load encoding 28591, trying 1252");
-                               encoding = Encoding.GetEncoding (1252);
+                               // Latin1
+                               defaultEncoding = Encoding.GetEncoding (28591);
+                       } catch (Exception) {
+                               // iso-8859-1
+                               defaultEncoding = Encoding.GetEncoding (1252);
                        }
-                       
+                       encoding = defaultEncoding;
+
                        references = new ArrayList ();
                        soft_references = new ArrayList ();
                        modules = new ArrayList ();
@@ -1585,6 +1587,9 @@ namespace Mono.CSharp
                                RootContext.BootCorlib_PopulateCoreTypes ();
 
                        RootContext.PopulateTypes ();
+
+                       TypeManager.InitCodeHelpers ();
+
                        RootContext.DefineTypes ();
                        
                        if (RootContext.Documentation != null &&
@@ -1592,8 +1597,6 @@ namespace Mono.CSharp
                                        output_file))
                                return false;
 
-                       TypeManager.InitCodeHelpers ();
-
                        //
                        // Verify using aliases now
                        //
@@ -1608,7 +1611,6 @@ namespace Mono.CSharp
                                if (CodeGen.Assembly.IsClsCompliant) {
                                        AttributeTester.VerifyModulesClsCompliance ();
                                        TypeManager.LoadAllImportedTypes ();
-                                       AttributeTester.VerifyTopLevelNameClsCompliance ();
                                }
                        }
                        if (Report.Errors > 0)
@@ -1652,28 +1654,28 @@ namespace Mono.CSharp
                                        if (RootContext.MainClass != null) {
                                                DeclSpace main_cont = RootContext.Tree.GetDecl (MemberName.FromDotted (RootContext.MainClass));
                                                if (main_cont == null) {
-                                                       Report.Error (1555, output_file, "Could not find '{0}' specified for Main method", RootContext.MainClass); 
+                                                       Report.Error (1555, "Could not find `{0}' specified for Main method", RootContext.MainClass); 
                                                        return false;
                                                }
 
                                                if (!(main_cont is ClassOrStruct)) {
-                                                       Report.Error (1556, output_file, "'{0}' specified for Main method must be a valid class or struct", RootContext.MainClass);
+                                                       Report.Error (1556, "`{0}' specified for Main method must be a valid class or struct", RootContext.MainClass);
                                                        return false;
                                                }
 
-                                               Report.Error (1558, main_cont.Location, "'{0}' does not have a suitable static Main method", main_cont.GetSignatureForError ());
+                                               Report.Error (1558, main_cont.Location, "`{0}' does not have a suitable static Main method", main_cont.GetSignatureForError ());
                                                return false;
                                        }
 
                                        if (Report.Errors == 0)
-                                               Report.Error (5001, "Program " + output_file +
-                                                             " does not have an entry point defined");
+                                               Report.Error (5001, "Program `{0}' does not contain a static `Main' method suitable for an entry point",
+                                                       output_file);
                                        return false;
                                }
 
                                CodeGen.Assembly.Builder.SetEntryPoint (ep, k);
                        } else if (RootContext.MainClass != null) {
-                               Report.Error (2017, "Can not specify -main: when building module or library");
+                               Report.Error (2017, "Cannot specify -main if building a module or library");
                        }
 
                        //