Merge pull request #3705 from BrzVlad/fix-sgen-internal-alloc
[mono.git] / mcs / ilasm / Report.cs
index 08fa3f039e6ce4f8ecd9e2c784eb7a9e60aab8e1..a7ebafe8afd6eca44c3de0af540220f57491c2a3 100644 (file)
@@ -13,49 +13,78 @@ using System.IO;
 
 namespace Mono.ILASM {
 
-        public class Report {
+        public abstract class Report {
 
-                private int error_count;
-                private int mark_count;
-                private bool quiet;
+                private static int error_count;
+                private static int mark_count;
+                private static bool quiet;
+                /* Current file being processed */
+                private static string file_path;
 
-                public Report () : this (false)
+                static Report ()
                 {
-
+                        error_count = 0;
+                       quiet = false;
                 }
 
-                public Report (bool quiet)
-                {
-                        this.error_count = 0;
-                        this.quiet = quiet;
+                public static int ErrorCount {
+                        get { return error_count; }
                 }
 
-                public int ErrorCount {
-                        get { return error_count; }
+               public static bool Quiet {
+                       get { return quiet; }
+                       set { quiet = value; }
+               }
+
+                public static string FilePath {
+                        get { return file_path; }
+                        set { file_path = value; }
                 }
 
-                public void AssembleFile (string file, string listing,
+                public static void AssembleFile (string file, string listing,
                                           string target, string output)
                 {
+                        if (quiet)
+                                return;
                         Console.WriteLine ("Assembling '{0}' , {1}, to {2} --> '{3}'", file,
                                            GetListing (listing), target, output);
                         Console.WriteLine ();
                 }
 
-                public void Error (string message)
+                public static void Error (string message)
+                {
+                        Error (null, message);
+                }
+
+                public static void Error (Location location, string message)
                 {
                         error_count++;
-                        Console.WriteLine (message);
+                        throw new ILAsmException (file_path, location, message);
+                }
+                
+                public static void Warning (string message)
+                {
+                        Warning (null, message);
+                }
+
+                public static void Warning (Location location, string message)
+                {
+                        string location_str = " : ";
+                        if (location != null)
+                                location_str = " (" + location.line + ", " + location.column + ") : ";
+
+                        Console.Error.WriteLine (String.Format ("{0}{1}Warning -- {2}",
+                                (file_path != null ? file_path : ""), location_str, message));
                 }
 
-                public void Message (string message)
+                public static void Message (string message)
                 {
                         if (quiet)
                                 return;
                         Console.WriteLine (message);
                 }
                 
-                private string GetListing (string listing)
+                private static string GetListing (string listing)
                 {
                         if (listing == null)
                                 return "no listing file";
@@ -64,5 +93,66 @@ namespace Mono.ILASM {
 
         }
 
+        public class ILAsmException : Exception {
+
+                string message;
+                string file_path;
+                Location location;
+                
+                public ILAsmException (string file_path, Location location, string message)
+                {
+                        this.file_path = file_path;
+                        this.location = location;
+                        this.message = message;
+                }
+
+                public ILAsmException (Location location, string message)
+                        : this (null, location, message)
+                {
+                }
+
+                public ILAsmException (string message)
+                        : this (null, null, message)
+                {
+                }
+
+                public override string Message {
+                        get { return message; }
+                }
+
+                public Location Location {
+                        get { return location; }
+                        set { location = value; }
+                }
+
+                public string FilePath {
+                        get { return file_path; }
+                        set { file_path = value; }
+                }
+
+                public override string ToString ()
+                {
+                        string location_str = " : ";
+                        if (location != null)
+                                location_str = " (" + location.line + ", " + location.column + ") : ";
+
+                        return String.Format ("{0}{1}Error : {2}",
+                                (file_path != null ? file_path : ""), location_str, message);
+                }
+
+        }
+
+        public class InternalErrorException : Exception {
+                public InternalErrorException ()
+                        : base ("Internal error")
+                {
+                }
+
+                public InternalErrorException (string message)
+                        : base (message)
+                {
+                }
+        }
+
 }