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;
 | 
						|
    }
 | 
						|
} |