1
This commit is contained in:
@@ -110,6 +110,11 @@ namespace BITKit
|
||||
{
|
||||
codeBuilder.AppendLine(GenerateMethod(method));
|
||||
}
|
||||
|
||||
foreach (var eventInfo in type.GetEvents())
|
||||
{
|
||||
codeBuilder.AppendLine(GenerateEvent(eventInfo));
|
||||
}
|
||||
|
||||
codeBuilder.AppendLine(AfterGenerate(type));
|
||||
|
||||
@@ -136,25 +141,32 @@ namespace BITKit
|
||||
public virtual string GenerateMethod(MethodInfo methodInfo)
|
||||
{
|
||||
var codeBuilder = new StringBuilder();
|
||||
HashSet<MethodInfo> propertyMethods = new();
|
||||
HashSet<MethodInfo> ignoreMethods = new();
|
||||
|
||||
foreach (var eventInfo in methodInfo.DeclaringType!.GetEvents())
|
||||
{
|
||||
ignoreMethods.Add(eventInfo.AddMethod);
|
||||
ignoreMethods.Add(eventInfo.RemoveMethod);
|
||||
}
|
||||
|
||||
foreach (var propertyInfo in methodInfo.DeclaringType!.GetProperties())
|
||||
{
|
||||
if (propertyInfo.GetMethod is not null)
|
||||
{
|
||||
propertyMethods.Add(propertyInfo.GetMethod);
|
||||
ignoreMethods.Add(propertyInfo.GetMethod);
|
||||
}
|
||||
|
||||
if (propertyInfo.SetMethod is not null)
|
||||
{
|
||||
propertyMethods.Add(propertyInfo.SetMethod);
|
||||
ignoreMethods.Add(propertyInfo.SetMethod);
|
||||
}
|
||||
}
|
||||
|
||||
if(propertyMethods.Contains(methodInfo))return string.Empty;
|
||||
|
||||
if(ignoreMethods.Contains(methodInfo))return string.Empty;
|
||||
string methodName = methodInfo.Name;
|
||||
string parameters = string.Join(", ", methodInfo.GetParameters()
|
||||
.Select(p => $"{CSharpName(p.ParameterType)} {p.Name}"));
|
||||
.Select(p => $"{(p.IsOut?"out":string.Empty)} {CSharpName(p.IsOut?p.ParameterType.GetElementType():p.ParameterType)} {p.Name}"));
|
||||
|
||||
var isAwaitable = methodInfo.ReturnType.GetMethod(nameof(Task.GetAwaiter)) != null;
|
||||
|
||||
@@ -194,7 +206,17 @@ namespace BITKit
|
||||
|
||||
public virtual string GenerateMethodContext(MethodInfo methodInfo)
|
||||
{
|
||||
return methodInfo.ReturnType == typeof(void) ? string.Empty : $"return default;";
|
||||
var codeBuilder = new StringBuilder();
|
||||
foreach (var parameterInfo in methodInfo.GetParameters())
|
||||
{
|
||||
if (parameterInfo.IsOut)
|
||||
{
|
||||
codeBuilder.AppendLine($"{parameterInfo.Name} = default;");
|
||||
}
|
||||
}
|
||||
|
||||
codeBuilder.AppendLine(methodInfo.ReturnType == typeof(void) ? string.Empty : $"return default;");
|
||||
return codeBuilder.ToString();
|
||||
}
|
||||
|
||||
public virtual string GenerateField(FieldInfo fieldInfo)
|
||||
@@ -209,7 +231,7 @@ namespace BITKit
|
||||
|
||||
public virtual string GenerateEvent(EventInfo eventInfo)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
return $"public event {CSharpName(eventInfo.EventHandlerType)} {eventInfo.Name};";
|
||||
}
|
||||
}
|
||||
#if UNITY_5_3_OR_NEWER
|
||||
@@ -257,7 +279,6 @@ namespace BITKit
|
||||
{
|
||||
result.Add(fieldInfo.FieldType.Assembly);
|
||||
}
|
||||
|
||||
foreach (var propertyInfo in type.GetProperties())
|
||||
{
|
||||
result.Add(propertyInfo.PropertyType.Assembly);
|
||||
@@ -269,6 +290,10 @@ namespace BITKit
|
||||
{
|
||||
result.Add(argument.Assembly);
|
||||
}
|
||||
foreach (var parameterInfo in methodInfo.GetParameters())
|
||||
{
|
||||
result.Add(parameterInfo.ParameterType.Assembly);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -295,7 +320,24 @@ namespace BITKit
|
||||
using var ms = new MemoryStream();
|
||||
var result = script.GetCompilation().Emit(ms);
|
||||
|
||||
if (!result.Success) throw new Exception(string.Join("\n",result.Diagnostics));
|
||||
if (!result.Success)
|
||||
{
|
||||
var report = new StringBuilder();
|
||||
report.AppendLine(code);
|
||||
|
||||
foreach (var reference in script.GetCompilation().References)
|
||||
{
|
||||
report.AppendLine("Assembly referenced:" + reference.Display);
|
||||
}
|
||||
|
||||
foreach (var diagnostic in result.Diagnostics)
|
||||
{
|
||||
report.AppendLine(diagnostic.ToString());
|
||||
}
|
||||
|
||||
|
||||
throw new Exception(report.ToString());
|
||||
}
|
||||
ms.Seek(0, SeekOrigin.Begin);
|
||||
var assembly = Assembly.Load(ms.ToArray()); // 加载程序集
|
||||
|
||||
|
Reference in New Issue
Block a user