@@ -62,35 +62,76 @@ class Lang {
6262 return null ;
6363 }
6464
65- function makeLocField (c : Column , s : SheetData ) {
65+ function makeLocField (c : Column , s : SheetData , cache : Map < Column , LocField > ) {
6666 switch ( c .type ) {
6767 case TString if ( c .kind == Localizable ):
6868 return LName (c );
6969 case TList , TProperties , TPolymorph :
70+ if (cache .exists (c ))
71+ return cache .get (c );
7072 var ssub = getSub (s ,c );
71- var fl = makeSheetFields (ssub );
72- if ( fl .length == 0 )
73- return null ;
74- return LSub (c , ssub , fl );
73+ var fl = [];
74+ var r = LSub (c , ssub , fl );
75+ cache .set (c , r );
76+ for (sc in ssub .columns ) {
77+ var f = makeLocField (sc , ssub , cache );
78+ if ( f != null )
79+ fl .push (f );
80+ }
81+ return r ;
7582 default :
7683 return null ;
7784 }
7885 }
7986
8087 function makeSheetFields (s : SheetData ) : Array <LocField > {
81- var fields = [];
88+ var cache : Map <Column , LocField > = new Map ();
89+ var fields : Array <LocField > = [];
8290 for ( c in s .columns ) {
83- var f = makeLocField (c , s );
91+ var f = makeLocField (c , s , cache );
8492 if ( f != null )
85- switch ( f ) {
86- case LSub (c , _ , fl ) if ( c .type == TProperties || c .type == TPolymorph ):
87- for ( f in fl )
88- fields .push (LSingle (c , f ));
89- default :
90- fields .push (f );
91- }
93+ fields .push (f );
94+ }
95+
96+ var map = new Map <LocField , Array <LocField >>();
97+ function flattenRec (f : LocField ) : Array <LocField > {
98+ if ( map .exists (f ) )
99+ return map .get (f );
100+
101+ var ret = [];
102+ map .set (f , ret );
103+
104+ switch ( f ) {
105+ case LName (_ ):
106+ ret .push (f );
107+ case LSingle (c , inner ):
108+ for ( ff in flattenRec (inner ) )
109+ ret .push (LSingle (c , ff ));
110+ case LSub (c , sub , fl ):
111+ if ( fl .length == 0 )
112+ return [];
113+ else if ( c .type == TProperties || c .type == TPolymorph ) {
114+ for ( inner in fl )
115+ for ( ff in flattenRec (inner ) )
116+ ret .push (LSingle (c , ff ));
117+ }
118+ else {
119+ var flat = [];
120+ for ( inner in fl )
121+ for ( ff in flattenRec (inner ) )
122+ flat .push (ff );
123+ ret .push (LSub (c , sub , flat ));
124+ }
125+ }
126+ return ret ;
127+ }
128+
129+ var ret = [];
130+ for ( field in fields ) {
131+ for ( f in flattenRec (field ) )
132+ ret .push (f );
92133 }
93- return fields ;
134+ return ret ;
94135 }
95136
96137 static var NODES : Map <String ,String >;
0 commit comments