2008-11-05 Francisco Figueiredo Jr. <francisco@npgsql.org>
[mono.git] / mcs / mcs / report.cs
index c329d03f84c1b83ed449bed35555051b32c173fb..8122aa13dfb75603ceb91e5c4abbe3815455dcd0 100644 (file)
@@ -4,7 +4,7 @@
 // Author: Miguel de Icaza (miguel@ximian.com)
 //         Marek Safar (marek.safar@seznam.cz)         
 //
-// (C) 2001 Ximian, Inc. (http://www.ximian.com)
+// Copyright 2001 Ximian, Inc. (http://www.ximian.com)
 //
 
 using System;
@@ -99,9 +99,13 @@ namespace Mono.CSharp {
                        1717, 1718, 1720,
                        1901,
                        2002, 2023, 2029,
-                       3005, 3012, 3018, 3019, 3021, 3022, 3023, 3026, 3027,
+                       3000, 3001, 3002, 3003, 3005, 3006, 3007, 3008, 3009,
+                       3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019,
+                       3021, 3022, 3023, 3026, 3027,
+                       
+                       414,    // Non ISO-1 warnings
 #if GMCS_SOURCE
-                       402, 414, 693, 1058, 1700, 3024
+                       402, 458, 464, 693, 1058, 1700, 3024
 #endif
                };
 
@@ -118,6 +122,7 @@ namespace Mono.CSharp {
                        warning_ignore_table = null;
                        warning_regions_table = null;
                        reporting_disabled = false;
+                       error_stack = warning_stack = null;
                }
 
                public static void DisableReporting ()
@@ -137,8 +142,10 @@ namespace Mono.CSharp {
 
                public static void EnableReporting ()
                {
-                       if (warning_stack != null)
+                       if (warning_stack != null && warning_stack.Count > 0)
                                Warnings = (int) warning_stack.Pop ();
+                       else
+                               Warnings = 0;
 
                        Errors = (int) error_stack.Pop ();
                        if (error_stack.Count == 0) {
@@ -157,6 +164,7 @@ namespace Mono.CSharp {
 
                public interface IMessageRecorder
                {
+                       bool IsEmpty { get; }
                        void EndSession ();
                        void AddMessage (AbstractMessage msg);
                        bool PrintMessages ();
@@ -238,6 +246,12 @@ namespace Mono.CSharp {
                                session_messages.Add (msg);
                        }
 
+                       public bool IsEmpty {
+                               get {
+                                       return merged_messages == null && common_messages == null;
+                               }
+                       }
+
                        //
                        // Prints collected messages, common messages have a priority
                        //
@@ -355,7 +369,7 @@ namespace Mono.CSharp {
                                Check (code);
                        }
 
-                       public virtual string ColorFormat (string s)
+                       protected virtual string ColorFormat (string s)
                        {
                                return s;
                        }
@@ -465,7 +479,7 @@ namespace Mono.CSharp {
                sealed class ErrorMessage : AbstractMessage
                {
                        static string prefix, postfix;
-                       
+
                        static ErrorMessage ()
                        {
                                string term = Environment.GetEnvironmentVariable ("TERM");
@@ -484,6 +498,12 @@ namespace Mono.CSharp {
                                        xterm_colors = true;
                                        break;
                                }
+                               if (!xterm_colors)
+                                       return;
+
+                               if (!(UnixUtils.isatty (1) && UnixUtils.isatty (2)))
+                                       return;
+                               
                                string config = Environment.GetEnvironmentVariable ("MCS_COLORS");
                                if (config == null){
                                        config = "errors=red";
@@ -498,9 +518,6 @@ namespace Mono.CSharp {
 
                                config = config.Substring (7);
                                
-                               if (!xterm_colors)
-                                       return;
-
                                int p = config.IndexOf (",");
                                if (p == -1)
                                        prefix = GetForeground (config);
@@ -519,7 +536,7 @@ namespace Mono.CSharp {
                        {
                        }
 
-                       public override string ColorFormat (string s)
+                       protected override string ColorFormat (string s)
                        {
                                if (prefix != null)
                                        return prefix + s + postfix;
@@ -554,7 +571,7 @@ namespace Mono.CSharp {
                                version = "2.0";
                                break;
                        case LanguageVersion.Default_MCS:
-                               Report.Error (1644, loc, "Feature `{0}' is not available in Mono mcs compiler. Consider using Mono gmcs compiler instead",
+                               Report.Error (1644, loc, "Feature `{0}' is not available in Mono mcs1 compiler. Consider using the `gmcs' compiler instead",
                                              feature);
                                return;
                        default:
@@ -654,8 +671,10 @@ namespace Mono.CSharp {
                                        return;
                                }
 
+                               // FIXME: Completely wrong, it has to use FindMembers
                                MemberCore mc = temp_ds.GetDefinition (mi.Name);
-                               SymbolRelatedToPreviousError (mc);
+                               if (mc != null)
+                                       SymbolRelatedToPreviousError (mc);
                        }
                }
 
@@ -682,7 +701,7 @@ namespace Mono.CSharp {
                        if (type is TypeBuilder) {
                                DeclSpace temp_ds = TypeManager.LookupDeclSpace (type);
                                SymbolRelatedToPreviousError (temp_ds.Location, TypeManager.CSharpName (type));
-                       } else if (type.HasElementType) {
+                       } else if (TypeManager.HasElementType (type)) {
                                SymbolRelatedToPreviousError (type.GetElementType ());
                        } else {
                                SymbolRelatedToPreviousError (type.Assembly.Location, TypeManager.CSharpName (type));
@@ -691,7 +710,11 @@ namespace Mono.CSharp {
 
                static void SymbolRelatedToPreviousError (string loc, string symbol)
                {
-                       extra_information.Add (String.Format ("{0} (Location of the symbol related to previous ", loc));
+                       string msg = String.Format ("{0} (Location of the symbol related to previous ", loc);
+                       if (extra_information.Contains (msg))
+                               return;
+
+                       extra_information.Add (msg);
                }
 
                public static void ExtraInformation (Location loc, string msg)