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