private void AddFields(Il2CppTypeDefinition typeDef, StructInfo structInfo, Il2CppGenericContext context) { if (typeDef.field_count > 0) { var fieldEnd = typeDef.fieldStart + typeDef.field_count; for (var i = typeDef.fieldStart; i < fieldEnd; ++i) { var fieldDef = metadata.fieldDefs[i]; var fieldType = il2Cpp.types[fieldDef.typeIndex]; if ((fieldType.attrs & FIELD_ATTRIBUTE_LITERAL) != 0) { continue; } var structFieldInfo = new StructFieldInfo(); structFieldInfo.FieldTypeName = ParseType(fieldType, context); var fieldName = FixName(metadata.GetStringFromIndex(fieldDef.nameIndex)); structFieldInfo.FieldName = fieldName; structFieldInfo.IsValueType = IsValueType(fieldType, context); if ((fieldType.attrs & FIELD_ATTRIBUTE_STATIC) != 0) { structInfo.StaticFields.Add(structFieldInfo); } else { structInfo.Fields.Add(structFieldInfo); } } } }
private void AddFields(Il2CppTypeDefinition typeDef, List <StructFieldInfo> fields, List <StructFieldInfo> staticFields, Il2CppGenericContext context, bool isParent) { if (!typeDef.IsValueType && !typeDef.IsEnum) { if (typeDef.parentIndex >= 0) { var parent = il2Cpp.types[typeDef.parentIndex]; ParseParent(parent, out var parentDef, out var parentContext); if (parentDef != null) { AddFields(parentDef, fields, staticFields, parentContext, true); } } } if (typeDef.field_count > 0) { var fieldEnd = typeDef.fieldStart + typeDef.field_count; for (var i = typeDef.fieldStart; i < fieldEnd; ++i) { var fieldDef = metadata.fieldDefs[i]; var fieldType = il2Cpp.types[fieldDef.typeIndex]; if ((fieldType.attrs & FIELD_ATTRIBUTE_LITERAL) != 0) { continue; } var structFieldInfo = new StructFieldInfo(); structFieldInfo.FieldTypeName = ParseType(fieldType, context); var fieldName = FixName(metadata.GetStringFromIndex(fieldDef.nameIndex)); structFieldInfo.FieldName = fieldName; structFieldInfo.IsValueType = IsValueType(fieldType, context); if ((fieldType.attrs & FIELD_ATTRIBUTE_STATIC) != 0) { if (!isParent) { staticFields.Add(structFieldInfo); } } else { if (isParent) { var access = fieldType.attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK; if (access == FIELD_ATTRIBUTE_PRIVATE) { structFieldInfo.FieldName = $"{FixName(metadata.GetStringFromIndex(typeDef.nameIndex))}_{fieldName}"; } } if (fields.Any(x => x.FieldName == structFieldInfo.FieldName)) { structFieldInfo.FieldName = $"{FixName(metadata.GetStringFromIndex(typeDef.nameIndex))}_{structFieldInfo.FieldName}"; } fields.Add(structFieldInfo); } } } }