// 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);
        }
Exemple #2
0
            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));
            }
        }
Exemple #4
0
 public FlattenedFieldsCollection(CppComplexType t) => Fields = getFlattenedFields(t);
Exemple #5
0
 public AppType(TypeInfo ilType, CppComplexType cppType, CppComplexType valueType = null,
                ulong cppClassPtr = 0xffffffff_ffffffff, ulong cppTypeRefPtr = 0xffffffff_ffffffff)