Maze / Library /PackageCache /com.unity.inputsystem@1.6.1 /InputSystem /Utilities /CSharpCodeHelpers.cs
| 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; | |
| } | |
| 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 + " }"; | |
| } | |
| } | |
| } | |