Skip to content
This repository was archived by the owner on Jan 18, 2022. It is now read-only.

Commit 8330867

Browse files
author
Jamie Brynes
authored
Render primitive schema data & enums in the worker inspector (#1387)
1 parent 2cd7b9b commit 8330867

File tree

8 files changed

+222
-42
lines changed

8 files changed

+222
-42
lines changed

workers/unity/Packages/io.improbable.gdk.debug/.codegen/Source/Generators/DebugExtensions/ComponentVisualElementGenerator.cs

+163
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
14
using Improbable.Gdk.CodeGeneration.CodeWriter;
25
using Improbable.Gdk.CodeGeneration.CodeWriter.Scopes;
6+
using Improbable.Gdk.CodeGeneration.Model;
37
using Improbable.Gdk.CodeGeneration.Model.Details;
8+
using Improbable.Gdk.CodeGeneration.Utils;
9+
using ValueType = Improbable.Gdk.CodeGeneration.Model.ValueType;
410

511
namespace Improbable.Gdk.CodeGenerator
612
{
@@ -13,6 +19,7 @@ public static CodeWriter Generate(UnityComponentDetails details)
1319
cgw.UsingDirectives(
1420
"Unity.Entities",
1521
"UnityEngine.UIElements",
22+
"UnityEditor.UIElements",
1623
"Improbable.Gdk.Debug.WorkerInspector.Codegen"
1724
);
1825

@@ -22,28 +29,184 @@ public static CodeWriter Generate(UnityComponentDetails details)
2229
{
2330
type.Line($"public override ComponentType ComponentType {{ get; }} = ComponentType.ReadOnly<{details.Name}.Component>();");
2431

32+
type.TextList(details.FieldDetails.Select(ToFieldDeclaration));
33+
2534
GenerateConstructor(type, details);
2635
GenerateUpdateMethod(type, details);
2736
});
2837
});
2938
});
3039
}
3140

41+
private static string ToFieldDeclaration(UnityFieldDetails fieldDetails)
42+
{
43+
switch (fieldDetails.FieldType)
44+
{
45+
case SingularFieldType singularFieldType:
46+
var uiType = GetUiFieldType(singularFieldType.ContainedType);
47+
48+
if (uiType == "")
49+
{
50+
// TODO: Eliminate this case.
51+
return "";
52+
}
53+
54+
return $"private readonly {uiType} {fieldDetails.CamelCaseName}Field;";
55+
default:
56+
// TODO: Lists, maps, and options
57+
return "";
58+
}
59+
}
60+
3261
private static void GenerateConstructor(TypeBlock typeBlock, UnityComponentDetails details)
3362
{
3463
typeBlock.Method($"public {details.Name}Renderer() : base()", mb =>
3564
{
3665
mb.Line($"ComponentFoldout.text = \"{details.Name}\";");
3766
mb.Line($"AuthoritativeToggle.SetEnabled(false);");
67+
68+
foreach (var field in details.FieldDetails)
69+
{
70+
mb.TextList(ToFieldInitialisation(field));
71+
}
3872
});
3973
}
4074

75+
private static IEnumerable<string> ToFieldInitialisation(UnityFieldDetails fieldDetails)
76+
{
77+
switch (fieldDetails.FieldType)
78+
{
79+
case SingularFieldType singularFieldType:
80+
81+
var uiType = GetUiFieldType(singularFieldType.ContainedType);
82+
83+
if (uiType == "")
84+
{
85+
// TODO: Eliminate this case.
86+
yield break;
87+
}
88+
89+
var humanReadableName = Formatting.SnakeCaseToHumanReadable(fieldDetails.Name);
90+
yield return $"{fieldDetails.CamelCaseName}Field = new {uiType}(\"{humanReadableName}\");";
91+
yield return $"{fieldDetails.CamelCaseName}Field.SetEnabled(false);";
92+
93+
if (singularFieldType.ContainedType.Category == ValueType.Enum)
94+
{
95+
yield return $"{fieldDetails.CamelCaseName}Field.Init(default({fieldDetails.Type}));";
96+
}
97+
98+
yield return $"ComponentFoldout.Add({fieldDetails.CamelCaseName}Field);";
99+
break;
100+
default:
101+
// TODO: Lists, maps, and options
102+
yield break;
103+
}
104+
}
105+
41106
private static void GenerateUpdateMethod(TypeBlock typeBlock, UnityComponentDetails details)
42107
{
43108
typeBlock.Method("public override void Update(EntityManager manager, Entity entity)", mb =>
44109
{
45110
mb.Line($"AuthoritativeToggle.value = manager.HasComponent<{details.Name}.HasAuthority>(entity);");
111+
mb.Line($"var component = manager.GetComponentData<{details.Name}.Component>(entity);");
112+
113+
mb.TextList(TextList.New(details.FieldDetails.Select(ToUiFieldUpdate)));
46114
});
47115
}
116+
117+
private static string ToUiFieldUpdate(UnityFieldDetails fieldDetails)
118+
{
119+
switch (fieldDetails.FieldType)
120+
{
121+
case SingularFieldType singularFieldType:
122+
switch (singularFieldType.ContainedType.Category)
123+
{
124+
case ValueType.Enum:
125+
return $"{fieldDetails.CamelCaseName}Field.value = component.{fieldDetails.PascalCaseName};";
126+
case ValueType.Primitive:
127+
var primitiveType = singularFieldType.ContainedType.PrimitiveType.Value;
128+
129+
switch (primitiveType)
130+
{
131+
case PrimitiveType.Int32:
132+
case PrimitiveType.Int64:
133+
case PrimitiveType.Uint32:
134+
case PrimitiveType.Uint64:
135+
case PrimitiveType.Sint32:
136+
case PrimitiveType.Sint64:
137+
case PrimitiveType.Fixed32:
138+
case PrimitiveType.Fixed64:
139+
case PrimitiveType.Sfixed32:
140+
case PrimitiveType.Sfixed64:
141+
case PrimitiveType.Float:
142+
case PrimitiveType.Double:
143+
case PrimitiveType.String:
144+
case PrimitiveType.EntityId:
145+
return $"{fieldDetails.CamelCaseName}Field.value = component.{fieldDetails.PascalCaseName}.ToString();";
146+
case PrimitiveType.Bytes:
147+
return $"{fieldDetails.CamelCaseName}Field.value = global::System.Text.Encoding.Default.GetString(component.{fieldDetails.PascalCaseName});";
148+
case PrimitiveType.Bool:
149+
return $"{fieldDetails.CamelCaseName}Field.value = component.{fieldDetails.PascalCaseName};";
150+
break;
151+
case PrimitiveType.Entity:
152+
// TODO: Entity type.
153+
return "";
154+
case PrimitiveType.Invalid:
155+
throw new ArgumentException("Unknown primitive type encountered");
156+
default:
157+
throw new ArgumentOutOfRangeException();
158+
}
159+
case ValueType.Type:
160+
// TODO: User defined types.
161+
return "";
162+
default:
163+
throw new ArgumentOutOfRangeException();
164+
}
165+
default:
166+
// TODO: Lists, maps, and options
167+
return "";
168+
}
169+
}
170+
171+
private static string GetUiFieldType(ContainedType type)
172+
{
173+
switch (type.Category)
174+
{
175+
case ValueType.Enum:
176+
return "EnumField";
177+
case ValueType.Primitive:
178+
switch (type.PrimitiveType.Value)
179+
{
180+
case PrimitiveType.Int32:
181+
case PrimitiveType.Int64:
182+
case PrimitiveType.Uint32:
183+
case PrimitiveType.Uint64:
184+
case PrimitiveType.Sint32:
185+
case PrimitiveType.Sint64:
186+
case PrimitiveType.Fixed32:
187+
case PrimitiveType.Fixed64:
188+
case PrimitiveType.Sfixed32:
189+
case PrimitiveType.Sfixed64:
190+
case PrimitiveType.Float:
191+
case PrimitiveType.Double:
192+
case PrimitiveType.String:
193+
case PrimitiveType.EntityId:
194+
case PrimitiveType.Bytes:
195+
return "TextField";
196+
case PrimitiveType.Bool:
197+
return "Toggle";
198+
case PrimitiveType.Entity:
199+
return "";
200+
case PrimitiveType.Invalid:
201+
throw new ArgumentException("Unknown primitive type encountered.");
202+
default:
203+
throw new ArgumentOutOfRangeException();
204+
}
205+
case ValueType.Type:
206+
return "";
207+
default:
208+
throw new ArgumentOutOfRangeException();
209+
}
210+
}
48211
}
49212
}

workers/unity/Packages/io.improbable.gdk.debug/.codegen/Source/Generators/DebugExtensions/DebugAssemblyGenerator.cs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public static string Generate()
77
return @"{
88
""name"": ""Improbable.Gdk.Generated.Debug"",
99
""references"": [
10+
""Improbable.Gdk.Core"",
1011
""Improbable.Gdk.Generated"",
1112
""Improbable.Gdk.Debug.WorkerInspector.Codegen"",
1213
""Unity.Entities""

workers/unity/Packages/io.improbable.gdk.tools/.CodeGenTemplate/CodeGenerationLib/CodeWriter/Scopes/Abstract/ScopeBody.cs

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public void TextList(TextList textList)
2929
Add(textList);
3030
}
3131

32+
public void TextList(IEnumerable<string> text)
33+
{
34+
Add(CodeGeneration.CodeWriter.TextList.New(text));
35+
}
36+
3237
public void Line(string snippet)
3338
{
3439
Add(new Text(snippet));

workers/unity/Packages/io.improbable.gdk.tools/.CodeGenTemplate/CodeGenerationLib/CodeWriter/Scopes/TypeBlock.cs

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public void TextList(TextList textList)
2929
Add(textList);
3030
}
3131

32+
public void TextList(IEnumerable<string> text)
33+
{
34+
Add(CodeGeneration.CodeWriter.TextList.New(text));
35+
}
36+
3237
public void Line(string snippet)
3338
{
3439
Add(new Text(snippet));

workers/unity/Packages/io.improbable.gdk.tools/.CodeGenTemplate/CodeGenerationLib/Model/Details/FieldTypes/ContainedType.cs

+20-20
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,27 @@ namespace Improbable.Gdk.CodeGeneration.Model.Details
66
public class ContainedType
77
{
88
public readonly string FqnType;
9-
private readonly ValueType category;
10-
private PrimitiveType? primitiveType;
9+
public readonly ValueType Category;
10+
public readonly PrimitiveType? PrimitiveType;
1111

1212
public ContainedType(TypeReference innerType)
1313
{
1414
switch (innerType.ValueTypeSelector)
1515
{
1616
case ValueType.Enum:
17-
category = ValueType.Enum;
17+
Category = ValueType.Enum;
1818
FqnType = DetailsUtils.GetCapitalisedFqnTypename(innerType.Enum);
19-
primitiveType = null;
19+
PrimitiveType = null;
2020
break;
2121
case ValueType.Primitive:
22-
category = ValueType.Primitive;
22+
Category = ValueType.Primitive;
2323
FqnType = UnityTypeMappings.SchemaTypeToUnityType[innerType.Primitive];
24-
primitiveType = innerType.Primitive;
24+
PrimitiveType = innerType.Primitive;
2525
break;
2626
case ValueType.Type:
27-
category = ValueType.Type;
27+
Category = ValueType.Type;
2828
FqnType = DetailsUtils.GetCapitalisedFqnTypename(innerType.Type);
29-
primitiveType = null;
29+
PrimitiveType = null;
3030
break;
3131
default:
3232
throw new ArgumentOutOfRangeException("Malformed inner type.");
@@ -35,64 +35,64 @@ public ContainedType(TypeReference innerType)
3535

3636
public string GetSerializationStatement(string instance, string schemaObject, uint fieldNumber)
3737
{
38-
switch (category)
38+
switch (Category)
3939
{
4040
case ValueType.Primitive:
41-
return $"{schemaObject}.{SchemaFunctionMappings.AddSchemaFunctionFromType(primitiveType.Value)}({fieldNumber}, {instance});";
41+
return $"{schemaObject}.{SchemaFunctionMappings.AddSchemaFunctionFromType(PrimitiveType.Value)}({fieldNumber}, {instance});";
4242
case ValueType.Enum:
4343
return $"{schemaObject}.AddEnum({fieldNumber}, (uint) {instance});";
4444
case ValueType.Type:
4545
return $"{FqnType}.Serialization.Serialize({instance}, {schemaObject}.AddObject({fieldNumber}));";
4646
default:
47-
throw new ArgumentOutOfRangeException(nameof(category), "Unknown type category encountered.");
47+
throw new ArgumentOutOfRangeException(nameof(Category), "Unknown type category encountered.");
4848
}
4949
}
5050

5151
public string GetDeserializationExpression(string schemaObject, uint fieldNumber)
5252
{
53-
switch (category)
53+
switch (Category)
5454
{
5555
case ValueType.Primitive:
5656
return
57-
$"{schemaObject}.{SchemaFunctionMappings.GetSchemaFunctionFromType(primitiveType.Value)}({fieldNumber})";
57+
$"{schemaObject}.{SchemaFunctionMappings.GetSchemaFunctionFromType(PrimitiveType.Value)}({fieldNumber})";
5858
case ValueType.Enum:
5959
return $"({FqnType}) {schemaObject}.GetEnum({fieldNumber})";
6060
case ValueType.Type:
6161
return $"{FqnType}.Serialization.Deserialize({schemaObject}.GetObject({fieldNumber}))";
6262
default:
63-
throw new ArgumentOutOfRangeException(nameof(category), "Unknown type category encountered.");
63+
throw new ArgumentOutOfRangeException(nameof(Category), "Unknown type category encountered.");
6464
}
6565
}
6666

6767
public string GetCountExpression(string schemaObject, uint fieldNumber)
6868
{
69-
switch (category)
69+
switch (Category)
7070
{
7171
case ValueType.Primitive:
7272
return
73-
$"{schemaObject}.{SchemaFunctionMappings.GetCountSchemaFunctionFromType(primitiveType.Value)}({fieldNumber})";
73+
$"{schemaObject}.{SchemaFunctionMappings.GetCountSchemaFunctionFromType(PrimitiveType.Value)}({fieldNumber})";
7474
case ValueType.Enum:
7575
return $"{schemaObject}.GetEnumCount({fieldNumber})";
7676
case ValueType.Type:
7777
return $"{schemaObject}.GetObjectCount({fieldNumber})";
7878
default:
79-
throw new ArgumentOutOfRangeException(nameof(category), "Unknown type category encountered.");
79+
throw new ArgumentOutOfRangeException(nameof(Category), "Unknown type category encountered.");
8080
}
8181
}
8282

8383
public string GetFieldIndexExpression(string schemaObject, uint fieldNumber, string index)
8484
{
85-
switch (category)
85+
switch (Category)
8686
{
8787
case ValueType.Primitive:
8888
return
89-
$"{schemaObject}.{SchemaFunctionMappings.IndexSchemaFunctionFromType(primitiveType.Value)}({fieldNumber}, (uint) {index})";
89+
$"{schemaObject}.{SchemaFunctionMappings.IndexSchemaFunctionFromType(PrimitiveType.Value)}({fieldNumber}, (uint) {index})";
9090
case ValueType.Enum:
9191
return $"({FqnType}) {schemaObject}.IndexEnum({fieldNumber}, (uint) {index})";
9292
case ValueType.Type:
9393
return $"{FqnType}.Serialization.Deserialize({schemaObject}.IndexObject({fieldNumber}, (uint) {index}))";
9494
default:
95-
throw new ArgumentOutOfRangeException(nameof(category), "Unknown type category encountered.");
95+
throw new ArgumentOutOfRangeException(nameof(Category), "Unknown type category encountered.");
9696
}
9797
}
9898
}

0 commit comments

Comments
 (0)