JSDOC/Collapse.vala
[gnome.introspection-doc-generator] / JSDOC / Collapse.vala
1
2 /**
3  * 
4  * base class for parsing segments of token array..
5  * 
6  * 
7  * We want to make parsing the whole thing easy..
8  * 
9  * so we do various tricks:
10  * 
11  * 
12  * a) white space collased
13  *    wsPrefix 
14  * b)  toks
15  *     { } - collapse into first element.
16        ( ) - collapse into first element.
17        [ ] - collapse into first element.
18  * c) items = , seperation within the above..
19  * 
20  * usage: x = new Collapse(token_array)
21  * 
22  * 
23  * 
24  * 
25  */ 
26
27 namespace JSDOC {
28
29         public class  Collapse : TokenStream  {
30
31
32                 public Collapse(Gee.ArrayList<Token> tokens) 
33                 {
34                     parent(ar);;
35                     
36                     this.spaces();
37                     
38                     ar = this.collapse(this.tokens);
39                     
40                     this.tokens = ar;
41                     
42                    // console.dump(ar);
43                     
44                 }
45                 
46                 // put spaces into prefix of tokens..
47     
48         void spaces () {
49             var ar = new Gee.ArrayList<Token>()
50             var pref =  new Gee.ArrayList<Token>();
51             
52
53             
54             for (var i = 0; i < this.tokens.size; i ++) {
55                 var tok = this.tokens[i];
56                 if (tok.is("COMM") || tok.is("WHIT")) {
57                     pref.add(tok);
58                     continue;
59                 }
60                 tok.prefix = '';
61                 if (pref.size > 0) {
62                         foreach(e in pref) {
63                         tok.prefix += e.data;
64                     }
65                     pref =  new Gee.ArrayList<Token>(); // reset pref..
66                 }
67                 
68                 ar.add(tok);
69                 
70
71                 
72             }
73             this.tokens = ar;
74             
75         },
76         
77         
78         
79         collapse : function(ar) {
80             
81             var st = new  TokenStream(ar);
82             var ret = [];
83             
84             while (true) {
85                 var  tok = st.look(1,true);
86                 if (!tok || !tok.is) {
87                   //  Seed.print(TokenStream.toString(ret));
88                     return ret;
89                 }
90                 // console.log(tok.data);
91                 switch(tok.type) {
92                     case "VOID": 
93                         return ret; //EOF
94                         
95                         
96                     case "KEYW": 
97                     case "TOKN":
98                     case "NAME":
99                     case "STRN":
100                     case "NUMB":
101                     case "REGX":
102                         ret.push(st.next(1));
103                         continue;
104                         
105                     case "PUNC":
106                         switch (tok.data) {
107                             case "[":
108                             case "{":
109                             case "(":
110                                 
111                                 var start = st.cursor;
112                                 st.next(1);
113                                 var add = st.balance(tok.data);
114                                 if (!add) {
115                                     console.dump(tok);
116                                     console.dump(start + '...' + st.cursor);
117                                     console.dump(st.tokens);
118                                  
119                                 }
120                                 if (add) {
121                                     add.shift();
122                                 }
123                                 //Seed.print("ADD");
124                                 //Seed.print(JSON.stringify(add, null,4));
125                                 
126                                 
127                                 
128                                 var toks = add ? this.collapse(add) : [];
129                                 tok.items = false;
130                                 tok.props = false;
131                                 
132                                 
133                                 
134                                 if (tok.data != '{') {
135                                     // paramters or array elements..
136                                     tok.items = this.toItems(toks, [',']);
137                                 } else {
138                                     // check for types.. it could be a list of statements.. or object
139                                     
140                                     var ost = new  TokenStream(toks);
141                                     //console.dump(ost.look(2,true) );
142                                     if (ost.look(2,true) && ost.look(2,true).data == ":") {
143                                         tok.props = this.toProps(toks);
144                                     } else {
145                                         // list of statemetns..
146                                         tok.items = this.toItems(toks,[ ';', '{'] );;
147                                     }
148                                     
149                                     
150                                 }
151                                  
152                                 
153                                 
154                                 
155                                 
156                                 
157                                 
158                                 //Seed.print(" ADD : " + add.length  +  " ITEMS: " + tok.items.length);
159                                 
160                                 ret.push(tok);
161                                 
162                                 continue;
163                    
164                             default:
165                                 ret.push(st.next(1));
166                                 continue;
167                         }
168                         Seed.print("OOPS");
169                         continue;
170                     default : 
171                         Seed.print("OOPS" + tok.type);
172                         continue;
173                 }
174             }
175                 
176                 
177             
178             
179             
180             
181             
182             
183             
184             
185         },
186         toItems : function(ar,sep)
187         {
188             var ret = [];
189             var g = [];
190               
191             for (var i = 0; i < ar.length; i ++) {
192                 if (sep.indexOf(ar[i].data) < 0) {
193                     g.push(ar[i]);
194                     continue;
195                 }
196                 // var a=..., b =...
197                 if ((ar[i].data != ';') && g.length && (g[0].name == "VAR")) {;
198                     g.push(ar[i]);
199                     continue;
200                 }
201                 
202                 g.push(ar[i]);
203                 ret.push(g);
204                 g = [];
205                 
206             }
207             // last..
208             if (g.length) {
209                 ret.push(g);
210             }
211             return ret;
212             
213         },
214         toProps : function(ar)
215         {
216             
217             var ret = { }
218                
219             var g = { key : '', val: [] }
220                
221             
222             var k = '';
223             var state = 0;
224             for (var i = 0; i < ar.length; i ++) {
225                 
226                 switch(state) {
227                     case 0:
228                         k = ar[i].data;
229                         g.key = ar[i];
230                         state = 1;
231                         continue;
232                     case 1:
233                         state =2; // should be ':'
234                         continue;
235                     case 2:
236                         g.val.push(ar[i]);
237                         if (ar[i].data != ',') {
238                             continue;
239                         }
240                         ret[k] = g;
241                         g = { key : '', val: [] }
242                         state = 0;
243                         continue;
244                    
245                 }
246             }
247              // last.. - if g.val.length is 0 then it's a trailing ','...
248              // we should really throw a syntax error in that case..
249             if (k.length && g.val.length) {
250                 ret[k] = g;
251             }
252             return ret;
253             
254             
255         }
256
257     
258     
259 });