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         void spaces () {
47             var ar = new Gee.ArrayList<Token>()
48             var pref =  new Gee.ArrayList<Token>();
49             
50
51             
52             for (var i = 0; i < this.tokens.size; i ++) {
53                 var tok = this.tokens[i];
54                 if (tok.is("COMM") || tok.is("WHIT")) {
55                     pref.add(tok);
56                     continue;
57                 }
58                 tok.prefix = '';
59                 if (pref.size > 0) {
60                         foreach(e in pref) {
61                         tok.prefix += e.data;
62                     }
63                 }
64                 
65                 ar.add(tok);
66                 pref =  new Gee.ArrayList<Token>(); // reset pref..
67
68                 
69             }
70             this.tokens = ar;
71             
72         },
73         collapse : function(ar) {
74             
75             var st = new  TokenStream(ar);
76             var ret = [];
77             
78             while (true) {
79                 var  tok = st.look(1,true);
80                 if (!tok || !tok.is) {
81                   //  Seed.print(TokenStream.toString(ret));
82                     return ret;
83                 }
84                 // console.log(tok.data);
85                 switch(tok.type) {
86                     case "VOID": 
87                         return ret; //EOF
88                         
89                         
90                     case "KEYW": 
91                     case "TOKN":
92                     case "NAME":
93                     case "STRN":
94                     case "NUMB":
95                     case "REGX":
96                         ret.push(st.next(1));
97                         continue;
98                         
99                     case "PUNC":
100                         switch (tok.data) {
101                             case "[":
102                             case "{":
103                             case "(":
104                                 
105                                 var start = st.cursor;
106                                 st.next(1);
107                                 var add = st.balance(tok.data);
108                                 if (!add) {
109                                     console.dump(tok);
110                                     console.dump(start + '...' + st.cursor);
111                                     console.dump(st.tokens);
112                                  
113                                 }
114                                 if (add) {
115                                     add.shift();
116                                 }
117                                 //Seed.print("ADD");
118                                 //Seed.print(JSON.stringify(add, null,4));
119                                 
120                                 
121                                 
122                                 var toks = add ? this.collapse(add) : [];
123                                 tok.items = false;
124                                 tok.props = false;
125                                 
126                                 
127                                 
128                                 if (tok.data != '{') {
129                                     // paramters or array elements..
130                                     tok.items = this.toItems(toks, [',']);
131                                 } else {
132                                     // check for types.. it could be a list of statements.. or object
133                                     
134                                     var ost = new  TokenStream(toks);
135                                     //console.dump(ost.look(2,true) );
136                                     if (ost.look(2,true) && ost.look(2,true).data == ":") {
137                                         tok.props = this.toProps(toks);
138                                     } else {
139                                         // list of statemetns..
140                                         tok.items = this.toItems(toks,[ ';', '{'] );;
141                                     }
142                                     
143                                     
144                                 }
145                                  
146                                 
147                                 
148                                 
149                                 
150                                 
151                                 
152                                 //Seed.print(" ADD : " + add.length  +  " ITEMS: " + tok.items.length);
153                                 
154                                 ret.push(tok);
155                                 
156                                 continue;
157                    
158                             default:
159                                 ret.push(st.next(1));
160                                 continue;
161                         }
162                         Seed.print("OOPS");
163                         continue;
164                     default : 
165                         Seed.print("OOPS" + tok.type);
166                         continue;
167                 }
168             }
169                 
170                 
171             
172             
173             
174             
175             
176             
177             
178             
179         },
180         toItems : function(ar,sep)
181         {
182             var ret = [];
183             var g = [];
184               
185             for (var i = 0; i < ar.length; i ++) {
186                 if (sep.indexOf(ar[i].data) < 0) {
187                     g.push(ar[i]);
188                     continue;
189                 }
190                 // var a=..., b =...
191                 if ((ar[i].data != ';') && g.length && (g[0].name == "VAR")) {;
192                     g.push(ar[i]);
193                     continue;
194                 }
195                 
196                 g.push(ar[i]);
197                 ret.push(g);
198                 g = [];
199                 
200             }
201             // last..
202             if (g.length) {
203                 ret.push(g);
204             }
205             return ret;
206             
207         },
208         toProps : function(ar)
209         {
210             
211             var ret = { }
212                
213             var g = { key : '', val: [] }
214                
215             
216             var k = '';
217             var state = 0;
218             for (var i = 0; i < ar.length; i ++) {
219                 
220                 switch(state) {
221                     case 0:
222                         k = ar[i].data;
223                         g.key = ar[i];
224                         state = 1;
225                         continue;
226                     case 1:
227                         state =2; // should be ':'
228                         continue;
229                     case 2:
230                         g.val.push(ar[i]);
231                         if (ar[i].data != ',') {
232                             continue;
233                         }
234                         ret[k] = g;
235                         g = { key : '', val: [] }
236                         state = 0;
237                         continue;
238                    
239                 }
240             }
241              // last.. - if g.val.length is 0 then it's a trailing ','...
242              // we should really throw a syntax error in that case..
243             if (k.length && g.val.length) {
244                 ret[k] = g;
245             }
246             return ret;
247             
248             
249         }
250
251     
252     
253 });