Cache only resolved types not expression to report correct error location. Fixes...
[mono.git] / mcs / mcs / report.cs
index b27b9c8a08e5f36f0f4a348d308a8cd3732e7e94..009007b0d529ca45d1cc0de85de61a5cb4f1dab8 100644 (file)
@@ -550,6 +550,8 @@ namespace Mono.CSharp {
        //
        public abstract class ReportPrinter
        {
+               protected HashSet<ITypeDefinition> reported_missing_definitions;
+
                #region Properties
 
                public int ErrorsCount { get; protected set; }
@@ -605,6 +607,22 @@ namespace Mono.CSharp {
                        }
                }
 
+               //
+               // Tracks reported missing types. It needs to be session specific 
+               // because we can run in probing mode
+               //
+               public bool MissingTypeReported (ITypeDefinition typeDefinition)
+               {
+                       if (reported_missing_definitions == null)
+                               reported_missing_definitions = new HashSet<ITypeDefinition> ();
+
+                       if (reported_missing_definitions.Contains (typeDefinition))
+                               return true;
+
+                       reported_missing_definitions.Add (typeDefinition);
+                       return false;
+               }
+
                public void Reset ()
                {
                        // HACK: Temporary hack for broken repl flow
@@ -649,7 +667,7 @@ namespace Mono.CSharp {
                        //
                        // This line is useful when debugging recorded messages
                        //
-                       // Console.WriteLine ("RECORDING: {0}", msg.ToString ());
+                       // Console.WriteLine ("RECORDING: {0}", msg.Text);
 
                        if (session_messages == null)
                                session_messages = new List<AbstractMessage> ();
@@ -735,6 +753,11 @@ namespace Mono.CSharp {
                                error_msg |= !msg.IsWarning;
                        }
 
+                       if (reported_missing_definitions != null) {
+                               foreach (var missing in reported_missing_definitions)
+                                       dest.MissingTypeReported (missing);
+                       }
+
                        return error_msg;
                }
        }
@@ -931,7 +954,7 @@ namespace Mono.CSharp {
                        if (timers == null)
                                return;
 
-                       Dictionary<TimerType, string> timer_names = new Dictionary<TimerType,string> () {
+                       Dictionary<TimerType, string> timer_names = new Dictionary<TimerType,string> {
                                { TimerType.ParseTotal, "Parsing source files" },
                                { TimerType.AssemblyBuilderSetup, "Assembly builder setup" },
                                { TimerType.CreateTypeTotal, "Compiled types created" },
@@ -1030,7 +1053,7 @@ namespace Mono.CSharp {
 
                        public override bool IsEnabled (int code, bool previous)
                        {
-                               return this.code == code ? false : previous;
+                               return this.code != code && previous;
                        }
                }
 
@@ -1056,7 +1079,7 @@ namespace Mono.CSharp {
 
                        public override bool IsEnabled(int code, bool previous)
                        {
-                               return this.code == code ? true : previous;
+                               return this.code == code || previous;
                        }
                }