This commit is contained in:
CortexCore
2025-02-24 23:02:43 +08:00
parent 41715e4413
commit 8261a458e2
105 changed files with 2934 additions and 696 deletions

View File

@@ -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()); // 加载程序集