2009-05-13 Jb Evain <jbevain@novell.com>
[mcs.git] / mcs / report.cs
blobcd938eeec63e2ef157b8cebe35c0e5353aeb402e
1 //
2 // report.cs: report errors and warnings.
3 //
4 // Author: Miguel de Icaza (miguel@ximian.com)
5 // Marek Safar (marek.safar@seznam.cz)
6 //
7 // Copyright 2001 Ximian, Inc. (http://www.ximian.com)
8 //
10 using System;
11 using System.IO;
12 using System.Text;
13 using System.Collections;
14 using System.Collections.Specialized;
15 using System.Diagnostics;
16 using System.Reflection;
17 using System.Reflection.Emit;
19 namespace Mono.CSharp {
21 /// <summary>
22 /// This class is used to report errors and warnings t te user.
23 /// </summary>
24 public class Report {
25 /// <summary>
26 /// Errors encountered so far
27 /// </summary>
28 static public int Errors;
30 /// <summary>
31 /// Warnings encountered so far
32 /// </summary>
33 static public int Warnings;
35 /// <summary>
36 /// Whether errors should be throw an exception
37 /// </summary>
38 static public bool Fatal;
40 /// <summary>
41 /// Whether warnings should be considered errors
42 /// </summary>
43 static public bool WarningsAreErrors;
44 static ArrayList warnings_as_error;
45 static ArrayList warnings_only;
47 /// <summary>
48 /// Whether to dump a stack trace on errors.
49 /// </summary>
50 static public bool Stacktrace;
52 static public TextWriter Stderr = Console.Error;
55 // If the 'expected' error code is reported then the
56 // compilation succeeds.
58 // Used for the test suite to excercise the error codes
60 static int expected_error = 0;
63 // Keeps track of the warnings that we are ignoring
65 public static Hashtable warning_ignore_table;
67 static Hashtable warning_regions_table;
70 // This is used to save/restore the error state. When the
71 // error stack contains elements, warnings and errors are not
72 // reported to the user. This is used by the Lambda expression
73 // support to compile the code with various parameter values.
74 // A stack because of `Report.Errors == errors;'
76 static Stack error_stack;
77 static Stack warning_stack;
78 static bool reporting_disabled;
80 static int warning_level;
82 /// <summary>
83 /// List of symbols related to reported error/warning. You have to fill it before error/warning is reported.
84 /// </summary>
85 static ArrayList extra_information = new ArrayList ();
87 //
88 // IF YOU ADD A NEW WARNING YOU HAVE TO ADD ITS ID HERE
90 public static readonly int[] AllWarnings = new int[] {
91 28, 67, 78,
92 105, 108, 109, 114, 162, 164, 168, 169, 183, 184, 197,
93 219, 251, 252, 253, 278, 282,
94 419, 420, 429, 436, 440, 465, 467, 469, 472,
95 612, 618, 626, 628, 642, 649, 652, 658, 659, 660, 661, 665, 672, 675,
96 809,
97 1030,
98 1522, 1570, 1571, 1572, 1573, 1574, 1580, 1581, 1584, 1587, 1589, 1590, 1591, 1592,
99 1616, 1633, 1634, 1635, 1685, 1690, 1691, 1692,
100 1717, 1718, 1720,
101 1901,
102 2002, 2023, 2029,
103 3000, 3001, 3002, 3003, 3005, 3006, 3007, 3008, 3009,
104 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019,
105 3021, 3022, 3023, 3026, 3027,
107 414, // Non ISO-1 warnings
108 #if GMCS_SOURCE
109 402, 458, 464, 693, 1058, 1700, 3024
110 #endif
113 static Report ()
115 // Just to be sure that binary search is working
116 Array.Sort (AllWarnings);
119 public static void Reset ()
121 Errors = Warnings = 0;
122 WarningsAreErrors = false;
123 warning_ignore_table = null;
124 warning_regions_table = null;
125 reporting_disabled = false;
126 error_stack = warning_stack = null;
127 warnings_as_error = null;
128 warnings_only = null;
131 public static void DisableReporting ()
133 if (error_stack == null)
134 error_stack = new Stack ();
135 error_stack.Push (Errors);
137 if (Warnings > 0) {
138 if (warning_stack == null)
139 warning_stack = new Stack ();
140 warning_stack.Push (Warnings);
143 reporting_disabled = true;
146 public static void EnableReporting ()
148 if (warning_stack != null && warning_stack.Count > 0)
149 Warnings = (int) warning_stack.Pop ();
150 else
151 Warnings = 0;
153 Errors = (int) error_stack.Pop ();
154 if (error_stack.Count == 0) {
155 reporting_disabled = false;
159 public static IMessageRecorder msg_recorder;
161 public static IMessageRecorder SetMessageRecorder (IMessageRecorder recorder)
163 IMessageRecorder previous = msg_recorder;
164 msg_recorder = recorder;
165 return previous;
168 public interface IMessageRecorder
170 bool IsEmpty { get; }
171 void EndSession ();
172 void AddMessage (AbstractMessage msg);
173 bool PrintMessages ();
177 // Default message recorder, it uses two types of message groups.
178 // Common messages: messages reported in all sessions.
179 // Merged messages: union of all messages in all sessions.
181 public struct MessageRecorder : IMessageRecorder
183 ArrayList session_messages;
185 // A collection of exactly same messages reported in all sessions
187 ArrayList common_messages;
190 // A collection of unique messages reported in all sessions
192 ArrayList merged_messages;
194 public void EndSession ()
196 if (session_messages == null)
197 return;
200 // Handles the first session
202 if (common_messages == null) {
203 common_messages = new ArrayList (session_messages);
204 merged_messages = session_messages;
205 session_messages = null;
206 return;
210 // Store common messages if any
212 for (int i = 0; i < common_messages.Count; ++i) {
213 AbstractMessage cmsg = (AbstractMessage) common_messages [i];
214 bool common_msg_found = false;
215 foreach (AbstractMessage msg in session_messages) {
216 if (cmsg.Equals (msg)) {
217 common_msg_found = true;
218 break;
222 if (!common_msg_found)
223 common_messages.RemoveAt (i);
227 // Merge session and previous messages
229 for (int i = 0; i < session_messages.Count; ++i) {
230 AbstractMessage msg = (AbstractMessage) session_messages [i];
231 bool msg_found = false;
232 for (int ii = 0; ii < merged_messages.Count; ++ii) {
233 if (msg.Equals (merged_messages [ii])) {
234 msg_found = true;
235 break;
239 if (!msg_found)
240 merged_messages.Add (msg);
244 public void AddMessage (AbstractMessage msg)
246 if (session_messages == null)
247 session_messages = new ArrayList ();
249 session_messages.Add (msg);
252 public bool IsEmpty {
253 get {
254 return merged_messages == null && common_messages == null;
259 // Prints collected messages, common messages have a priority
261 public bool PrintMessages ()
263 ArrayList messages_to_print = merged_messages;
264 if (common_messages != null && common_messages.Count > 0) {
265 messages_to_print = common_messages;
268 if (messages_to_print == null)
269 return false;
271 foreach (AbstractMessage msg in messages_to_print)
272 msg.Print ();
274 return true;
278 public abstract class AbstractMessage
280 readonly string[] extra_info;
281 protected readonly int code;
282 protected readonly Location location;
283 readonly string message;
285 protected AbstractMessage (int code, Location loc, string msg, ArrayList extraInfo)
287 this.code = code;
288 if (code < 0)
289 this.code = 8000 - code;
291 this.location = loc;
292 this.message = msg;
293 if (extraInfo.Count != 0) {
294 this.extra_info = (string[])extraInfo.ToArray (typeof (string));
298 protected AbstractMessage (AbstractMessage aMsg)
300 this.code = aMsg.code;
301 this.location = aMsg.location;
302 this.message = aMsg.message;
303 this.extra_info = aMsg.extra_info;
306 static void Check (int code)
308 if (code == expected_error) {
309 Environment.Exit (0);
313 public override bool Equals (object obj)
315 AbstractMessage msg = obj as AbstractMessage;
316 if (msg == null)
317 return false;
319 return code == msg.code && location.Equals (msg.location) && message == msg.message;
322 public override int GetHashCode ()
324 return code.GetHashCode ();
327 public abstract bool IsWarning { get; }
329 public abstract string MessageType { get; }
331 public virtual void Print ()
333 if (msg_recorder != null) {
335 // This line is useful when debugging messages recorder
337 // Console.WriteLine ("RECORDING: {0} {1} {2}", code, location, message);
338 msg_recorder.AddMessage (this);
339 return;
342 if (reporting_disabled)
343 return;
345 StringBuilder msg = new StringBuilder ();
346 if (!location.IsNull) {
347 msg.Append (location.ToString ());
348 msg.Append (" ");
350 msg.AppendFormat ("{0} CS{1:0000}: {2}", MessageType, code, message);
354 if (Stderr == Console.Error)
355 Stderr.WriteLine (ColorFormat (msg.ToString ()));
356 else
357 Stderr.WriteLine (msg.ToString ());
359 if (extra_info != null) {
360 foreach (string s in extra_info)
361 Stderr.WriteLine (s + MessageType + ")");
364 if (Stacktrace)
365 Console.WriteLine (FriendlyStackTrace (new StackTrace (true)));
367 if (Fatal && !IsWarning)
368 throw new Exception (message);
370 Check (code);
373 protected virtual string ColorFormat (string s)
375 return s;
379 sealed class WarningMessage : AbstractMessage
381 readonly int Level;
383 public WarningMessage (int code, int level, Location loc, string message, ArrayList extra_info)
384 : base (code, loc, message, extra_info)
386 Level = level;
389 public override bool IsWarning {
390 get { return true; }
393 bool IsEnabled ()
395 if (WarningLevel < Level)
396 return false;
398 if (warning_ignore_table != null) {
399 if (warning_ignore_table.Contains (code)) {
400 return false;
404 if (warning_regions_table == null || location.IsNull)
405 return true;
407 WarningRegions regions = (WarningRegions)warning_regions_table [location.Name];
408 if (regions == null)
409 return true;
411 return regions.IsWarningEnabled (code, location.Row);
414 bool IsErrorWarning {
415 get {
416 bool is_error = WarningsAreErrors;
418 // Check specific list
419 if (warnings_as_error != null)
420 is_error |= warnings_as_error.Contains (code);
422 // Ignore excluded warnings
423 if (warnings_only != null && warnings_only.Contains (code))
424 is_error = false;
426 return is_error;
430 public override void Print ()
432 if (!IsEnabled ())
433 return;
435 if (IsErrorWarning) {
436 new ErrorMessage (this).Print ();
437 return;
440 Warnings++;
441 base.Print ();
444 public override string MessageType {
445 get {
446 return "warning";
451 static int NameToCode (string s)
453 switch (s){
454 case "black":
455 return 0;
456 case "red":
457 return 1;
458 case "green":
459 return 2;
460 case "yellow":
461 return 3;
462 case "blue":
463 return 4;
464 case "magenta":
465 return 5;
466 case "cyan":
467 return 6;
468 case "grey":
469 case "white":
470 return 7;
472 return 7;
476 // maps a color name to its xterm color code
478 static string GetForeground (string s)
480 string highcode;
482 if (s.StartsWith ("bright")){
483 highcode = "1;";
484 s = s.Substring (6);
485 } else
486 highcode = "";
488 return "\x001b[" + highcode + (30 + NameToCode (s)).ToString () + "m";
491 static string GetBackground (string s)
493 return "\x001b[" + (40 + NameToCode (s)).ToString () + "m";
496 sealed class ErrorMessage : AbstractMessage
498 static string prefix, postfix;
500 static ErrorMessage ()
502 string term = Environment.GetEnvironmentVariable ("TERM");
503 bool xterm_colors = false;
505 switch (term){
506 case "xterm":
507 case "rxvt":
508 case "rxvt-unicode":
509 if (Environment.GetEnvironmentVariable ("COLORTERM") != null){
510 xterm_colors = true;
512 break;
514 case "xterm-color":
515 xterm_colors = true;
516 break;
518 if (!xterm_colors)
519 return;
521 if (!(UnixUtils.isatty (1) && UnixUtils.isatty (2)))
522 return;
524 string config = Environment.GetEnvironmentVariable ("MCS_COLORS");
525 if (config == null){
526 config = "errors=red";
527 //config = "brightwhite,red";
530 if (config == "disable")
531 return;
533 if (!config.StartsWith ("errors="))
534 return;
536 config = config.Substring (7);
538 int p = config.IndexOf (",");
539 if (p == -1)
540 prefix = GetForeground (config);
541 else
542 prefix = GetBackground (config.Substring (p+1)) + GetForeground (config.Substring (0, p));
543 postfix = "\x001b[0m";
546 public ErrorMessage (int code, Location loc, string message, ArrayList extraInfo)
547 : base (code, loc, message, extraInfo)
551 public ErrorMessage (AbstractMessage aMsg)
552 : base (aMsg)
556 protected override string ColorFormat (string s)
558 if (prefix != null)
559 return prefix + s + postfix;
560 return s;
563 public override void Print()
565 Errors++;
566 base.Print ();
569 public override bool IsWarning {
570 get { return false; }
573 public override string MessageType {
574 get {
575 return "error";
580 public static void FeatureIsNotAvailable (Location loc, string feature)
582 string version;
583 switch (RootContext.Version) {
584 case LanguageVersion.ISO_1:
585 version = "1.0";
586 break;
587 case LanguageVersion.ISO_2:
588 version = "2.0";
589 break;
590 case LanguageVersion.Default_MCS:
591 Report.Error (1644, loc, "Feature `{0}' is not available in Mono mcs1 compiler. Consider using the `gmcs' compiler instead",
592 feature);
593 return;
594 default:
595 throw new InternalErrorException ("Invalid feature version", RootContext.Version);
598 Report.Error (1644, loc,
599 "Feature `{0}' cannot be used because it is not part of the C# {1} language specification",
600 feature, version);
603 public static string FriendlyStackTrace (Exception e)
605 return FriendlyStackTrace (new StackTrace (e, true));
608 static string FriendlyStackTrace (StackTrace t)
610 StringBuilder sb = new StringBuilder ();
612 bool foundUserCode = false;
614 for (int i = 0; i < t.FrameCount; i++) {
615 StackFrame f = t.GetFrame (i);
616 MethodBase mb = f.GetMethod ();
618 if (!foundUserCode && mb.ReflectedType == typeof (Report))
619 continue;
621 foundUserCode = true;
623 sb.Append ("\tin ");
625 if (f.GetFileLineNumber () > 0)
626 sb.AppendFormat ("(at {0}:{1}) ", f.GetFileName (), f.GetFileLineNumber ());
628 sb.AppendFormat ("{0}.{1} (", mb.ReflectedType.Name, mb.Name);
630 bool first = true;
631 foreach (ParameterInfo pi in mb.GetParameters ()) {
632 if (!first)
633 sb.Append (", ");
634 first = false;
636 sb.Append (TypeManager.CSharpName (pi.ParameterType));
638 sb.Append (")\n");
641 return sb.ToString ();
644 public static void StackTrace ()
646 Console.WriteLine (FriendlyStackTrace (new StackTrace (true)));
649 static bool IsValidWarning (int code)
651 return Array.BinarySearch (AllWarnings, code) >= 0;
654 static public void RuntimeMissingSupport (Location loc, string feature)
656 Report.Error (-88, loc, "Your .NET Runtime does not support `{0}'. Please use the latest Mono runtime instead.", feature);
659 /// <summary>
660 /// In most error cases is very useful to have information about symbol that caused the error.
661 /// Call this method before you call Report.Error when it makes sense.
662 /// </summary>
663 static public void SymbolRelatedToPreviousError (Location loc, string symbol)
665 SymbolRelatedToPreviousError (loc.ToString (), symbol);
668 static public void SymbolRelatedToPreviousError (MemberInfo mi)
670 if (reporting_disabled)
671 return;
673 Type dt = TypeManager.DropGenericTypeArguments (mi.DeclaringType);
674 if (TypeManager.IsDelegateType (dt)) {
675 SymbolRelatedToPreviousError (dt);
676 return;
679 DeclSpace temp_ds = TypeManager.LookupDeclSpace (dt);
680 if (temp_ds == null) {
681 SymbolRelatedToPreviousError (dt.Assembly.Location, TypeManager.GetFullNameSignature (mi));
682 } else {
683 MethodBase mb = mi as MethodBase;
684 if (mb != null) {
685 mb = TypeManager.DropGenericMethodArguments (mb);
686 IMethodData md = TypeManager.GetMethod (mb);
687 if (md != null)
688 SymbolRelatedToPreviousError (md.Location, md.GetSignatureForError ());
690 return;
693 // FIXME: Completely wrong, it has to use FindMembers
694 MemberCore mc = temp_ds.GetDefinition (mi.Name);
695 if (mc != null)
696 SymbolRelatedToPreviousError (mc);
700 static public void SymbolRelatedToPreviousError (MemberCore mc)
702 SymbolRelatedToPreviousError (mc.Location, mc.GetSignatureForError ());
705 static public void SymbolRelatedToPreviousError (Type type)
707 if (reporting_disabled)
708 return;
710 type = TypeManager.DropGenericTypeArguments (type);
712 if (TypeManager.IsGenericParameter (type)) {
713 TypeParameter tp = TypeManager.LookupTypeParameter (type);
714 if (tp != null) {
715 SymbolRelatedToPreviousError (tp.Location, "");
716 return;
720 if (type is TypeBuilder) {
721 DeclSpace temp_ds = TypeManager.LookupDeclSpace (type);
722 SymbolRelatedToPreviousError (temp_ds.Location, TypeManager.CSharpName (type));
723 } else if (TypeManager.HasElementType (type)) {
724 SymbolRelatedToPreviousError (TypeManager.GetElementType (type));
725 } else {
726 SymbolRelatedToPreviousError (type.Assembly.Location, TypeManager.CSharpName (type));
730 static void SymbolRelatedToPreviousError (string loc, string symbol)
732 string msg = String.Format ("{0} (Location of the symbol related to previous ", loc);
733 if (extra_information.Contains (msg))
734 return;
736 extra_information.Add (msg);
739 public static void AddWarningAsError (string warningId)
741 int id;
742 try {
743 id = int.Parse (warningId);
744 } catch {
745 id = -1;
748 if (!CheckWarningCode (id, warningId, Location.Null))
749 return;
751 if (warnings_as_error == null)
752 warnings_as_error = new ArrayList ();
754 warnings_as_error.Add (id);
757 public static void RemoveWarningAsError (string warningId)
759 int id;
760 try {
761 id = int.Parse (warningId);
762 } catch {
763 id = -1;
766 if (!CheckWarningCode (id, warningId, Location.Null))
767 return;
769 if (warnings_only == null)
770 warnings_only = new ArrayList ();
772 warnings_only.Add (id);
775 public static bool CheckWarningCode (int code, Location loc)
777 return CheckWarningCode (code, code.ToString (), loc);
780 public static bool CheckWarningCode (int code, string scode, Location loc)
782 if (IsValidWarning (code))
783 return true;
785 Report.Warning (1691, 1, loc, "`{0}' is not a valid warning number", scode);
786 return false;
789 public static void ExtraInformation (Location loc, string msg)
791 extra_information.Add (String.Format ("{0} {1}", loc, msg));
794 public static WarningRegions RegisterWarningRegion (Location location)
796 if (warning_regions_table == null)
797 warning_regions_table = new Hashtable ();
799 WarningRegions regions = (WarningRegions)warning_regions_table [location.Name];
800 if (regions == null) {
801 regions = new WarningRegions ();
802 warning_regions_table.Add (location.Name, regions);
804 return regions;
807 static public void Warning (int code, int level, Location loc, string message)
809 WarningMessage w = new WarningMessage (code, level, loc, message, extra_information);
810 extra_information.Clear ();
811 w.Print ();
814 static public void Warning (int code, int level, Location loc, string format, string arg)
816 WarningMessage w = new WarningMessage (code, level, loc, String.Format (format, arg), extra_information);
817 extra_information.Clear ();
818 w.Print ();
821 static public void Warning (int code, int level, Location loc, string format, string arg1, string arg2)
823 WarningMessage w = new WarningMessage (code, level, loc, String.Format (format, arg1, arg2), extra_information);
824 extra_information.Clear ();
825 w.Print ();
828 static public void Warning (int code, int level, Location loc, string format, params object[] args)
830 WarningMessage w = new WarningMessage (code, level, loc, String.Format (format, args), extra_information);
831 extra_information.Clear ();
832 w.Print ();
835 static public void Warning (int code, int level, string message)
837 Warning (code, level, Location.Null, message);
840 static public void Warning (int code, int level, string format, string arg)
842 Warning (code, level, Location.Null, format, arg);
845 static public void Warning (int code, int level, string format, string arg1, string arg2)
847 Warning (code, level, Location.Null, format, arg1, arg2);
850 static public void Warning (int code, int level, string format, params string[] args)
852 Warning (code, level, Location.Null, String.Format (format, args));
855 static public void Error (int code, Location loc, string error)
857 new ErrorMessage (code, loc, error, extra_information).Print ();
858 extra_information.Clear ();
861 static public void Error (int code, Location loc, string format, string arg)
863 new ErrorMessage (code, loc, String.Format (format, arg), extra_information).Print ();
864 extra_information.Clear ();
867 static public void Error (int code, Location loc, string format, string arg1, string arg2)
869 new ErrorMessage (code, loc, String.Format (format, arg1, arg2), extra_information).Print ();
870 extra_information.Clear ();
873 static public void Error (int code, Location loc, string format, params object[] args)
875 Error (code, loc, String.Format (format, args));
878 static public void Error (int code, string error)
880 Error (code, Location.Null, error);
883 static public void Error (int code, string format, string arg)
885 Error (code, Location.Null, format, arg);
888 static public void Error (int code, string format, string arg1, string arg2)
890 Error (code, Location.Null, format, arg1, arg2);
893 static public void Error (int code, string format, params string[] args)
895 Error (code, Location.Null, String.Format (format, args));
898 static public void SetIgnoreWarning (int code)
900 if (warning_ignore_table == null)
901 warning_ignore_table = new Hashtable ();
903 warning_ignore_table [code] = true;
906 static public int ExpectedError {
907 set {
908 expected_error = value;
910 get {
911 return expected_error;
915 public static int WarningLevel {
916 get {
917 return warning_level;
919 set {
920 warning_level = value;
924 public static int DebugFlags = 0;
926 [Conditional ("MCS_DEBUG")]
927 static public void Debug (string message, params object[] args)
929 Debug (4, message, args);
932 [Conditional ("MCS_DEBUG")]
933 static public void Debug (int category, string message, params object[] args)
935 if ((category & DebugFlags) == 0)
936 return;
938 StringBuilder sb = new StringBuilder (message);
940 if ((args != null) && (args.Length > 0)) {
941 sb.Append (": ");
943 bool first = true;
944 foreach (object arg in args) {
945 if (first)
946 first = false;
947 else
948 sb.Append (", ");
949 if (arg == null)
950 sb.Append ("null");
951 else if (arg is ICollection)
952 sb.Append (PrintCollection ((ICollection) arg));
953 else
954 sb.Append (arg);
958 Console.WriteLine (sb.ToString ());
961 static public string PrintCollection (ICollection collection)
963 StringBuilder sb = new StringBuilder ();
965 sb.Append (collection.GetType ());
966 sb.Append ("(");
968 bool first = true;
969 foreach (object o in collection) {
970 if (first)
971 first = false;
972 else
973 sb.Append (", ");
974 sb.Append (o);
977 sb.Append (")");
978 return sb.ToString ();
982 public enum TimerType {
983 FindMembers = 0,
984 TcFindMembers = 1,
985 MemberLookup = 2,
986 CachedLookup = 3,
987 CacheInit = 4,
988 MiscTimer = 5,
989 CountTimers = 6
992 public enum CounterType {
993 FindMembers = 0,
994 MemberCache = 1,
995 MiscCounter = 2,
996 CountCounters = 3
999 public class Timer
1001 static DateTime[] timer_start;
1002 static TimeSpan[] timers;
1003 static long[] timer_counters;
1004 static long[] counters;
1006 static Timer ()
1008 timer_start = new DateTime [(int) TimerType.CountTimers];
1009 timers = new TimeSpan [(int) TimerType.CountTimers];
1010 timer_counters = new long [(int) TimerType.CountTimers];
1011 counters = new long [(int) CounterType.CountCounters];
1013 for (int i = 0; i < (int) TimerType.CountTimers; i++) {
1014 timer_start [i] = DateTime.Now;
1015 timers [i] = TimeSpan.Zero;
1019 [Conditional("TIMER")]
1020 static public void IncrementCounter (CounterType which)
1022 ++counters [(int) which];
1025 [Conditional("TIMER")]
1026 static public void StartTimer (TimerType which)
1028 timer_start [(int) which] = DateTime.Now;
1031 [Conditional("TIMER")]
1032 static public void StopTimer (TimerType which)
1034 timers [(int) which] += DateTime.Now - timer_start [(int) which];
1035 ++timer_counters [(int) which];
1038 [Conditional("TIMER")]
1039 static public void ShowTimers ()
1041 ShowTimer (TimerType.FindMembers, "- FindMembers timer");
1042 ShowTimer (TimerType.TcFindMembers, "- TypeContainer.FindMembers timer");
1043 ShowTimer (TimerType.MemberLookup, "- MemberLookup timer");
1044 ShowTimer (TimerType.CachedLookup, "- CachedLookup timer");
1045 ShowTimer (TimerType.CacheInit, "- Cache init");
1046 ShowTimer (TimerType.MiscTimer, "- Misc timer");
1048 ShowCounter (CounterType.FindMembers, "- Find members");
1049 ShowCounter (CounterType.MemberCache, "- Member cache");
1050 ShowCounter (CounterType.MiscCounter, "- Misc counter");
1053 static public void ShowCounter (CounterType which, string msg)
1055 Console.WriteLine ("{0} {1}", counters [(int) which], msg);
1058 static public void ShowTimer (TimerType which, string msg)
1060 Console.WriteLine (
1061 "[{0:00}:{1:000}] {2} (used {3} times)",
1062 (int) timers [(int) which].TotalSeconds,
1063 timers [(int) which].Milliseconds, msg,
1064 timer_counters [(int) which]);
1068 public class InternalErrorException : Exception {
1069 public InternalErrorException (MemberCore mc, Exception e)
1070 : base (mc.Location + " " + mc.GetSignatureForError (), e)
1074 public InternalErrorException ()
1075 : base ("Internal error")
1079 public InternalErrorException (string message)
1080 : base (message)
1084 public InternalErrorException (string message, params object[] args)
1085 : base (String.Format (message, args))
1088 public InternalErrorException (Exception e, Location loc)
1089 : base (loc.ToString (), e)
1094 /// <summary>
1095 /// Handles #pragma warning
1096 /// </summary>
1097 public class WarningRegions {
1099 abstract class PragmaCmd
1101 public int Line;
1103 protected PragmaCmd (int line)
1105 Line = line;
1108 public abstract bool IsEnabled (int code, bool previous);
1111 class Disable : PragmaCmd
1113 int code;
1114 public Disable (int line, int code)
1115 : base (line)
1117 this.code = code;
1120 public override bool IsEnabled (int code, bool previous)
1122 return this.code == code ? false : previous;
1126 class DisableAll : PragmaCmd
1128 public DisableAll (int line)
1129 : base (line) {}
1131 public override bool IsEnabled(int code, bool previous)
1133 return false;
1137 class Enable : PragmaCmd
1139 int code;
1140 public Enable (int line, int code)
1141 : base (line)
1143 this.code = code;
1146 public override bool IsEnabled(int code, bool previous)
1148 return this.code == code ? true : previous;
1152 class EnableAll : PragmaCmd
1154 public EnableAll (int line)
1155 : base (line) {}
1157 public override bool IsEnabled(int code, bool previous)
1159 return true;
1164 ArrayList regions = new ArrayList ();
1166 public void WarningDisable (int line)
1168 regions.Add (new DisableAll (line));
1171 public void WarningDisable (Location location, int code)
1173 if (Report.CheckWarningCode (code, location))
1174 regions.Add (new Disable (location.Row, code));
1177 public void WarningEnable (int line)
1179 regions.Add (new EnableAll (line));
1182 public void WarningEnable (Location location, int code)
1184 if (Report.CheckWarningCode (code, location))
1185 regions.Add (new Enable (location.Row, code));
1188 public bool IsWarningEnabled (int code, int src_line)
1190 bool result = true;
1191 foreach (PragmaCmd pragma in regions) {
1192 if (src_line < pragma.Line)
1193 break;
1195 result = pragma.IsEnabled (code, result);
1197 return result;