131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Mono.Cecil;
 | |
| using Mono.Cecil.Cil;
 | |
| 
 | |
| namespace UnrealSharpWeaver;
 | |
| 
 | |
| [Serializable]
 | |
| class WeaverProcessError : Exception
 | |
| {
 | |
|     public string File { get; private set; } = string.Empty;
 | |
|     public int Line { get; private set; }
 | |
| 
 | |
|     public WeaverProcessError(string message) : base(message) 
 | |
|     {
 | |
|         Line = -1;
 | |
|     }
 | |
| 
 | |
|     public WeaverProcessError(string message, string file, int line) : base(message) 
 | |
|     {
 | |
|         File = file;
 | |
|         Line = line;
 | |
|     }
 | |
| 
 | |
|     public WeaverProcessError (string message, SequencePoint? point) : base(message)
 | |
|     {
 | |
|         if (point != null)
 | |
|         {
 | |
|             File = point.Document.Url;
 | |
|             Line = point.StartLine;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             Line = -1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public WeaverProcessError(string message, Exception? innerException) : base(message,innerException) 
 | |
|     {
 | |
|         Line = -1;
 | |
|     }
 | |
| 
 | |
|     public WeaverProcessError(string message, Exception? innerException, SequencePoint? point) : base(message, innerException)
 | |
|     {
 | |
|         if (point != null)
 | |
|         {
 | |
|             File = point.Document.Url;
 | |
|             Line = point.StartLine;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             Line = -1;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| static class ErrorEmitter
 | |
| {
 | |
|     public static void Error (WeaverProcessError error)
 | |
|     {
 | |
|         Error(error.GetType().Name, error.File, error.Line, error.Message);
 | |
|     }
 | |
| 
 | |
|     public static void Error(string code, string file, int line, string message)
 | |
|     {
 | |
|         if (!string.IsNullOrEmpty(file))
 | |
|         {
 | |
|             Console.Error.Write(file);
 | |
|             if (line != -1)
 | |
|             {
 | |
|                 Console.Error.Write("({0})",line);
 | |
|             }
 | |
| 
 | |
|             Console.Error.Write(" : ");
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             Console.Error.Write("UnrealSharpWeaver: ");
 | |
|         }
 | |
| 
 | |
|         Console.Error.WriteLine("error {0}: {1}",code,message);
 | |
|     }
 | |
| 
 | |
|     private static SequencePoint? ExtractFirstSequencePoint (MethodDefinition method)
 | |
|     {
 | |
|         return method?.DebugInformation?.SequencePoints.FirstOrDefault ();
 | |
|     }
 | |
| 
 | |
|     public static SequencePoint? GetSequencePointFromMemberDefinition(IMemberDefinition member)
 | |
|     {
 | |
|         if (member is PropertyDefinition propertyDefinition)
 | |
|         {
 | |
|             SequencePoint? point = ExtractFirstSequencePoint(propertyDefinition.GetMethod);
 | |
|             if (point != null)
 | |
|             {
 | |
|                 return point;
 | |
|             }
 | |
|             
 | |
|             point = ExtractFirstSequencePoint(propertyDefinition.SetMethod);
 | |
|             if (point != null)
 | |
|             {
 | |
|                 return point;
 | |
|             }
 | |
|             
 | |
|             return GetSequencePointFromMemberDefinition(member.DeclaringType);
 | |
|         }
 | |
| 
 | |
|         if (member is MethodDefinition definition)
 | |
|         {
 | |
|             SequencePoint? point = ExtractFirstSequencePoint(definition);
 | |
|             if (point != null)
 | |
|             {
 | |
|                 return point;
 | |
|             }
 | |
|             
 | |
|             return GetSequencePointFromMemberDefinition(definition.DeclaringType);
 | |
|         }
 | |
|         
 | |
|         if (member is TypeDefinition type)
 | |
|         {
 | |
|             foreach(MethodDefinition method in type.Methods)
 | |
|             {
 | |
|                 SequencePoint? point = ExtractFirstSequencePoint(method);
 | |
|                 if (point != null)
 | |
|                 {
 | |
|                     return point;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| } |