JSDOC/TokenReader.js
[gnome.introspection-doc-generator] / JSDOC / Collapse.vala
index 30cefb3..2f883f3 100644 (file)
@@ -29,13 +29,15 @@ namespace JSDOC {
        public class  Collapse : TokenStream  {
 
 
+
+
                public Collapse(Gee.ArrayList<Token> tokens) 
                {
-                   parent(ar);;
+                   base(tokens);
                    
                    this.spaces();
                    
-                   ar = this.collapse(this.tokens);
+                   var ar = this.collapse(this.tokens);
                    
                    this.tokens = ar;
                    
@@ -47,10 +49,10 @@ namespace JSDOC {
     
         void spaces () 
         {
-            var ar = new Gee.ArrayList<Token>()
+            var ar = new Gee.ArrayList<Token>();
             var pref =  new Gee.ArrayList<Token>();
             
-
+                       
             
             for (var i = 0; i < this.tokens.size; i ++) {
                 var tok = this.tokens[i];
@@ -58,9 +60,9 @@ namespace JSDOC {
                     pref.add(tok);
                     continue;
                 }
-                tok.prefix = '';
+                tok.prefix = "";
                 if (pref.size > 0) {
-                       foreach(e in pref) {
+                       foreach(var e in pref) {
                         tok.prefix += e.data;
                     }
                     pref =  new Gee.ArrayList<Token>(); // reset pref..
@@ -73,11 +75,11 @@ namespace JSDOC {
             }
             this.tokens = ar;
             
-        },
+        }
         
         
         
-        Gee.ArrayList<Token>  collapse(ar) 
+        Gee.ArrayList<Token>  collapse(Gee.ArrayList<Token>  ar) 
         {
             
             var st = new TokenStream(ar);
@@ -91,6 +93,8 @@ namespace JSDOC {
                 }
                 // console.log(tok.data);
                 
+                debug("COL: %s", tok.asString());
+                
                 switch(tok.type) {
                     case "VOID": 
                         return ret; //EOF
@@ -102,7 +106,10 @@ namespace JSDOC {
                     case "STRN":
                     case "NUMB":
                     case "REGX":
-                        ret.push(st.next(1));
+                               var nn = st.next();
+                               if (nn != null) { 
+                               ret.add(nn);
+                        }
                         continue;
                         
                     case "PUNC":
@@ -112,8 +119,13 @@ namespace JSDOC {
                             case "(":
                                 
                                 var start = st.cursor;
-                                st.next(1);
+                                //st.next(); << no need to shift, balance will start at first character..
+                                
                                 var add = st.balance(tok.data);
+                                
+                                debug("BALANCE returned %d items\n", add.size);
+                                
+                                
                                // if (!add) {
                                     //console.dump(tok);
                                     //console.dump(start + '...' + st.cursor);
@@ -130,20 +142,20 @@ namespace JSDOC {
                                 
                                 var toks = add.size > 0 ? this.collapse(add) : add;
                                 
-                                tok.items = new Gee.ArrayList<Token>(); //?? needed?
-                                tok.props = new Gee.HashMap<string,Gee.ArrayList<Token>>();
+                                tok.items = new Gee.ArrayList<Gee.ArrayList<Token>>(); //?? needed?
+                                tok.props = new Gee.HashMap<string,TokenKeyMap>();
                                  
                                 
                                 if (tok.data != "{") {
                                     // paramters or array elements..
-                                    tok.items = this.toItems(toks, ","]);
+                                    tok.items = this.toItems(toks, ",");
                                 } else {
                                     // check for types.. it could be a list of statements.. or object
                                     // format "{" "xXXX" ":" << looks for the ':'.. seems to work.. not sure if it's foolproof...
                                     
                                     var ost = new  TokenStream(toks);
                                     //console.dump(ost.look(2,true) );
-                                    if (ost.look(2,true) && ost.look(2,true).data == ":") {
+                                    if (ost.look(2,true) != null && ost.look(2,true).data == ":") {
                                                // object properties...
                                         tok.props = this.toProps(toks);
                                     } else {
@@ -162,18 +174,18 @@ namespace JSDOC {
                                 
                                 //Seed.print(" ADD : " + add.length  +  " ITEMS: " + tok.items.length);
                                 
-                                ret.push(tok);
+                                ret.add(tok);
                                 
                                 continue;
                    
                             default:
-                                ret.push(st.next(1));
+                                ret.add(st.next());
                                 continue;
                         }
-                        Seed.print("OOPS");
+                       print("OOPS");
                         continue;
                     default : 
-                        Seed.print("OOPS" + tok.type);
+                       print("OOPS" + tok.type);
                         continue;
                 }
             }
@@ -187,63 +199,65 @@ namespace JSDOC {
             
             
             
-        },
-        toItems : function(ar,sep)
+        }
+        // array of arrays of tokens
+        Gee.ArrayList<Gee.ArrayList<Token>>  toItems(Gee.ArrayList<Token>  ar, string sep)
         {
-            var ret = [];
-            var g = [];
+            var ret = new Gee.ArrayList<Gee.ArrayList<Token>>() ;
+            var g =  new Gee.ArrayList<Token>() ;
               
-            for (var i = 0; i < ar.length; i ++) {
-                if (sep.indexOf(ar[i].data) < 0) {
-                    g.push(ar[i]);
+            for (var i = 0; i < ar.size; i ++) {
+                if (sep.index_of(ar.get(i).data) < 0) {
+                    g.add(ar.get(i));
                     continue;
                 }
                 // var a=..., b =...
-                if ((ar[i].data != ';') && g.length && (g[0].name == "VAR")) {;
-                    g.push(ar[i]);
+                if ((ar.get(i).data != ";") && g.size> 0  && (g[0].name == "VAR")) {;
+                    g.add(ar.get(i));
                     continue;
                 }
                 
-                g.push(ar[i]);
-                ret.push(g);
-                g = [];
+                g.add(ar.get(i));
+                ret.add(g);
+                g =  new Gee.ArrayList<Token>() ;
                 
             }
             // last..
-            if (g.length) {
-                ret.push(g);
+            if (g.size > 0) {
+                ret.add(g);
             }
             return ret;
             
-        },
-        toProps : function(ar)
+        }
+        
+        Gee.HashMap<string,TokenKeyMap> toProps (Gee.ArrayList<Token> ar)
         {
             
-            var ret = { }
+            var ret = new Gee.HashMap<string,TokenKeyMap>();
                
-            var g = { key : '', val: [] }
+            var g = new TokenKeyMap();
                
             
-            var k = '';
+            var k = "";
             var state = 0;
-            for (var i = 0; i < ar.length; i ++) {
+            for (var i = 0; i < ar.size; i ++) {
                 
                 switch(state) {
                     case 0:
-                        k = ar[i].data;
-                        g.key = ar[i];
+                        k = ar.get(i).data;
+                        g.key = ar.get(i);
                         state = 1;
                         continue;
                     case 1:
                         state =2; // should be ':'
                         continue;
                     case 2:
-                        g.val.push(ar[i]);
-                        if (ar[i].data != ',') {
+                        g.vals.add( ar.get(i));
+                        if ( ar.get(i).data != ",") {
                             continue;
                         }
-                        ret[k] = g;
-                        g = { key : '', val: [] }
+                        ret.set(k, g);
+                        g = new TokenKeyMap();
                         state = 0;
                         continue;
                    
@@ -251,14 +265,14 @@ namespace JSDOC {
             }
              // last.. - if g.val.length is 0 then it's a trailing ','...
              // we should really throw a syntax error in that case..
-            if (k.length && g.val.length) {
-                ret[k] = g;
+            if (k.length > 0 && g.vals.size > 0) {
+                ret.set(k, g);
             }
             return ret;
             
             
         }
 
+       }   
     
-    
-});
+}