Output: Prepend fields, events, properties and parameter names using reserved C# keywords with @
This commit is contained in:
@@ -228,11 +228,11 @@ namespace Il2CppInspector
|
|||||||
if (field.GetCustomAttributes(FBAttribute).Any()) {
|
if (field.GetCustomAttributes(FBAttribute).Any()) {
|
||||||
if (!SuppressMetadata)
|
if (!SuppressMetadata)
|
||||||
sb.Append($"/* {field.GetCustomAttributes(FBAttribute)[0].VirtualAddress.ToAddressString()} */ ");
|
sb.Append($"/* {field.GetCustomAttributes(FBAttribute)[0].VirtualAddress.ToAddressString()} */ ");
|
||||||
sb.Append($"{field.FieldType.DeclaredFields[0].FieldType.GetScopedCSharpName(scope)} {field.Name}[0]"); // FixedElementField
|
sb.Append($"{field.FieldType.DeclaredFields[0].FieldType.GetScopedCSharpName(scope)} {field.CSharpSafeName}[0]"); // FixedElementField
|
||||||
}
|
}
|
||||||
// Regular fields
|
// Regular fields
|
||||||
else
|
else
|
||||||
sb.Append($"{field.FieldType.GetScopedCSharpName(scope)} {field.Name}");
|
sb.Append($"{field.FieldType.GetScopedCSharpName(scope)} {field.CSharpSafeName}");
|
||||||
if (field.HasDefaultValue)
|
if (field.HasDefaultValue)
|
||||||
sb.Append($" = {field.DefaultValueString}");
|
sb.Append($" = {field.DefaultValueString}");
|
||||||
sb.Append(";");
|
sb.Append(";");
|
||||||
@@ -308,7 +308,7 @@ namespace Il2CppInspector
|
|||||||
.ToString(scope, prefix + "\t", emitPointer: !SuppressMetadata, mustCompile: MustCompile));
|
.ToString(scope, prefix + "\t", emitPointer: !SuppressMetadata, mustCompile: MustCompile));
|
||||||
|
|
||||||
string modifiers = evt.AddMethod?.GetModifierString();
|
string modifiers = evt.AddMethod?.GetModifierString();
|
||||||
sb.Append($"{prefix}\t{modifiers}event {evt.EventHandlerType.GetScopedCSharpName(scope)} {evt.Name}");
|
sb.Append($"{prefix}\t{modifiers}event {evt.EventHandlerType.GetScopedCSharpName(scope)} {evt.CSharpSafeName}");
|
||||||
|
|
||||||
if (!MustCompile) {
|
if (!MustCompile) {
|
||||||
sb.Append(" {{\n");
|
sb.Append(" {{\n");
|
||||||
|
|||||||
40
Il2CppInspector/Reflection/Constants.cs
Normal file
40
Il2CppInspector/Reflection/Constants.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017-2019 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Il2CppInspector.Reflection
|
||||||
|
{
|
||||||
|
public static class Constants
|
||||||
|
{
|
||||||
|
// All C# reserved keywords
|
||||||
|
// From: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/
|
||||||
|
public static readonly string[] Keywords = {
|
||||||
|
"abstract", "as", "base", "bool",
|
||||||
|
"break", "byte", "case", "catch",
|
||||||
|
"char", "checked", "class", "const",
|
||||||
|
"continue", "decimal", "default", "delegate",
|
||||||
|
"do", "double", "else", "enum",
|
||||||
|
"event", "explicit", "extern", "false",
|
||||||
|
"finally", "fixed", "float", "for",
|
||||||
|
"foreach", "goto", "if", "implicit",
|
||||||
|
"in", "int", "interface", "internal",
|
||||||
|
"is", "lock", "long", "namespace",
|
||||||
|
"new", "null", "object", "operator",
|
||||||
|
"out", "override", "params", "private",
|
||||||
|
"protected", "public", "readonly", "ref",
|
||||||
|
"return", "sbyte", "sealed", "short",
|
||||||
|
"sizeof", "stackalloc", "static", "string",
|
||||||
|
"struct", "switch", "this", "throw",
|
||||||
|
"true", "try", "typeof", "uint",
|
||||||
|
"ulong", "unchecked", "unsafe", "ushort",
|
||||||
|
"using", /* "using static", */ "virtual", "void",
|
||||||
|
"volatile", "while"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,6 +29,9 @@ namespace Il2CppInspector.Reflection {
|
|||||||
// Name of the member
|
// Name of the member
|
||||||
public virtual string Name { get; protected set; }
|
public virtual string Name { get; protected set; }
|
||||||
|
|
||||||
|
// Name of the member with @ prepended if the name is a C# reserved keyword
|
||||||
|
public string CSharpSafeName => Constants.Keywords.Contains(Name) ? "@" + Name : Name;
|
||||||
|
|
||||||
// For top-level members in an assembly (ie. non-nested types)
|
// For top-level members in an assembly (ie. non-nested types)
|
||||||
protected MemberInfo(Assembly asm) => Assembly = asm;
|
protected MemberInfo(Assembly asm) => Assembly = asm;
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ namespace Il2CppInspector.Reflection
|
|||||||
|
|
||||||
// Name of parameter
|
// Name of parameter
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
public string CSharpSafeName => Constants.Keywords.Contains(Name) ? "@" + Name : Name;
|
||||||
|
|
||||||
// Type of this parameter
|
// Type of this parameter
|
||||||
private readonly int paramTypeUsage;
|
private readonly int paramTypeUsage;
|
||||||
@@ -106,7 +107,7 @@ namespace Il2CppInspector.Reflection
|
|||||||
public string GetParameterString(Scope usingScope, bool emitPointer = false, bool compileAttributes = false) => IsRetval? null :
|
public string GetParameterString(Scope usingScope, bool emitPointer = false, bool compileAttributes = false) => IsRetval? null :
|
||||||
(Position == 0 && DeclaringMethod.GetCustomAttributes("System.Runtime.CompilerServices.ExtensionAttribute").Any()? "this ":"")
|
(Position == 0 && DeclaringMethod.GetCustomAttributes("System.Runtime.CompilerServices.ExtensionAttribute").Any()? "this ":"")
|
||||||
+ $"{CustomAttributes.ToString(usingScope, inline: true, emitPointer: emitPointer, mustCompile: compileAttributes).Replace("[ParamArray]", "params")}"
|
+ $"{CustomAttributes.ToString(usingScope, inline: true, emitPointer: emitPointer, mustCompile: compileAttributes).Replace("[ParamArray]", "params")}"
|
||||||
+ $"{getCSharpSignatureString(usingScope)} {Name}"
|
+ $"{getCSharpSignatureString(usingScope)} {CSharpSafeName}"
|
||||||
+ (IsOptional? " = " + DefaultValue.ToCSharpValue(ParameterType, usingScope)
|
+ (IsOptional? " = " + DefaultValue.ToCSharpValue(ParameterType, usingScope)
|
||||||
+ (emitPointer && !(DefaultValue is null)? $" /* Metadata: 0x{(uint) DefaultValueMetadataAddress:X8} */" : "") : "");
|
+ (emitPointer && !(DefaultValue is null)? $" /* Metadata: 0x{(uint) DefaultValueMetadataAddress:X8} */" : "") : "");
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace Il2CppInspector.Reflection {
|
|||||||
|
|
||||||
public string CSharpName =>
|
public string CSharpName =>
|
||||||
// Explicit interface implementation
|
// Explicit interface implementation
|
||||||
Name.IndexOf('.') != -1? string.Join('.', Name.Split('.')[^2..])
|
CSharpSafeName.IndexOf('.') != -1? string.Join('.', CSharpSafeName.Split('.')[^2..])
|
||||||
|
|
||||||
// Regular method
|
// Regular method
|
||||||
: Name;
|
: Name;
|
||||||
|
|||||||
@@ -544,6 +544,10 @@ namespace Il2CppInspector.Reflection {
|
|||||||
for (var p = Definition.propertyStart; p < Definition.propertyStart + Definition.property_count; p++)
|
for (var p = Definition.propertyStart; p < Definition.propertyStart + Definition.property_count; p++)
|
||||||
DeclaredProperties.Add(new PropertyInfo(pkg, p, this));
|
DeclaredProperties.Add(new PropertyInfo(pkg, p, this));
|
||||||
|
|
||||||
|
// There are rare cases when properties are only given as methods in the metadata
|
||||||
|
// Find these and add them as properties
|
||||||
|
|
||||||
|
|
||||||
// Add all events
|
// Add all events
|
||||||
for (var e = Definition.eventStart; e < Definition.eventStart + Definition.event_count; e++)
|
for (var e = Definition.eventStart; e < Definition.eventStart + Definition.event_count; e++)
|
||||||
DeclaredEvents.Add(new EventInfo(pkg, e, this));
|
DeclaredEvents.Add(new EventInfo(pkg, e, this));
|
||||||
|
|||||||
Reference in New Issue
Block a user