IndieGame/client/Packages/com.unity.inputsystem@1.7.0/InputSystem/Utilities/CSharpCodeHelpers.cs

162 lines
5.2 KiB
C#
Raw Normal View History

2024-10-11 10:12:15 +08:00
using System;
using System.Linq;
using System.Reflection;
using System.Text;
////REVIEW: this seems like it should be #if UNITY_EDITOR
namespace UnityEngine.InputSystem.Utilities
{
internal static class CSharpCodeHelpers
{
public static bool IsProperIdentifier(string name)
{
if (string.IsNullOrEmpty(name))
return false;
if (char.IsDigit(name[0]))
return false;
for (var i = 0; i < name.Length; ++i)
{
var ch = name[i];
if (!char.IsLetterOrDigit(ch) && ch != '_')
return false;
}
return true;
}
public static bool IsEmptyOrProperIdentifier(string name)
{
if (string.IsNullOrEmpty(name))
return true;
return IsProperIdentifier(name);
}
public static bool IsEmptyOrProperNamespaceName(string name)
{
if (string.IsNullOrEmpty(name))
return true;
return name.Split('.').All(IsProperIdentifier);
}
////TODO: this one should add the @escape automatically so no other code has to worry
public static string MakeIdentifier(string name, string suffix = "")
{
if (string.IsNullOrEmpty(name))
throw new ArgumentNullException(nameof(name));
if (char.IsDigit(name[0]))
name = "_" + name;
// See if we have invalid characters in the name.
var nameHasInvalidCharacters = false;
for (var i = 0; i < name.Length; ++i)
{
var ch = name[i];
if (!char.IsLetterOrDigit(ch) && ch != '_')
{
nameHasInvalidCharacters = true;
break;
}
}
// If so, create a new string where we remove them.
if (nameHasInvalidCharacters)
{
var buffer = new StringBuilder();
for (var i = 0; i < name.Length; ++i)
{
var ch = name[i];
if (char.IsLetterOrDigit(ch) || ch == '_')
buffer.Append(ch);
}
name = buffer.ToString();
}
return name + suffix;
}
public static string MakeTypeName(string name, string suffix = "")
{
var symbolName = MakeIdentifier(name, suffix);
if (char.IsLower(symbolName[0]))
symbolName = char.ToUpper(symbolName[0]) + symbolName.Substring(1);
return symbolName;
}
#if UNITY_EDITOR
public static string MakeAutoGeneratedCodeHeader(string toolName, string toolVersion, string sourceFileName = null)
{
return
"//------------------------------------------------------------------------------\n"
+ "// <auto-generated>\n"
+ $"// This code was auto-generated by {toolName}\n"
+ $"// version {toolVersion}\n"
+ (string.IsNullOrEmpty(sourceFileName) ? "" : $"// from {sourceFileName}\n")
+ "//\n"
+ "// Changes to this file may cause incorrect behavior and will be lost if\n"
+ "// the code is regenerated.\n"
+ "// </auto-generated>\n"
+ "//------------------------------------------------------------------------------\n";
}
public static string ToLiteral(this object value)
{
if (value == null)
return "null";
var type = value.GetType();
if (type == typeof(bool))
{
if ((bool)value)
return "true";
return "false";
}
if (type == typeof(char))
return $"'\\u{(int)(char)value:X2}'";
if (type == typeof(float))
return value + "f";
if (type == typeof(uint) || type == typeof(ulong))
return value + "u";
if (type == typeof(long))
return value + "l";
if (type.IsEnum)
{
var enumValue = type.GetEnumName(value);
if (!string.IsNullOrEmpty(enumValue))
return $"{type.FullName.Replace("+", ".")}.{enumValue}";
}
return value.ToString();
}
public static string GetInitializersForPublicPrimitiveTypeFields(this object instance)
{
var type = instance.GetType();
var defaults = Activator.CreateInstance(type);
var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public);
var fieldInits = string.Join(", ",
fields.Where(f => (f.FieldType.IsPrimitive || f.FieldType.IsEnum) && !f.GetValue(instance).Equals(f.GetValue(defaults)))
.Select(f => $"{f.Name} = {f.GetValue(instance).ToLiteral()}"));
if (string.IsNullOrEmpty(fieldInits))
return "()";
return " { " + fieldInits + " }";
}
#endif
}
}