Exemplo n.º 1
0
        public string Generate(UnityTypeDetails details, string package)
        {
            qualifiedNamespace = package;
            this.details       = details;

            return(TransformText());
        }
 private void GenerateUpdateMethod(TypeBlock typeBlock, UnityTypeDetails details)
 {
     typeBlock.Method($"public override void Update({details.FullyQualifiedName} data)", mb =>
     {
         mb.TextList(details.FieldDetails.Select(fd => fieldTypeHandler.ToUiFieldUpdate(fd, "data")));
     });
 }
Exemplo n.º 3
0
        public string Generate(UnityTypeDetails details)
        {
            this.details = details;
            nestedTypes  = details.ChildTypes;
            nestedEnums  = details.ChildEnums;

            return(TransformText());
        }
 private void GenerateConstructor(TypeBlock typeBlock, UnityTypeDetails details)
 {
     typeBlock.Method($"public {details.Name}Renderer(string label) : base(label)", mb =>
     {
         foreach (var field in details.FieldDetails)
         {
             mb.TextList(fieldTypeHandler.ToFieldInitialisation(field, "Container"));
         }
     });
 }
Exemplo n.º 5
0
        private static TypeBlock GenerateSerializationClass(UnityTypeDetails typeDetails)
        {
            var fieldDetails = typeDetails.FieldDetails;

            return(Scope.Type("public static class Serialization", s =>
            {
                s.Method($"public static void Serialize({typeDetails.CapitalisedName} instance, global::Improbable.Worker.CInterop.SchemaObject obj)",
                         serializeMethod =>
                {
                    if (typeDetails.HasSerializationOverride)
                    {
                        serializeMethod.CustomScope(() => new[]
                        {
                            typeDetails.SerializationOverride.GetSerializationString("instance", "obj")
                        });
                    }
                    else
                    {
                        foreach (var fieldDetail in fieldDetails)
                        {
                            serializeMethod.CustomScope(() => new[]
                            {
                                fieldDetail.GetSerializationString($"instance.{fieldDetail.PascalCaseName}", "obj", 0)
                            });
                        }
                    }
                });

                s.Method($"public static {typeDetails.CapitalisedName} Deserialize(global::Improbable.Worker.CInterop.SchemaObject obj)",
                         deserializeMethod =>
                {
                    if (typeDetails.HasSerializationOverride)
                    {
                        var deserializeString = typeDetails.SerializationOverride.GetDeserializeString("obj");
                        deserializeMethod.Return(deserializeString);
                    }
                    else
                    {
                        deserializeMethod.Line($"var instance = new {typeDetails.CapitalisedName}();");

                        foreach (var fieldDetail in fieldDetails)
                        {
                            deserializeMethod.CustomScope(() => new[]
                            {
                                fieldDetail.GetDeserializeString($"instance.{fieldDetail.PascalCaseName}", "obj", 0)
                            });
                        }

                        deserializeMethod.Return("instance");
                    }
                });
            }));
        }
Exemplo n.º 6
0
        public static TypeBlock Generate(UnityTypeDetails details, string typeNamespace)
        {
            var nestedTypes = details.ChildTypes;
            var nestedEnums = details.ChildEnums;

            var typeDetails      = details;
            var fieldDetailsList = details.FieldDetails;
            var hasPartial       = PartialDatabase.TryGetPartial(typeDetails.GetPartialResourceTypeName(), out var partial);

            Logger.Trace($"Generating {typeNamespace}.{typeDetails.CapitalisedName} struct.");

            return(Scope.AnnotatedType("global::System.Serializable",
                                       $"public struct {typeDetails.CapitalisedName}", s =>
            {
                if (fieldDetailsList.Count > 0)
                {
                    s.Line(fieldDetailsList
                           .Select(fd => $"public {fd.Type} {fd.PascalCaseName};")
                           .ToList());

                    var constructorArgs = GetConstructorArgs(fieldDetailsList);

                    s.Method($"public {typeDetails.CapitalisedName}({constructorArgs})", m =>
                    {
                        m.Line(sb =>
                        {
                            foreach (var fd in fieldDetailsList)
                            {
                                sb.AppendLine($"{fd.PascalCaseName} = {fd.CamelCaseName};");
                            }
                        });
                    });
                }

                if (hasPartial)
                {
                    s.Line(partial);
                }

                s.Type(GenerateSerializationClass(typeDetails));

                foreach (var nestedType in nestedTypes)
                {
                    s.Type(Generate(nestedType, $"{typeNamespace}.{typeDetails.CapitalisedName}"));
                }

                foreach (var nestedEnum in nestedEnums)
                {
                    s.Enum(UnityEnumContent.Generate(nestedEnum, $"{typeNamespace}.{typeDetails.CapitalisedName}"));
                }
            }));
        }
        private TypeBlock GenerateType(UnityTypeDetails details)
        {
            return(Scope.Type($"public class {details.Name}Renderer : SchemaTypeVisualElement<{details.FullyQualifiedName}>",
                              type =>
            {
                type.TextList(details.FieldDetails.Select(fieldTypeHandler.ToFieldDeclaration));

                GenerateConstructor(type, details);
                GenerateUpdateMethod(type, details);

                foreach (var nestedType in details.ChildTypes)
                {
                    type.Type(GenerateType(nestedType));
                }
            }));
        }
        public CodeWriter Generate(UnityTypeDetails details)
        {
            return(CodeWriter.Populate(cgw =>
            {
                cgw.UsingDirectives(
                    "UnityEngine.UIElements",
                    "UnityEditor.UIElements",
                    "Improbable.Gdk.Debug.WorkerInspector.Codegen"
                    );

                cgw.Namespace(details.Namespace, ns =>
                {
                    ns.Type(GenerateType(details));
                });
            }));
        }
Exemplo n.º 9
0
        public static CodeWriter Generate(UnityTypeDetails details)
        {
            return(CodeWriter.Populate(cgw =>
            {
                cgw.UsingDirectives(
                    "System.Linq",
                    "Improbable.Gdk.Core",
                    "UnityEngine"
                    );

                cgw.Namespace(details.Namespace, ns =>
                {
                    ns.Type(UnityTypeContent.Generate(details, details.Namespace));
                });
            }));
        }
Exemplo n.º 10
0
        public static string Generate(UnityTypeDetails details, string package)
        {
            var qualifiedNamespace = package;

            return(CodeWriter.Populate(cgw =>
            {
                cgw.UsingDirectives(
                    "System.Linq",
                    "Improbable.Gdk.Core",
                    "UnityEngine"
                    );

                cgw.Namespace(qualifiedNamespace, ns =>
                {
                    ns.Type(UnityTypeContent.Generate(details, qualifiedNamespace));
                });
            }).Format());
        }
Exemplo n.º 11
0
        public DetailsStore(SchemaBundle bundle, List <string> serializationOverrides)
        {
            this.bundle = bundle;

            var overrideMap = serializationOverrides.Select(@override =>
            {
                var parts = @override.Split(";");

                if (parts.Length != 2)
                {
                    throw new ArgumentException($"Serialization override malformed: {@override}");
                }

                return(parts[0], parts[1]);
            }).ToDictionary(pair => pair.Item1, pair => pair.Item2);

            PopulateBlittableMaps();
            BlittableSet = ImmutableHashSet.CreateRange(blittableMap.Where(kv => kv.Value).Select(kv => kv.Key));

            var enums      = new Dictionary <string, UnityEnumDetails>();
            var types      = new Dictionary <string, UnityTypeDetails>();
            var components = new Dictionary <string, UnityComponentDetails>();

            foreach (var file in bundle.SchemaFiles)
            {
                foreach (var enumm in file.Enums)
                {
                    enums.Add(enumm.QualifiedName, new UnityEnumDetails(file.Package.Name, enumm));
                }

                foreach (var type in file.Types)
                {
                    var typeDetails = new UnityTypeDetails(file.Package.Name, type);

                    if (overrideMap.TryGetValue(typeDetails.FullyQualifiedTypeName, out var staticClassFqn))
                    {
                        typeDetails.SerializationOverride = new SerializationOverride(staticClassFqn);
                    }

                    types.Add(type.QualifiedName, typeDetails);
                }

                foreach (var component in file.Components)
                {
                    components.Add(component.QualifiedName, new UnityComponentDetails(file.Package.Name, component, this));
                }
            }

            Enums      = new ReadOnlyDictionary <string, UnityEnumDetails>(enums);
            Types      = new ReadOnlyDictionary <string, UnityTypeDetails>(types);
            Components = new ReadOnlyDictionary <string, UnityComponentDetails>(components);

            SchemaFiles = bundle.SchemaFiles
                          .Select(file => file.CanonicalPath)
                          .ToList().AsReadOnly();

            foreach (var kv in Types)
            {
                kv.Value.PopulateFields(this);
                kv.Value.PopulateChildren(this);
            }

            foreach (var kv in Components)
            {
                kv.Value.PopulateFields(this);
            }

            RemoveRecursiveOptions();
        }