Emit correct sequence info for iterators
[mono.git] / mcs / mcs / driver.cs
index 9646184e4d5ac882ad8c07bc89c8949197d41177..f029e9a1934b0daa1c464eea6add7ed7dd2d8624 100644 (file)
@@ -9,6 +9,7 @@
 //
 // Copyright 2001, 2002, 2003 Ximian, Inc (http://www.ximian.com)
 // Copyright 2004, 2005, 2006, 2007, 2008 Novell, Inc
+// Copyright 2011 Xamarin Inc
 //
 
 using System;
@@ -40,20 +41,22 @@ namespace Mono.CSharp
                        }
                }
 
-               void tokenize_file (CompilationSourceFile file)
+               void tokenize_file (SourceFile sourceFile, ModuleContainer module)
                {
                        Stream input;
 
                        try {
-                               input = File.OpenRead (file.Name);
+                               input = File.OpenRead (sourceFile.Name);
                        } catch {
-                               Report.Error (2001, "Source file `" + file.Name + "' could not be found");
+                               Report.Error (2001, "Source file `" + sourceFile.Name + "' could not be found");
                                return;
                        }
 
                        using (input){
                                SeekableStreamReader reader = new SeekableStreamReader (input, ctx.Settings.Encoding);
-                               Tokenizer lexer = new Tokenizer (reader, file, ctx);
+                               var file = new CompilationSourceFile (module, sourceFile);
+
+                               Tokenizer lexer = new Tokenizer (reader, file);
                                int token, tokens = 0, errors = 0;
 
                                while ((token = lexer.token ()) != Token.EOF){
@@ -69,20 +72,21 @@ namespace Mono.CSharp
 
                void Parse (ModuleContainer module)
                {
-                       Location.Initialize (module.Compiler.SourceFiles);
-
                        bool tokenize_only = module.Compiler.Settings.TokenizeOnly;
                        var sources = module.Compiler.SourceFiles;
+
+                       Location.Initialize (sources);
+
                        for (int i = 0; i < sources.Count; ++i) {
                                if (tokenize_only) {
-                                       tokenize_file (sources[i]);
+                                       tokenize_file (sources[i], module);
                                } else {
                                        Parse (sources[i], module);
                                }
                        }
                }
 
-               void Parse (CompilationSourceFile file, ModuleContainer module)
+               public void Parse (SourceFile file, ModuleContainer module)
                {
                        Stream input;
 
@@ -95,6 +99,7 @@ namespace Mono.CSharp
 
                        // Check 'MZ' header
                        if (input.ReadByte () == 77 && input.ReadByte () == 90) {
+
                                Report.Error (2015, "Source file `{0}' is a binary file and not a text file", file.Name);
                                input.Close ();
                                return;
@@ -106,11 +111,12 @@ namespace Mono.CSharp
                        Parse (reader, file, module);
                        reader.Dispose ();
                        input.Close ();
-               }       
-               
-               public void Parse (SeekableStreamReader reader, CompilationSourceFile file, ModuleContainer module)
+               }
+
+               public void Parse (SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module)
                {
-                       file.NamespaceContainer = new NamespaceEntry (module, null, file, null);
+                       var file = new CompilationSourceFile (module, sourceFile);
+                       module.AddTypeContainer (file);
 
                        CSharpParser parser = new CSharpParser (reader, file);
                        parser.parse ();
@@ -120,16 +126,15 @@ namespace Mono.CSharp
                {
                        Location.InEmacs = Environment.GetEnvironmentVariable ("EMACS") == "t";
 
-                       var r = new Report (new ConsoleReportPrinter ());
-                       CommandLineParser cmd = new CommandLineParser (r);
+                       CommandLineParser cmd = new CommandLineParser (Console.Out);
                        var settings = cmd.ParseArguments (args);
-                       if (settings == null || r.Errors > 0)
+                       if (settings == null)
                                return 1;
 
                        if (cmd.HasBeenStopped)
                                return 0;
 
-                       Driver d = new Driver (new CompilerContext (settings, r));
+                       Driver d = new Driver (new CompilerContext (settings, new ConsoleReportPrinter ()));
 
                        if (d.Compile () && d.Report.Errors == 0) {
                                if (d.Report.Warnings > 0) {
@@ -262,7 +267,7 @@ namespace Mono.CSharp
                        // loaded assembly into compiled builder to be resolved
                        // correctly
                        tr.Start (TimeReporter.TimerType.CreateTypeTotal);
-                       module.CreateType ();
+                       module.CreateContainer ();
                        importer.AddCompiledAssembly (assembly);
                        tr.Stop (TimeReporter.TimerType.CreateTypeTotal);
 
@@ -291,18 +296,12 @@ namespace Mono.CSharp
                        if (!assembly.Create (AppDomain.CurrentDomain, AssemblyBuilderAccess.Save))
                                return false;
 
-                       module.CreateType ();
+                       module.CreateContainer ();
 
                        loader.LoadModules (assembly, module.GlobalRootNamespace);
 #endif
                        module.InitializePredefinedTypes ();
 
-                       tr.Start (TimeReporter.TimerType.UsingResolve);
-                       foreach (var source_file in ctx.SourceFiles) {
-                               source_file.NamespaceContainer.Resolve ();
-                       }
-                       tr.Stop (TimeReporter.TimerType.UsingResolve);
-
                        tr.Start (TimeReporter.TimerType.ModuleDefinitionTotal);
                        module.Define ();
                        tr.Stop (TimeReporter.TimerType.ModuleDefinitionTotal);
@@ -330,7 +329,7 @@ namespace Mono.CSharp
                        }
 
                        tr.Start (TimeReporter.TimerType.CloseTypes);
-                       module.CloseType ();
+                       module.CloseContainer ();
                        tr.Stop (TimeReporter.TimerType.CloseTypes);
 
                        tr.Start (TimeReporter.TimerType.Resouces);
@@ -359,13 +358,12 @@ namespace Mono.CSharp
                public static bool InvokeCompiler (string [] args, TextWriter error)
                {
                        try {
-                               var r = new Report (new StreamReportPrinter (error));
-                               CommandLineParser cmd = new CommandLineParser (r, error);
+                               CommandLineParser cmd = new CommandLineParser (error);
                                var setting = cmd.ParseArguments (args);
-                               if (setting == null || r.Errors > 0)
+                               if (setting == null)
                                        return false;
 
-                               var d = new Driver (new CompilerContext (setting, r));
+                               var d = new Driver (new CompilerContext (setting, new StreamReportPrinter (error)));
                                return d.Compile ();
                        } finally {
                                Reset ();
@@ -390,17 +388,12 @@ namespace Mono.CSharp
                
                public static void Reset (bool full_flag)
                {
-                       CSharpParser.yacc_verbose_flag = 0;
                        Location.Reset ();
                        
                        if (!full_flag)
                                return;
 
-                       AnonymousTypeClass.Reset ();
-                       AnonymousMethodBody.Reset ();
-                       AnonymousMethodStorey.Reset ();
                        SymbolWriter.Reset ();
-                       Switch.Reset ();
                        Linq.QueryBlock.TransparentParameter.Reset ();
                        TypeInfo.Reset ();
                }