Skip to content

Commit be974c2

Browse files
committed
Support CSComponent descendants other than direct subclasses
1 parent 35f402e commit be974c2

3 files changed

Lines changed: 903 additions & 803 deletions

File tree

‎Script/AtomicNET/AtomicNETService/AssemblyInspector.cs‎

Lines changed: 161 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -17,210 +17,235 @@
1717
namespace AtomicTools
1818
{
1919

20-
class AssemblyInspector
21-
{
20+
class AssemblyInspector
21+
{
2222

23-
Dictionary<string, InspectorEnum> InspectorEnums = new Dictionary<string, InspectorEnum> ();
24-
Dictionary<string, InspectorComponent> InspectorComponents = new Dictionary<string, InspectorComponent> ();
23+
Dictionary<string, InspectorEnum> InspectorEnums = new Dictionary<string, InspectorEnum>();
24+
Dictionary<string, InspectorComponent> InspectorComponents = new Dictionary<string, InspectorComponent>();
2525

26-
PEReader peFile;
27-
MetadataReader metaReader;
26+
PEReader peFile;
27+
MetadataReader metaReader;
2828

29-
public AssemblyInspector ()
30-
{
29+
public AssemblyInspector()
30+
{
3131

32-
}
32+
}
3333

34-
public string DumpToJSON ()
35-
{
36-
var dict = new Dictionary<string, object> ();
34+
public string DumpToJSON()
35+
{
36+
var dict = new Dictionary<string, object>();
3737

38-
var enumList = new List<object> ();
39-
var componentList = new List<object> ();
38+
var enumList = new List<object>();
39+
var componentList = new List<object>();
4040

41-
foreach (var entry in InspectorEnums) {
42-
enumList.Add (entry.Value.GetJSONDict ());
43-
}
41+
foreach (var entry in InspectorEnums)
42+
{
43+
enumList.Add(entry.Value.GetJSONDict());
44+
}
4445

45-
foreach (var entry in InspectorComponents) {
46-
componentList.Add (entry.Value.GetJSONDict ());
47-
}
46+
foreach (var entry in InspectorComponents)
47+
{
48+
componentList.Add(entry.Value.GetJSONDict());
49+
}
4850

49-
dict ["enums"] = enumList;
50-
dict ["components"] = componentList;
51+
dict["enums"] = enumList;
52+
dict["components"] = componentList;
5153

52-
return MiniJSON.Json.Serialize (dict);
54+
return MiniJSON.Json.Serialize(dict);
5355

54-
}
56+
}
5557

56-
public void Inspect (String pathToAssembly)
57-
{
58+
public void Inspect(String pathToAssembly)
59+
{
5860

59-
using (var stream = File.OpenRead (pathToAssembly))
60-
using (peFile = new PEReader (stream)) {
61+
using (var stream = File.OpenRead(pathToAssembly))
62+
using (peFile = new PEReader(stream))
63+
{
6164

62-
metaReader = peFile.GetMetadataReader ();
65+
metaReader = peFile.GetMetadataReader();
6366

64-
ParseEnums ();
65-
ParseComponents ();
66-
}
67+
ParseEnums();
68+
ParseComponents();
69+
}
6770

68-
}
71+
}
6972

70-
void ParseComponents ()
71-
{
73+
void ParseComponents()
74+
{
7275

73-
foreach (var handle in metaReader.TypeDefinitions) {
76+
foreach (var handle in metaReader.TypeDefinitions)
77+
{
7478

75-
var typeDef = metaReader.GetTypeDefinition (handle);
79+
var typeDef = metaReader.GetTypeDefinition(handle);
7680

77-
var baseTypeHandle = typeDef.BaseType;
81+
var parentName = metaReader.GetString(typeDef.Name);
7882

79-
if (baseTypeHandle.Kind == HandleKind.TypeReference) {
83+
var baseTypeHandle = typeDef.BaseType;
8084

81-
var typeRef = metaReader.GetTypeReference ((TypeReferenceHandle)baseTypeHandle);
85+
// Work up to base reference (ie defined outside this assembly)
86+
while (baseTypeHandle.Kind == HandleKind.TypeDefinition)
87+
{
88+
var baseTypeDef = metaReader.GetTypeDefinition((TypeDefinitionHandle)baseTypeHandle);
89+
// No way to predetermine if .BaseType is valid
90+
try
91+
{
92+
baseTypeHandle = baseTypeDef.BaseType;
93+
}
94+
catch (Exception) { break; }
95+
}
8296

83-
var name = metaReader.GetString (typeRef.Name);
97+
if (baseTypeHandle.Kind == HandleKind.TypeReference)
98+
{
8499

85-
if (name != "CSComponent")
86-
continue;
100+
var typeRef = metaReader.GetTypeReference((TypeReferenceHandle)baseTypeHandle);
87101

88-
var inspector = new CSComponentInspector (typeDef, peFile, metaReader);
102+
var name = metaReader.GetString(typeRef.Name);
89103

90-
var icomponent = inspector.Inspect ();
104+
if (name != "CSComponent")
105+
continue;
91106

92-
if (icomponent != null)
93-
InspectorComponents [icomponent.Name] = icomponent;
94-
}
95-
}
96-
}
107+
var inspector = new CSComponentInspector(typeDef, peFile, metaReader);
97108

109+
var icomponent = inspector.Inspect();
98110

99-
void ParseEnums ()
100-
{
101-
foreach (var handle in metaReader.TypeDefinitions) {
111+
if (icomponent != null)
112+
InspectorComponents[icomponent.Name] = icomponent;
113+
}
114+
}
115+
}
102116

103-
var typeDef = metaReader.GetTypeDefinition (handle);
104117

105-
var baseTypeHandle = typeDef.BaseType;
118+
void ParseEnums()
119+
{
120+
foreach (var handle in metaReader.TypeDefinitions)
121+
{
106122

107-
if (baseTypeHandle.Kind == HandleKind.TypeReference) {
108-
var typeRef = metaReader.GetTypeReference ((TypeReferenceHandle)baseTypeHandle);
123+
var typeDef = metaReader.GetTypeDefinition(handle);
109124

110-
if (metaReader.GetString (typeRef.Name) == "Enum") {
111-
ParseEnum (typeDef);
112-
}
113-
}
114-
}
115-
}
125+
var baseTypeHandle = typeDef.BaseType;
116126

117-
void ParseEnum (TypeDefinition enumTypeDef)
118-
{
127+
if (baseTypeHandle.Kind == HandleKind.TypeReference)
128+
{
129+
var typeRef = metaReader.GetTypeReference((TypeReferenceHandle)baseTypeHandle);
119130

120-
// TODO: verify that int32 is the enums storage type for constant read below
131+
if (metaReader.GetString(typeRef.Name) == "Enum")
132+
{
133+
ParseEnum(typeDef);
134+
}
135+
}
136+
}
137+
}
121138

122-
InspectorEnum ienum = new InspectorEnum ();
139+
void ParseEnum(TypeDefinition enumTypeDef)
140+
{
123141

124-
ienum.Name = metaReader.GetString (enumTypeDef.Name);
142+
// TODO: verify that int32 is the enums storage type for constant read below
125143

126-
InspectorEnums [ienum.Name] = ienum;
144+
InspectorEnum ienum = new InspectorEnum();
127145

128-
var fields = enumTypeDef.GetFields ();
146+
ienum.Name = metaReader.GetString(enumTypeDef.Name);
129147

130-
foreach (var fieldHandle in fields) {
148+
InspectorEnums[ienum.Name] = ienum;
131149

132-
var inspectorField = new InspectorField ();
150+
var fields = enumTypeDef.GetFields();
133151

134-
var fieldDef = metaReader.GetFieldDefinition (fieldHandle);
152+
foreach (var fieldHandle in fields)
153+
{
135154

136-
if ((fieldDef.Attributes & FieldAttributes.HasDefault) != 0) {
155+
var inspectorField = new InspectorField();
137156

138-
var constantHandle = fieldDef.GetDefaultValue ();
139-
var constant = metaReader.GetConstant (constantHandle);
157+
var fieldDef = metaReader.GetFieldDefinition(fieldHandle);
140158

141-
BlobReader constantReader = metaReader.GetBlobReader (constant.Value);
159+
if ((fieldDef.Attributes & FieldAttributes.HasDefault) != 0)
160+
{
142161

143-
ienum.Values [metaReader.GetString (fieldDef.Name)] = constantReader.ReadInt32 ();
162+
var constantHandle = fieldDef.GetDefaultValue();
163+
var constant = metaReader.GetConstant(constantHandle);
144164

145-
}
146-
}
165+
BlobReader constantReader = metaReader.GetBlobReader(constant.Value);
147166

148-
return;
167+
ienum.Values[metaReader.GetString(fieldDef.Name)] = constantReader.ReadInt32();
149168

150-
}
151-
}
169+
}
170+
}
152171

153-
internal class InspectorEnum
154-
{
155-
public String Name;
156-
public Dictionary<string, int> Values = new Dictionary<string, int> ();
172+
return;
157173

158-
public Dictionary<string, object> GetJSONDict ()
159-
{
160-
var dict = new Dictionary<string,object> ();
161-
dict ["name"] = Name;
162-
dict ["values"] = Values;
163-
return dict;
164-
}
165-
}
174+
}
175+
}
166176

167-
internal class InspectorComponent
168-
{
169-
public String Name;
170-
public String Namespace;
171-
public Dictionary<string, InspectorField> Fields = new Dictionary<string, InspectorField> ();
177+
internal class InspectorEnum
178+
{
179+
public String Name;
180+
public Dictionary<string, int> Values = new Dictionary<string, int>();
172181

173-
public Dictionary<string, object> GetJSONDict ()
174-
{
175-
var dict = new Dictionary<string,object> ();
182+
public Dictionary<string, object> GetJSONDict()
183+
{
184+
var dict = new Dictionary<string, object>();
185+
dict["name"] = Name;
186+
dict["values"] = Values;
187+
return dict;
188+
}
189+
}
176190

177-
dict ["name"] = Name;
178-
dict ["namespace"] = Namespace;
191+
internal class InspectorComponent
192+
{
193+
public String Name;
194+
public String Namespace;
195+
public Dictionary<string, InspectorField> Fields = new Dictionary<string, InspectorField>();
179196

180-
var fieldList = new List<object> ();
197+
public Dictionary<string, object> GetJSONDict()
198+
{
199+
var dict = new Dictionary<string, object>();
181200

182-
foreach (var entry in Fields) {
183-
fieldList.Add (entry.Value.GetJSONDict ());
184-
}
201+
dict["name"] = Name;
202+
dict["namespace"] = Namespace;
185203

186-
dict ["fields"] = fieldList;
204+
var fieldList = new List<object>();
187205

188-
return dict;
189-
}
190-
}
206+
foreach (var entry in Fields)
207+
{
208+
fieldList.Add(entry.Value.GetJSONDict());
209+
}
191210

192-
internal class InspectorField
193-
{
211+
dict["fields"] = fieldList;
194212

195-
public Dictionary<string, object> GetJSONDict ()
196-
{
213+
return dict;
214+
}
215+
}
197216

198-
var dict = new Dictionary<string,object> ();
217+
internal class InspectorField
218+
{
199219

200-
dict ["isEnum"] = IsEnum;
201-
dict ["typeName"] = TypeName;
202-
dict ["name"] = Name;
203-
dict ["defaultValue"] = DefaultValue;
220+
public Dictionary<string, object> GetJSONDict()
221+
{
204222

205-
dict ["caPos"] = CustomAttrPositionalArgs;
206-
dict ["caNamed"] = CustomAttrNamedArgs;
223+
var dict = new Dictionary<string, object>();
207224

208-
return dict;
225+
dict["isEnum"] = IsEnum;
226+
dict["typeName"] = TypeName;
227+
dict["name"] = Name;
228+
dict["defaultValue"] = DefaultValue;
209229

210-
}
230+
dict["caPos"] = CustomAttrPositionalArgs;
231+
dict["caNamed"] = CustomAttrNamedArgs;
211232

212-
public bool IsEnum = false;
233+
return dict;
213234

214-
public string TypeName;
235+
}
215236

216-
// the Name of the InspectorField
217-
public string Name;
218-
// The DefaultValue if supplied
219-
public string DefaultValue;
237+
public bool IsEnum = false;
220238

221-
// custom attributes, positional and named
222-
public List<string> CustomAttrPositionalArgs = new List<string> ();
223-
public Dictionary<string, string> CustomAttrNamedArgs = new Dictionary<string, string> ();
224-
}
239+
public string TypeName;
240+
241+
// the Name of the InspectorField
242+
public string Name;
243+
// The DefaultValue if supplied
244+
public string DefaultValue;
245+
246+
// custom attributes, positional and named
247+
public List<string> CustomAttrPositionalArgs = new List<string>();
248+
public Dictionary<string, string> CustomAttrNamedArgs = new Dictionary<string, string>();
249+
}
225250

226251
}

0 commit comments

Comments
 (0)