condition tests passes
[mono.git] / mcs / mcs / driver.cs
index b9407a6c13b91e5477bc587b16758e1dcc58fc8e..cf409aea1d4165f6fc7cda77fbc746497981b80c 100644 (file)
@@ -100,7 +100,6 @@ namespace Mono.CSharp
                //
                static Encoding encoding;
 
-
                static public void Reset ()
                {
                        want_debugging_support = false;
@@ -200,7 +199,9 @@ namespace Mono.CSharp
                        try {
                                parser.parse ();
                        } catch (Exception ex) {
-                               Report.Error(666, "Compilation aborted: " + ex);
+                               Report.Error(
+                                       666, String.Format ("Compilation aborted in file {0}, parser at {1}: {2}",
+                                                           file.Name, parser.Lexer.Location, ex));
                        } finally {
                                input.Close ();
                        }
@@ -212,10 +213,10 @@ namespace Mono.CSharp
                                "Other flags in the compiler\n" +
                                "   --fatal            Makes errors fatal\n" +
                                "   --parse            Only parses the source file\n" +
+                               "   --typetest         Tests the tokenizer's built-in type parser\n" +
                                "   --stacktrace       Shows stack trace at error location\n" +
                                "   --timestamp        Displays time stamps of various compiler events\n" +
                                "   --expect-error X   Expect that error X will be encountered\n" +
-                               "   -2                 Enables experimental C# features\n" +
                                "   -v                 Verbose parsing (for debugging the parser)\n" + 
                                "   --mcs-debug X      Sets MCS debugging level to X\n");
                }
@@ -223,40 +224,42 @@ namespace Mono.CSharp
                static void Usage ()
                {
                        Console.WriteLine (
-                               "Mono C# compiler, (C) 2001 - 2005 Novell, Inc.\n" +
+                               "Mono C# compiler, (C) 2001 - 2008 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" + 
-                               "   -checked[+|-]      Set default context to checked\n" +
+                               "   -addmodule:M1[,Mn] Adds the module to the generated assembly\n" + 
+                               "   -checked[+|-]      Sets default aritmetic overflow context\n" +
                                "   -codepage:ID       Sets code page to the one in ID (number, utf8, reset)\n" +
-                               "   -clscheck[+|-]     Disables CLS Compliance verifications" + Environment.NewLine +
-                               "   -define:S1[;S2]    Defines one or more symbols (short: /d:)\n" +
+                               "   -clscheck[+|-]     Disables CLS Compliance verifications\n" +
+                               "   -define:S1[;S2]    Defines one or more conditional symbols (short: -d)\n" +
                                "   -debug[+|-], -g    Generate debugging information\n" + 
                                "   -delaysign[+|-]    Only insert the public key into the assembly (no signing)\n" +
-                               "   -doc:FILE          XML Documentation file to generate\n" + 
-                               "   -keycontainer:NAME The key pair container used to strongname the assembly\n" +
-                               "   -keyfile:FILE      The strongname key file used to strongname the assembly\n" +
-                               "   -langversion:TEXT  Specifies language version modes: ISO-1 or Default\n" + 
-                               "   -lib:PATH1,PATH2   Adds the paths to the assembly link path\n" +
-                               "   -main:class        Specified the class that contains the entry point\n" +
+                               "   -doc:FILE          Process documentation comments to XML file\n" + 
+                               "   -help              Lists all compiler options (short: -?)\n" + 
+                               "   -keycontainer:NAME The key pair container used to sign the output assembly\n" +
+                               "   -keyfile:FILE      The key file used to strongname the ouput assembly\n" +
+                               "   -langversion:TEXT  Specifies language version modes: ISO-1, ISO-2, or Default\n" + 
+                               "   -lib:PATH1[,PATHn] Specifies the location of referenced assemblies\n" +
+                               "   -main:CLASS        Specifies the class with the Main method (short: -m)\n" +
                                "   -noconfig[+|-]     Disables implicit references to assemblies\n" +
-                               "   -nostdlib[+|-]     Does not load core libraries\n" +
-                               "   -nowarn:W1[,W2]    Disables one or more warnings\n" + 
-                               "   -optimize[+|-]     Enables code optimalizations\n" + 
-                               "   -out:FNAME         Specifies output file\n" +
+                               "   -nostdlib[+|-]     Does not reference mscorlib.dll library\n" +
+                               "   -nowarn:W1[,Wn]    Suppress one or more compiler warnings\n" + 
+                               "   -optimize[+|-]     Enables advanced compiler optimizations (short: -o)\n" + 
+                               "   -out:FILE          Specifies output assembly name\n" +
                                "   -pkg:P1[,Pn]       References packages P1..Pn\n" + 
-                               "   -recurse:SPEC      Recursively compiles the files in SPEC ([dir]/file)\n" + 
-                               "   -reference:ASS     References the specified assembly (-r:ASS)\n" +
-                               "   -target:KIND       Specifies the target (KIND is one of: exe, winexe,\n" +
-                               "                      library, module), (short: /t:)\n" +
-                               "   -unsafe[+|-]       Allows unsafe code\n" +
-                               "   -warnaserror[+|-]  Treat warnings as errors\n" +
-                               "   -warn:LEVEL        Sets warning level (the highest is 4, the default is 2)\n" +
-                               "   -help2             Show other help flags\n" + 
+                               "   -recurse:SPEC      Recursively compiles files according to SPEC pattern\n" + 
+                               "   -reference:A1[,An] Imports metadata from the specified assembly (short: -r)\n" +
+                               "   -reference:ALIAS=A Imports metadata using specified extern alias (short: -r)\n" +                           
+                               "   -target:KIND       Specifies the format of the output assembly (short: -t)\n" +
+                               "                      KIND can be one of: exe, winexe, library, module\n" +
+                               "   -unsafe[+|-]       Allows to compile code which uses unsafe keyword\n" +
+                               "   -warnaserror[+|-]  Treats all warnings as errors\n" +
+                               "   -warn:0-4          Sets warning level, the default is 3 (short -w:)\n" +
+                               "   -help2             Shows internal compiler options\n" + 
                                "\n" +
                                "Resources:\n" +
-                               "   -linkresource:FILE[,ID] Links FILE as a resource\n" +
-                               "   -resource:FILE[,ID]     Embed FILE as a resource\n" +
+                               "   -linkresource:FILE[,ID] Links FILE as a resource (short: -linkres)\n" +
+                               "   -resource:FILE[,ID]     Embed FILE as a resource (short: -res)\n" +
                                "   -win32res:FILE          Specifies Win32 resource file (.res)\n" +
                                "   -win32icon:FILE         Use this icon for the output\n" +
                                 "   @file                   Read response file for more options\n\n" +
@@ -271,13 +274,13 @@ namespace Mono.CSharp
                static void About ()
                {
                        Console.WriteLine (
-                               "The Mono C# compiler is (C) 2001-2005, Novell, Inc.\n\n" +
+                               "The Mono C# compiler is (C) 2001-2008, 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" +
-                               "   http://www.go-mono.com\n\n" +
+                               "   http://www.mono-project.com\n\n" +
 
-                               "The compiler was written by Miguel de Icaza, Ravi Pratap, Martin Baulig, Marek Safar, Raja R Harinath");
+                               "The compiler was written by Miguel de Icaza, Ravi Pratap, Martin Baulig, Marek Safar, Raja R Harinath, Atushi Enomoto");
                        Environment.Exit (0);
                }
 
@@ -285,6 +288,8 @@ namespace Mono.CSharp
                
                public static int Main (string[] args)
                {
+                       RootContext.Version = LanguageVersion.Default;
+
                        Location.InEmacs = Environment.GetEnvironmentVariable ("EMACS") == "t";
 
                        bool ok = MainDriver (args);
@@ -312,102 +317,141 @@ namespace Mono.CSharp
                        LoadAssembly (assembly, null, soft);
                }
 
+               static void Error6 (string name, string log)
+               {
+                       if (log != null && log.Length > 0)
+                               Report.ExtraInformation (Location.Null, "Log:\n" + log + "\n(log related to previous ");
+                       Report.Error (6, "cannot find metadata file `{0}'", name);
+               }
+
+               static void Error9 (string type, string filename, string log)
+               {
+                       if (log != null && log.Length > 0)
+                               Report.ExtraInformation (Location.Null, "Log:\n" + log + "\n(log related to previous ");
+                       Report.Error (9, "file `{0}' has invalid `{1}' metadata", filename, type);
+               }
+
+               static void BadAssembly (string filename, string log)
+               {
+                       MethodInfo adder_method = AssemblyClass.AddModule_Method;
+
+                       if (adder_method != null) {
+                               AssemblyName an = new AssemblyName ();
+                               an.Name = ".temp";
+                               AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly (an, AssemblyBuilderAccess.Run);
+                               try {
+                                       object m = null;
+                                       try {
+                                               m = adder_method.Invoke (ab, new object [] { filename });
+                                       } catch (TargetInvocationException ex) {
+                                               throw ex.InnerException;
+                                       }
+
+                                       if (m != null) {
+                                               Report.Error (1509, "referenced file `{0}' is not an assembly; try using the '-addmodule' option", filename);
+                                               return;
+                                       }
+                               } catch (FileNotFoundException) {
+                                       // did the file get deleted during compilation? who cares? swallow the exception
+                               } catch (BadImageFormatException) {
+                                       // swallow exception
+                               } catch (FileLoadException) {
+                                       // swallow exception
+                               }
+                       }
+                       Error9 ("assembly", filename, log);
+               }
+
                static public void LoadAssembly (string assembly, string alias, bool soft)
                {
-                       Assembly a;
+                       Assembly a = null;
                        string total_log = "";
 
                        try {
-                               char[] path_chars = { '/', '\\' };
+                               try {
+                                       char[] path_chars = { '/', '\\' };
 
-                               if (assembly.IndexOfAny (path_chars) != -1) {
-                                       a = Assembly.LoadFrom (assembly);
-                               } else {
-                                       string ass = assembly;
-                                       if (ass.EndsWith (".dll") || ass.EndsWith (".exe"))
-                                               ass = assembly.Substring (0, assembly.Length - 4);
-                                       a = Assembly.Load (ass);
+                                       if (assembly.IndexOfAny (path_chars) != -1) {
+                                               a = Assembly.LoadFrom (assembly);
+                                       } else {
+                                               string ass = assembly;
+                                               if (ass.EndsWith (".dll") || ass.EndsWith (".exe"))
+                                                       ass = assembly.Substring (0, assembly.Length - 4);
+                                               a = Assembly.Load (ass);
+                                       }
+                               } catch (FileNotFoundException) {
+                                       bool err = !soft;
+                                       foreach (string dir in link_paths) {
+                                               string full_path = Path.Combine (dir, assembly);
+                                               if (!assembly.EndsWith (".dll") && !assembly.EndsWith (".exe"))
+                                                       full_path += ".dll";
+
+                                               try {
+                                                       a = Assembly.LoadFrom (full_path);
+                                                       err = false;
+                                                       break;
+                                               } catch (FileNotFoundException ff) {
+                                                       if (soft)
+                                                               return;
+                                                       total_log += ff.FusionLog;
+                                               }
+                                       }
+                                       if (err) {
+                                               Error6 (assembly, total_log);
+                                               return;
+                                       }
                                }
+
                                // Extern aliased refs require special handling
                                if (alias == null)
                                        RootNamespace.Global.AddAssemblyReference (a);
                                else
                                        RootNamespace.DefineRootNamespace (alias, a);
 
-                       } catch (FileNotFoundException){
-                               foreach (string dir in link_paths){
-                                       string full_path = Path.Combine (dir, assembly);
-                                       if (!assembly.EndsWith (".dll") && !assembly.EndsWith (".exe"))
-                                               full_path += ".dll";
-
-                                       try {
-                                               a = Assembly.LoadFrom (full_path);
-                                               if (alias == null)
-                                                       RootNamespace.Global.AddAssemblyReference (a);
-                                               else
-                                                       RootNamespace.DefineRootNamespace (alias, a);
-                                               return;
-                                       } catch (FileNotFoundException ff) {
-                                               total_log += ff.FusionLog;
-                                               continue;
-                                       }
-                               }
-                               if (!soft) {
-                                       Report.Error (6, "Cannot find assembly `" + assembly + "'" );
-                                       Console.WriteLine ("Log: \n" + total_log);
-                               }
                        } catch (BadImageFormatException f) {
-                               Report.Error(6, "Cannot load assembly (bad file format)" + f.FusionLog);
-                       } catch (FileLoadException f){
-                               Report.Error(6, "Cannot load assembly " + f.FusionLog);
-                       } catch (ArgumentNullException){
-                               Report.Error(6, "Cannot load assembly (null argument)");
+                               // .NET 2.0 throws this if we try to load a module without an assembly manifest ...
+                               BadAssembly (f.FileName, f.FusionLog);
+                       } catch (FileLoadException f) {
+                               // ... while .NET 1.1 throws this
+                               BadAssembly (f.FileName, f.FusionLog);
                        }
                }
 
-               static public void LoadModule (MethodInfo adder_method, string module)
+               static public void LoadModule (string module)
                {
-                       Module m;
+                       Module m = null;
                        string total_log = "";
 
                        try {
                                try {
-                                       m = (Module)adder_method.Invoke (CodeGen.Assembly.Builder, new object [] { module });
-                               }
-                               catch (TargetInvocationException ex) {
-                                       throw ex.InnerException;
-                               }
-                               RootNamespace.Global.AddModuleReference (m);
-
-                       } 
-                       catch (FileNotFoundException){
-                               foreach (string dir in link_paths){
-                                       string full_path = Path.Combine (dir, module);
-                                       if (!module.EndsWith (".netmodule"))
-                                               full_path += ".netmodule";
+                                       m = CodeGen.Assembly.AddModule (module);
+                               } catch (FileNotFoundException) {
+                                       bool err = true;
+                                       foreach (string dir in link_paths) {
+                                               string full_path = Path.Combine (dir, module);
+                                               if (!module.EndsWith (".netmodule"))
+                                                       full_path += ".netmodule";
 
-                                       try {
                                                try {
-                                                       m = (Module)adder_method.Invoke (CodeGen.Assembly.Builder, new object [] { full_path });
+                                                       m = CodeGen.Assembly.AddModule (full_path);
+                                                       err = false;
+                                                       break;
+                                               } catch (FileNotFoundException ff) {
+                                                       total_log += ff.FusionLog;
                                                }
-                                               catch (TargetInvocationException ex) {
-                                                       throw ex.InnerException;
-                                               }
-                                               RootNamespace.Global.AddModuleReference (m);
+                                       }
+                                       if (err) {
+                                               Error6 (module, total_log);
                                                return;
-                                       } catch (FileNotFoundException ff) {
-                                               total_log += ff.FusionLog;
-                                               continue;
                                        }
                                }
-                               Report.Error (6, "Cannot find module `" + module + "'" );
-                               Console.WriteLine ("Log: \n" + total_log);
+
+                               RootNamespace.Global.AddModuleReference (m);
+
                        } catch (BadImageFormatException f) {
-                               Report.Error(6, "Cannot load module (bad file format)" + f.FusionLog);
-                       } catch (FileLoadException f){
-                               Report.Error(6, "Cannot load module " + f.FusionLog);
-                       } catch (ArgumentNullException){
-                               Report.Error(6, "Cannot load module (null argument)");
+                               Error9 ("module", f.FileName, f.FusionLog);
+                       } catch (FileLoadException f) {
+                               Error9 ("module", f.FileName, f.FusionLog);
                        }
                }
 
@@ -416,12 +460,18 @@ namespace Mono.CSharp
                /// </summary>
                static public void LoadReferences ()
                {
-                       foreach (string r in references)
-                               LoadAssembly (r, false);
+                       //
+                       // Load Core Library for default compilation
+                       //
+                       if (RootContext.StdLib)
+                               LoadAssembly ("mscorlib", false);
 
                        foreach (string r in soft_references)
                                LoadAssembly (r, true);
 
+                       foreach (string r in references)
+                               LoadAssembly (r, false);
+
                        foreach (DictionaryEntry entry in external_aliases)
                                LoadAssembly ((string) entry.Value, (string) entry.Key, false);
                        
@@ -594,7 +644,14 @@ namespace Mono.CSharp
                        //
                        string [] default_config = {
                                "System",
-                               "System.Xml",
+#if NET_2_1
+                               "agclr",
+                               "System.Core",
+                               "System.Silverlight",
+                               "System.Xml.Core",
+#else
+                               "System.Xml"
+#endif
 #if false
                                //
                                // Is it worth pre-loading all this stuff?
@@ -620,9 +677,10 @@ namespace Mono.CSharp
 #endif
                        };
                        
-                       int p = 0;
-                       foreach (string def in default_config)
-                               soft_references.Insert (p++, def);
+                       if (RootContext.Version == LanguageVersion.LINQ)
+                               soft_references.Add ("System.Core");
+
+                       soft_references.AddRange (default_config);
                }
 
                public static string OutputFile
@@ -647,15 +705,9 @@ namespace Mono.CSharp
                                Report.Error (1900, "Warning level must be in the range 0-4");
                                return;
                        }
-                       RootContext.WarningLevel = level;
+                       Report.WarningLevel = level;
                }
 
-               static void SetupV2 ()
-               {
-                       RootContext.Version = LanguageVersion.Default;
-                       defines.Add ("__V2__");
-               }
-               
                static void Version ()
                {
                        string version = Assembly.GetExecutingAssembly ().GetName ().Version.ToString ();
@@ -853,7 +905,7 @@ namespace Mono.CSharp
                                Report.Warning (-29, 1, "Compatibility: Use -warnaserror: option instead of --werror");
                                Report.WarningsAreErrors = true;
                                return true;
-                               
+
                        case "--nowarn":
                                Report.Warning (-29, 1, "Compatibility: Use -nowarn instead of --nowarn");
                                if ((i + 1) >= args.Length){
@@ -990,11 +1042,14 @@ namespace Mono.CSharp
                                OutputFile = value;
                                return true;
 
+                       case "/o":
+                       case "/o+":
                        case "/optimize":
                        case "/optimize+":
                                RootContext.Optimize = true;
                                return true;
 
+                       case "/o-":
                        case "/optimize-":
                                RootContext.Optimize = false;
                                return true;
@@ -1007,15 +1062,16 @@ namespace Mono.CSharp
 
                        case "/d":
                        case "/define": {
-                               string [] defs;
-
                                if (value.Length == 0){
                                        Usage ();
                                        Environment.Exit (1);
                                }
 
-                               defs = value.Split (new Char [] {';', ','});
-                               foreach (string d in defs){
+                               foreach (string d in value.Split (';', ',')){
+                                       if (!Tokenizer.IsValidIdentifier (d)) {
+                                               Report.Warning (2029, 1, "Invalid conditional define symbol `{0}'", d);
+                                               continue;
+                                       }
                                        defines.Add (d);
                                }
                                return true;
@@ -1121,7 +1177,7 @@ namespace Mono.CSharp
                                string [] refs = value.Split (new char [] { ';', ',' });
                                foreach (string r in refs){
                                        string val = r;
-                                       int index = val.IndexOf ("=");
+                                       int index = val.IndexOf ('=');
                                        if (index > -1) {
                                                string alias = r.Substring (0, index);
                                                string assembly = r.Substring (index + 1);
@@ -1318,23 +1374,29 @@ namespace Mono.CSharp
                                RootContext.StrongNameDelaySign = false;
                                return true;
 
-                       case "/v2":
-                       case "/2":
-                               Console.WriteLine ("The compiler option -2 is obsolete. Please use /langversion instead");
-                               SetupV2 ();
-                               return true;
-                               
                        case "/langversion":
                                switch (value.ToLower (CultureInfo.InvariantCulture)) {
-                                       case "iso-1":
-                                               RootContext.Version = LanguageVersion.ISO_1;
-                                               return true;
-
-                                       case "default":
-                                               SetupV2 ();
-                                               return true;
+                               case "iso-1":
+                                       RootContext.Version = LanguageVersion.ISO_1;
+                                       return true;
+                                       
+                               case "default":
+                                       RootContext.Version = LanguageVersion.Default;
+#if GMCS_SOURCE                                        
+                                       defines.Add ("__V2__");
+#endif
+                                       return true;
+#if GMCS_SOURCE
+                               case "iso-2":
+                                       RootContext.Version = LanguageVersion.ISO_2;
+                                       return true;
+                                       
+                               case "linq":
+                                       Report.Warning (-30, 1, "Deprecated: The `linq' option is no longer required and should not be used");
+                                       return true;
+#endif
                                }
-                               Report.Error (1617, "Invalid option `{0}' for /langversion. It must be either `ISO-1' or `Default'", value);
+                               Report.Error (1617, "Invalid option `{0}' for /langversion. It must be either `ISO-1', `ISO-2' or `Default'", value);
                                return true;
 
                        case "/codepage":
@@ -1465,7 +1527,7 @@ namespace Mono.CSharp
                                string arg = args [i];
                                if (arg.Length == 0)
                                        continue;
-                               
+
                                if (arg.StartsWith ("@")){
                                        string [] extra_args;
                                        string response_file = arg.Substring (1);
@@ -1532,12 +1594,8 @@ namespace Mono.CSharp
                        if (tokenize)
                                return true;
 
-                       //
-                       // This will point to the NamespaceEntry of the last file that was parsed, and may
-                       // not be meaningful when resolving classes from other files.  So, reset it to prevent
-                       // silent bugs.
-                       //
-                       RootContext.Tree.Types.NamespaceEntry = null;
+                       if (RootContext.ToplevelTypes.NamespaceEntry != null)
+                               throw new InternalErrorException ("who set it?");
 
                        //
                        // If we are an exe, require a source file for the entry point
@@ -1564,12 +1622,6 @@ namespace Mono.CSharp
                        if (parse_only)
                                return true;
 
-                       //
-                       // Load Core Library for default compilation
-                       //
-                       if (RootContext.StdLib)
-                               references.Insert (0, "mscorlib");
-
                        if (load_default_config)
                                DefineDefaultConfig ();
 
@@ -1627,14 +1679,8 @@ namespace Mono.CSharp
                        RootNamespace.Global.AddModuleReference (CodeGen.Module.Builder);
 
                        if (modules.Count > 0) {
-                               MethodInfo adder_method = typeof (AssemblyBuilder).GetMethod ("AddModule", BindingFlags.Instance|BindingFlags.NonPublic);
-                               if (adder_method == null) {
-                                       Report.RuntimeMissingSupport (Location.Null, "/addmodule");
-                                       Environment.Exit (1);
-                               }
-
                                foreach (string module in modules)
-                                       LoadModule (adder_method, module);
+                                       LoadModule (module);
                        }
                        
                        //
@@ -1654,7 +1700,7 @@ namespace Mono.CSharp
                        if (timestamps)
                                ShowTime ("   Core Types done");
 
-                       CodeGen.Module.ResolveAttributes ();
+                       CodeGen.Module.Resolve ();
 
                        //
                        // The second pass of the compiler
@@ -1669,7 +1715,6 @@ namespace Mono.CSharp
                                ShowTime ("Populate tree");
                        if (!RootContext.StdLib)
                                RootContext.BootCorlib_PopulateCoreTypes ();
-
                        RootContext.PopulateTypes ();
 
                        TypeManager.InitCodeHelpers ();
@@ -1722,7 +1767,7 @@ namespace Mono.CSharp
                        RootContext.CloseTypes ();
 
                        PEFileKinds k = PEFileKinds.ConsoleApplication;
-                       
+
                        switch (RootContext.Target) {
                        case Target.Library:
                        case Target.Module:
@@ -1738,7 +1783,7 @@ namespace Mono.CSharp
 
                                if (ep == null) {
                                        if (RootContext.MainClass != null) {
-                                               DeclSpace main_cont = RootContext.Tree.Types.GetDefinition (RootContext.MainClass) as DeclSpace;
+                                               DeclSpace main_cont = RootContext.ToplevelTypes.GetDefinition (RootContext.MainClass) as DeclSpace;
                                                if (main_cont == null) {
                                                        Report.Error (1555, "Could not find `{0}' specified for Main method", RootContext.MainClass); 
                                                        return false;
@@ -1895,7 +1940,7 @@ namespace Mono.CSharp
 
                        public void Emit ()
                        {
-                               CodeGen.Assembly.Builder.AddResourceFile (name, file, attribute);
+                               CodeGen.Assembly.Builder.AddResourceFile (name, Path.GetFileName(file), attribute);
                        }
 
                        public string FileName {
@@ -1964,8 +2009,9 @@ namespace Mono.CSharp
                static void Reset ()
                {
                        Driver.Reset ();
-                       Location.Reset ();
                        RootContext.Reset ();
+                       Tokenizer.Reset ();
+                       Location.Reset ();
                        Report.Reset ();
                        TypeManager.Reset ();
                        TypeHandle.Reset ();