Skip to content

Commit 8514ce1

Browse files
committed
lets use RtxtParser everywhere
1 parent 6658354 commit 8514ce1

File tree

3 files changed

+25
-97
lines changed

3 files changed

+25
-97
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/GenerateResourceDesignerAssembly.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ bool Run(DirectoryAssemblyResolver res) {
131131
var r = resource.Value;
132132
switch (r.Type) {
133133
case RType.Integer:
134-
CreateIntProperty (resource.Key, r.Identifier, r.Id, resourceDesigner, module);
134+
CreateIntProperty (r.ResourceType, r.Identifier, r.Id, resourceDesigner, module);
135135
break;
136136
case RType.Array:
137-
CreateIntArrayProperty (resource.Key, r.Identifier, r.Ids, resourceDesigner, module);
137+
CreateIntArrayProperty (r.ResourceType, r.Identifier, r.Ids, resourceDesigner, module);
138138
break;
139139
}
140140
}

src/Xamarin.Android.Build.Tasks/Utilities/ManagedResourceParser.cs

Lines changed: 16 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -296,98 +296,18 @@ public CodeTypeDeclaration Parse (string resourceDirectory, string rTxtFile, IEn
296296

297297
void ProcessRtxtFile (string file)
298298
{
299-
var lines = System.IO.File.ReadLines (file);
300-
foreach (var line in lines) {
301-
var items = line.Split (new char [] { ' ' }, 4);
302-
int value = items [1] != "styleable" ? Convert.ToInt32 (items [3], 16) : -1;
303-
string itemName = items [2];
304-
switch (items [1]) {
305-
case "anim":
306-
CreateIntField (animation, itemName, value);
307-
break;
308-
case "animator":
309-
CreateIntField (animator, itemName, value);
310-
break;
311-
case "attr":
312-
CreateIntField (attrib, itemName, value);
313-
break;
314-
case "array":
315-
CreateIntField (arrays, itemName, value);
316-
break;
317-
case "bool":
318-
CreateIntField (boolean, itemName, value);
319-
break;
320-
case "color":
321-
CreateIntField (colors, itemName, value);
322-
break;
323-
case "dimen":
324-
CreateIntField (dimension, itemName, value);
325-
break;
326-
case "drawable":
327-
CreateIntField (drawable, itemName, value);
328-
break;
329-
case "font":
330-
CreateIntField (font, itemName, value);
331-
break;
332-
case "id":
333-
CreateIntField (ids, itemName, value);
334-
break;
335-
case "integer":
336-
CreateIntField (ints, itemName, value);
337-
break;
338-
case "interpolator":
339-
CreateIntField (interpolators, itemName, value);
340-
break;
341-
case "layout":
342-
CreateIntField (layout, itemName, value);
343-
break;
344-
case "menu":
345-
CreateIntField (menu, itemName, value);
346-
break;
347-
case "mipmap":
348-
CreateIntField (mipmaps, itemName, value);
349-
break;
350-
case "plurals":
351-
CreateIntField (plurals, itemName, value);
352-
break;
353-
case "raw":
354-
CreateIntField (raw, itemName, value);
355-
break;
356-
case "string":
357-
CreateIntField (strings, itemName, value);
358-
break;
359-
case "style":
360-
CreateIntField (style, itemName, value);
361-
break;
362-
case "styleable":
363-
switch (items [0]) {
364-
case "int":
365-
CreateIntField (styleable, itemName, Convert.ToInt32 (items [3], 10));
299+
var parser = new RtxtParser ();
300+
var resources = parser.Parse (file, Log, map);
301+
foreach (var resource in resources) {
302+
var r = resource.Value;
303+
var cl = CreateClass (r.ResourceType);
304+
switch (r.Type) {
305+
case RType.Integer:
306+
CreateIntField (cl, r.Identifier, r.Id);
366307
break;
367-
case "int[]":
368-
var arrayValues = items [3].Trim (new char [] { '{', '}' })
369-
.Replace (" ", "")
370-
.Split (new char [] { ',' });
371-
CreateIntArrayField (styleable, itemName, arrayValues.Length,
372-
arrayValues.Select (x => string.IsNullOrEmpty (x) ? -1 : Convert.ToInt32 (x, 16)).ToArray ());
308+
case RType.Array:
309+
CreateIntArrayField (cl, r.Identifier, r.Ids.Length, r.Ids);
373310
break;
374-
}
375-
break;
376-
case "transition":
377-
CreateIntField (transition, itemName, value);
378-
break;
379-
case "xml":
380-
CreateIntField (xml, itemName, value);
381-
break;
382-
// for custom views
383-
default:
384-
CodeTypeDeclaration customClass;
385-
if (!custom_types.TryGetValue (items [1], out customClass)) {
386-
customClass = CreateClass (items [1]);
387-
custom_types.Add (items [1], customClass);
388-
}
389-
CreateIntField (customClass, itemName, value);
390-
break;
391311
}
392312
}
393313
}
@@ -435,15 +355,21 @@ CodeTypeDeclaration CreateResourceClass ()
435355
return decl;
436356
}
437357

358+
Dictionary<string, CodeTypeDeclaration> classes = new Dictionary<string, CodeTypeDeclaration> (StringComparer.OrdinalIgnoreCase);
359+
438360
CodeTypeDeclaration CreateClass (string type)
439361
{
362+
if (classes.ContainsKey (type)) {
363+
return classes[type];
364+
}
440365
var t = new CodeTypeDeclaration (ResourceParser.GetNestedTypeName (type)) {
441366
IsPartial = true,
442367
TypeAttributes = TypeAttributes.Public,
443368
};
444369
t.Members.Add (new CodeConstructor () {
445370
Attributes = MemberAttributes.Private,
446371
});
372+
classes.Add (type, t);
447373
return t;
448374
}
449375

src/Xamarin.Android.Build.Tasks/Utilities/RtxtParser.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public enum RType {
1212
Array,
1313
}
1414
public struct R {
15-
public RType Type = RType.Integer;
15+
public RType Type;
1616
public int Id;
1717
public int [] Ids;
1818
public string Identifier;
@@ -37,6 +37,7 @@ public Dictionary<string, R> Parse (string file, TaskLoggingHelper logger, Dicti
3737
var result = new Dictionary<string, R> ();
3838
if (File.Exists (file))
3939
ProcessRtxtFile (file, result);
40+
4041
return result;
4142
}
4243

@@ -47,6 +48,7 @@ void ProcessRtxtFile (string file, Dictionary<string, R> result)
4748
var items = line.Split (new char [] { ' ' }, 4);
4849
int value = items [1] != "styleable" ? Convert.ToInt32 (items [3], 16) : -1;
4950
string itemName = ResourceIdentifier.GetResourceName(items [1], items [2], resource_fixup, log);
51+
string itemKey = $"{items [1]}:{itemName}";
5052
switch (items [1]) {
5153
case "anim":
5254
case "animator":
@@ -69,7 +71,7 @@ void ProcessRtxtFile (string file, Dictionary<string, R> result)
6971
case "style":
7072
case "transition":
7173
case "xml":
72-
result[ items [1]] = new R () {
74+
result [itemKey] = new R () {
7375
ResourceType = items[1],
7476
Identifier = itemName,
7577
Id = value,
@@ -78,7 +80,7 @@ void ProcessRtxtFile (string file, Dictionary<string, R> result)
7880
case "styleable":
7981
switch (items [0]) {
8082
case "int":
81-
result[ items [1]] = new R () {
83+
result [itemKey] = new R () {
8284
ResourceType = items[1],
8385
Identifier = itemName,
8486
Id = Convert.ToInt32 (items [3], 10),
@@ -89,7 +91,7 @@ void ProcessRtxtFile (string file, Dictionary<string, R> result)
8991
.Replace (" ", "")
9092
.Split (new char [] { ',' });
9193

92-
result[ items [1]] = new R () {
94+
result [itemKey] = new R () {
9395
ResourceType = items[1],
9496
Type = RType.Array,
9597
Identifier = itemName,
@@ -100,7 +102,7 @@ void ProcessRtxtFile (string file, Dictionary<string, R> result)
100102
break;
101103
// for custom views
102104
default:
103-
result[ items [1]] = new R () {
105+
result [itemKey] = new R () {
104106
ResourceType = items[1],
105107
Identifier = itemName,
106108
Id = value,

0 commit comments

Comments
 (0)