2025-10-25 21:45:31 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Convention.RScript.Variable.CStyle
|
|
|
|
|
|
{
|
2025-10-27 10:50:36 +08:00
|
|
|
|
public class CScriptRScriptVariableGenerater : RScriptInjectVariableGenerater
|
2025-10-25 21:45:31 +08:00
|
|
|
|
{
|
2025-12-15 11:38:49 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取类型的友好显示名称,支持泛型、数组等复杂类型
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static string GetFriendlyName(Type type)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (type == null) return null;
|
|
|
|
|
|
|
|
|
|
|
|
// 处理泛型类型
|
|
|
|
|
|
if (type.IsGenericType)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 特殊处理可空类型(Nullable<T>)
|
|
|
|
|
|
if (type.IsNullable())
|
|
|
|
|
|
{
|
|
|
|
|
|
return $"{GetFriendlyName(type.GetGenericArguments()[0])}?";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
// 获取类型基础名称(移除 `1, `2 等后缀)
|
|
|
|
|
|
string baseName = type.Name.Contains('`') ? type.Name[..type.Name.IndexOf('`')] : type.Name;
|
|
|
|
|
|
sb.Append(baseName);
|
|
|
|
|
|
sb.Append('<');
|
|
|
|
|
|
|
|
|
|
|
|
// 递归处理泛型参数
|
|
|
|
|
|
Type[] args = type.GetGenericArguments();
|
|
|
|
|
|
for (int i = 0; i < args.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (i > 0) sb.Append(", ");
|
|
|
|
|
|
sb.Append(GetFriendlyName(args[i]));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sb.Append('>');
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理数组类型
|
|
|
|
|
|
if (type.IsArray)
|
|
|
|
|
|
{
|
|
|
|
|
|
string elementName = GetFriendlyName(type.GetElementType());
|
|
|
|
|
|
int rank = type.GetArrayRank();
|
|
|
|
|
|
return rank == 1 ? $"{elementName}[]" : $"{elementName}[{new string(',', rank - 1)}]";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理指针类型
|
|
|
|
|
|
if (type.IsPointer)
|
|
|
|
|
|
{
|
|
|
|
|
|
return $"{GetFriendlyName(type.GetElementType())}*";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理引用类型(ref/out 参数)
|
|
|
|
|
|
if (type.IsByRef)
|
|
|
|
|
|
{
|
|
|
|
|
|
return $"{GetFriendlyName(type.GetElementType())}&";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 普通类型直接返回名称
|
|
|
|
|
|
return type.Name;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 判断是否为可空类型
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static bool IsNullable(Type type)
|
|
|
|
|
|
{
|
|
|
|
|
|
return type.IsGenericType &&
|
|
|
|
|
|
type.GetGenericTypeDefinition() == typeof(Nullable<>);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-25 21:45:31 +08:00
|
|
|
|
public static string GetTypename(Type type)
|
|
|
|
|
|
{
|
2025-11-25 11:58:31 +08:00
|
|
|
|
if (type == typeof(int))
|
|
|
|
|
|
return "int";
|
|
|
|
|
|
if (type == typeof(float))
|
|
|
|
|
|
return "float";
|
|
|
|
|
|
if (type == typeof(double))
|
|
|
|
|
|
return "double";
|
|
|
|
|
|
if (type == typeof(bool))
|
|
|
|
|
|
return "bool";
|
|
|
|
|
|
if (type == typeof(void))
|
|
|
|
|
|
return "void";
|
2025-12-15 11:38:49 +08:00
|
|
|
|
return GetFriendlyName(type).Replace('`', '_');
|
2025-10-25 21:45:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-27 10:50:36 +08:00
|
|
|
|
private int m_layer = 0;
|
|
|
|
|
|
private int layer
|
|
|
|
|
|
{
|
|
|
|
|
|
get=>m_layer;
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
m_layer = value;
|
|
|
|
|
|
Prefix = new('\t', layer);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private string Prefix = "";
|
2025-10-25 21:45:31 +08:00
|
|
|
|
|
2025-10-27 10:50:36 +08:00
|
|
|
|
public CScriptRScriptVariableGenerater(Type targetType, Generater generater, Destorier destorier, string name) : base(targetType, generater, destorier, name)
|
2025-10-25 21:45:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteClassBodyEnter(Type currentType)
|
|
|
|
|
|
{
|
2025-10-27 10:50:36 +08:00
|
|
|
|
string result = $"{Prefix}{"{"}\n{Prefix}public:";
|
2025-10-25 21:45:31 +08:00
|
|
|
|
layer++;
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteClassBodyExit(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
layer--;
|
2025-10-27 10:50:36 +08:00
|
|
|
|
return $"{Prefix}{"};"}";
|
2025-10-25 21:45:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteClassHead(Type currentType)
|
|
|
|
|
|
{
|
2025-10-27 10:50:36 +08:00
|
|
|
|
string description = string.IsNullOrEmpty(this.description) ? "" : string.Join("", from item in this.description.Split('\n') where string.IsNullOrEmpty(item) == false select $"{Prefix}{item}\n");
|
2025-10-25 21:45:31 +08:00
|
|
|
|
string suffix = currentType.BaseType == typeof(object) ? string.Empty : $" : public {GetTypename(currentType.BaseType)}";
|
2025-10-27 10:50:36 +08:00
|
|
|
|
string result = $"{Prefix}\\*{description}*\\\n{Prefix}{Prefix}class {GetTypename(currentType)}{suffix}";
|
2025-10-25 21:45:31 +08:00
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteClassMethod(Type returnType, string methodName, string[] parameterNames, Type[] parameterTypes)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<string> parameters = new();
|
2025-10-27 10:50:36 +08:00
|
|
|
|
for (int i = 0, e = parameterNames.Length; i < e; i++)
|
2025-10-25 21:45:31 +08:00
|
|
|
|
{
|
|
|
|
|
|
parameters.Add($"{GetTypename(parameterTypes[i])} {parameterNames[i]}");
|
|
|
|
|
|
}
|
|
|
|
|
|
return $"{Prefix}{GetTypename(returnType)} {methodName}({string.Join(", ", parameters)});";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteClassTail(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteEnumBodyEnter(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
string result = $"{Prefix}{"{"}";
|
|
|
|
|
|
layer++;
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteEnumBodyExit(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
layer--;
|
2025-10-27 10:50:36 +08:00
|
|
|
|
return $"{Prefix}{"};"}";
|
2025-10-25 21:45:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteEnumHead(Type currentEnum)
|
|
|
|
|
|
{
|
|
|
|
|
|
return $"{Prefix}enum {GetTypename(currentEnum)}";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteEnumName(string enumName)
|
|
|
|
|
|
{
|
|
|
|
|
|
return $"{Prefix}{enumName},";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WriteEnumTail(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WritePageEnd(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override string WritePageHead(Type currentType)
|
|
|
|
|
|
{
|
2025-12-15 11:38:49 +08:00
|
|
|
|
if (currentType.BaseType != null)
|
|
|
|
|
|
return $"#include\"{GetFilename(currentType.BaseType)}\"";
|
|
|
|
|
|
return string.Empty;
|
2025-10-25 21:45:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override string GetFilename(Type currentType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetTypename(currentType);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|