@@ -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
0 commit comments