// Generate the C structure for a value type, such as an enum or struct private (CppComplexType valueType, CppComplexType boxedType) GenerateValueFieldStruct(TypeInfo ti) { CppComplexType valueType, boxedType; string name = TypeNamer.GetName(ti); if (ti.IsEnum) { // Enums should be represented using enum syntax // They otherwise behave like value types var namer = CreateNamespace().MakeNamer <FieldInfo>((field) => field.Name.ToCIdentifier()); var underlyingType = AsCType(ti.GetEnumUnderlyingType()); valueType = types.Enum(underlyingType, name); foreach (var field in ti.DeclaredFields) { if (field.Name != "value__") { ((CppEnumType)valueType).AddField(namer.GetName(field), field.DefaultValue); } } boxedType = GenerateObjectStruct(name + "__Boxed", ti); boxedType.AddField("value", AsCType(ti)); } else { // This structure is passed by value, so it doesn't include Il2CppObject fields. valueType = types.Struct(name); GenerateFieldList(valueType, CreateNamespace(), ti); // Also generate the boxed form of the structure which includes the Il2CppObject header. boxedType = GenerateObjectStruct(name + "__Boxed", ti); boxedType.AddField("fields", AsCType(ti)); } return(valueType, boxedType); }
private SortedDictionary <int, List <CppField> > getFlattenedFields(CppComplexType t) { var flattened = new SortedDictionary <int, List <CppField> >(); foreach (var field in t.Fields.Values.SelectMany(f => f)) { if (field.Type is CppComplexType ct) { var baseOffset = field.Offset; var fields = ct.Flattened.Fields.Select(kl => new { Key = kl.Key + baseOffset, Value = kl.Value.Select(f => new CppField(f.Name, f.Type, f.BitfieldSize) { Offset = f.Offset + baseOffset }).ToList() }).ToDictionary(kv => kv.Key, kv => kv.Value); flattened = new SortedDictionary <int, List <CppField> >(flattened.Union(fields).ToDictionary(kv => kv.Key, kv => kv.Value)); } else { if (flattened.ContainsKey(field.Offset)) { flattened[field.Offset].Add(field); } else { flattened.Add(field.Offset, new List <CppField> { field }); } } } return(flattened); }
// Generate structure fields for each field of a given type private void GenerateFieldList(CppComplexType type, CppNamespace ns, TypeInfo ti) { var namer = ns.MakeNamer <FieldInfo>(field => field.Name.ToCIdentifier()); foreach (var field in ti.DeclaredFields) { if (field.IsLiteral || field.IsStatic) { continue; } type.AddField(namer.GetName(field), AsCType(field.FieldType)); } }
public FlattenedFieldsCollection(CppComplexType t) => Fields = getFlattenedFields(t);
public AppType(TypeInfo ilType, CppComplexType cppType, CppComplexType valueType = null, ulong cppClassPtr = 0xffffffff_ffffffff, ulong cppTypeRefPtr = 0xffffffff_ffffffff)