Implement and output field modifiers correctly
This commit is contained in:
@@ -52,14 +52,30 @@ namespace Il2CppInspector
|
|||||||
|
|
||||||
foreach (var field in type.DeclaredFields) {
|
foreach (var field in type.DeclaredFields) {
|
||||||
writer.Write("\t");
|
writer.Write("\t");
|
||||||
|
if (field.IsNotSerialized)
|
||||||
|
writer.Write("[NonSerialized]\t");
|
||||||
|
|
||||||
if (field.IsPrivate)
|
if (field.IsPrivate)
|
||||||
writer.Write("private ");
|
writer.Write("private ");
|
||||||
if (field.IsPublic)
|
if (field.IsPublic)
|
||||||
writer.Write("public ");
|
writer.Write("public ");
|
||||||
if (field.IsStatic)
|
if (field.IsFamily)
|
||||||
|
writer.Write("protected ");
|
||||||
|
if (field.IsAssembly)
|
||||||
|
writer.Write("internal ");
|
||||||
|
if (field.IsFamilyOrAssembly)
|
||||||
|
writer.Write("protected internal ");
|
||||||
|
if (field.IsFamilyAndAssembly)
|
||||||
|
writer.Write("[family and assembly] ");
|
||||||
|
if (field.IsLiteral)
|
||||||
|
writer.Write("const ");
|
||||||
|
// All const fields are also static by implication
|
||||||
|
else if (field.IsStatic)
|
||||||
writer.Write("static ");
|
writer.Write("static ");
|
||||||
if (field.IsInitOnly)
|
if (field.IsInitOnly)
|
||||||
writer.Write("readonly ");
|
writer.Write("readonly ");
|
||||||
|
if (field.IsPinvokeImpl)
|
||||||
|
writer.Write("extern ");
|
||||||
writer.Write($"{field.FieldType.CSharpName} {field.Name}");
|
writer.Write($"{field.FieldType.CSharpName} {field.Name}");
|
||||||
if (field.HasDefaultValue)
|
if (field.HasDefaultValue)
|
||||||
writer.Write($" = {field.DefaultValueString}");
|
writer.Write($" = {field.DefaultValueString}");
|
||||||
|
|||||||
@@ -30,25 +30,37 @@ namespace Il2CppInspector.Reflection {
|
|||||||
// https://docs.microsoft.com/en-us/dotnet/api/system.reflection.fieldinfo.isfamilyandassembly?view=netframework-4.7.1#System_Reflection_FieldInfo_IsFamilyAndAssembly
|
// https://docs.microsoft.com/en-us/dotnet/api/system.reflection.fieldinfo.isfamilyandassembly?view=netframework-4.7.1#System_Reflection_FieldInfo_IsFamilyAndAssembly
|
||||||
|
|
||||||
// True if the field is declared as internal
|
// True if the field is declared as internal
|
||||||
public bool IsAssembly => throw new NotImplementedException();
|
public bool IsAssembly => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Assembly;
|
||||||
|
|
||||||
// True if the field is declared as protected
|
// True if the field is declared as protected
|
||||||
public bool IsFamily => throw new NotImplementedException();
|
public bool IsFamily => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Family;
|
||||||
|
|
||||||
// True if the field is declared as 'protected private' (always false)
|
// True if the field is declared as 'protected private' (always false)
|
||||||
public bool IsFamilyAndAssembly => false;
|
public bool IsFamilyAndAssembly => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamANDAssem;
|
||||||
|
|
||||||
// True if the field is declared as protected public
|
// True if the field is declared as protected public
|
||||||
public bool IsFamilyOrAssembly => throw new NotImplementedException();
|
public bool IsFamilyOrAssembly => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamORAssem;
|
||||||
|
|
||||||
// True if the field is declared as readonly
|
// True if the field is declared as readonly
|
||||||
public bool IsInitOnly => (Attributes & FieldAttributes.InitOnly) == FieldAttributes.InitOnly;
|
public bool IsInitOnly => (Attributes & FieldAttributes.InitOnly) == FieldAttributes.InitOnly;
|
||||||
|
|
||||||
|
// True if the field is const
|
||||||
|
public bool IsLiteral => (Attributes & FieldAttributes.Literal) == FieldAttributes.Literal;
|
||||||
|
|
||||||
|
// True if the field has the NonSerialized attribute
|
||||||
|
public bool IsNotSerialized => (Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized;
|
||||||
|
|
||||||
|
// True if the field is extern
|
||||||
|
public bool IsPinvokeImpl => (Attributes & FieldAttributes.PinvokeImpl) == FieldAttributes.PinvokeImpl;
|
||||||
|
|
||||||
// True if the field is declared a private
|
// True if the field is declared a private
|
||||||
public bool IsPrivate => (Attributes & FieldAttributes.Private) == FieldAttributes.Private;
|
public bool IsPrivate => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Private;
|
||||||
|
|
||||||
// True if the field is declared as public
|
// True if the field is declared as public
|
||||||
public bool IsPublic => (Attributes & FieldAttributes.Public) == FieldAttributes.Public;
|
public bool IsPublic => (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public;
|
||||||
|
|
||||||
|
// True if the field has a special name
|
||||||
|
public bool IsSpecialName => (Attributes & FieldAttributes.SpecialName) == FieldAttributes.SpecialName;
|
||||||
|
|
||||||
// True if the field is declared as static
|
// True if the field is declared as static
|
||||||
public bool IsStatic => (Attributes & FieldAttributes.Static) == FieldAttributes.Static;
|
public bool IsStatic => (Attributes & FieldAttributes.Static) == FieldAttributes.Static;
|
||||||
@@ -63,15 +75,30 @@ namespace Il2CppInspector.Reflection {
|
|||||||
Name = pkg.Strings[Definition.nameIndex];
|
Name = pkg.Strings[Definition.nameIndex];
|
||||||
|
|
||||||
fieldType = pkg.TypeUsages[Definition.typeIndex];
|
fieldType = pkg.TypeUsages[Definition.typeIndex];
|
||||||
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_PRIVATE) == Il2CppConstants.FIELD_ATTRIBUTE_PRIVATE)
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_PRIVATE)
|
||||||
Attributes |= FieldAttributes.Private;
|
Attributes |= FieldAttributes.Private;
|
||||||
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_PUBLIC) == Il2CppConstants.FIELD_ATTRIBUTE_PUBLIC)
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_PUBLIC)
|
||||||
Attributes |= FieldAttributes.Public;
|
Attributes |= FieldAttributes.Public;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_FAM_AND_ASSEM)
|
||||||
|
Attributes |= FieldAttributes.FamANDAssem;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_ASSEMBLY)
|
||||||
|
Attributes |= FieldAttributes.Assembly;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_FAMILY)
|
||||||
|
Attributes |= FieldAttributes.Family;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == Il2CppConstants.FIELD_ATTRIBUTE_FAM_OR_ASSEM)
|
||||||
|
Attributes |= FieldAttributes.FamORAssem;
|
||||||
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_STATIC) == Il2CppConstants.FIELD_ATTRIBUTE_STATIC)
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_STATIC) == Il2CppConstants.FIELD_ATTRIBUTE_STATIC)
|
||||||
Attributes |= FieldAttributes.Static;
|
Attributes |= FieldAttributes.Static;
|
||||||
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_INIT_ONLY) ==
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_INIT_ONLY) == Il2CppConstants.FIELD_ATTRIBUTE_INIT_ONLY)
|
||||||
Il2CppConstants.FIELD_ATTRIBUTE_INIT_ONLY)
|
|
||||||
Attributes |= FieldAttributes.InitOnly;
|
Attributes |= FieldAttributes.InitOnly;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_LITERAL) == Il2CppConstants.FIELD_ATTRIBUTE_LITERAL)
|
||||||
|
Attributes |= FieldAttributes.Literal;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_NOT_SERIALIZED) == Il2CppConstants.FIELD_ATTRIBUTE_NOT_SERIALIZED)
|
||||||
|
Attributes |= FieldAttributes.NotSerialized;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_SPECIAL_NAME) == Il2CppConstants.FIELD_ATTRIBUTE_SPECIAL_NAME)
|
||||||
|
Attributes |= FieldAttributes.SpecialName;
|
||||||
|
if ((fieldType.attrs & Il2CppConstants.FIELD_ATTRIBUTE_PINVOKE_IMPL) == Il2CppConstants.FIELD_ATTRIBUTE_PINVOKE_IMPL)
|
||||||
|
Attributes |= FieldAttributes.PinvokeImpl;
|
||||||
|
|
||||||
// Default initialization value if present
|
// Default initialization value if present
|
||||||
if (pkg.FieldDefaultValue.TryGetValue(fieldIndex, out object variant)) {
|
if (pkg.FieldDefaultValue.TryGetValue(fieldIndex, out object variant)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user