JSDOC/ScopeParser.js
[gnome.introspection-doc-generator] / JSDOC / ScopeParser.js
index 1f786e0..d2ded36 100644 (file)
@@ -141,7 +141,7 @@ ScopeParser.prototype = {
         this.braceNesting = 0;
         this.scopes = [];
         
-        
+        //print(JSON.stringify(this.ts.tokens, null,4));
         
         
         this.globalScope = new  Scope(-1, false, -1, '');
@@ -258,7 +258,7 @@ ScopeParser.prototype = {
                     while (true) {
                         token = this.ts.nextTok();
                         //!this.debug|| print( token.toString());
-                        //print('SCOPE-VAR-VAL:' + token.toString());
+                        //print('SCOPE-VAR-VAL:' + JSON.stringify(token, null, 4));
                         if (!token) { // can return false at EOF!
                             break;
                         }
@@ -300,7 +300,21 @@ ScopeParser.prototype = {
                         } else {
                             //var bn = this.braceNesting;
                             var bn = this.braceNesting;
-                            this.parseExpression();
+                            var nts = [];
+                            while (true) {
+                                if (!token || token.type == 'VOID' || token.data == ',') {
+                                    break;
+                                }
+                                nts.push(token);
+                                token = this.ts.nextTok();
+                            }
+                            if (nts.length) {
+                                var TS = this.ts;
+                                this.ts = new TokenStream(nts);
+                                this.parseExpression();
+                                this.ts = TS;
+                            }
+                               
                             this.braceNesting = bn;
                             //this.braceNesting = bn;
                             //this.logR("parseScope DONE  : <B>ParseExpression</B> - tok is:" + this.ts.lookT(0).toString()); 
@@ -328,6 +342,7 @@ ScopeParser.prototype = {
 
                 case "PUNC.LEFT_CURLY": // {
                 case "PUNC.LEFT_PAREN": // (    
+                case "PUNC.LEFT_BRACE": // [
                     //print('SCOPE-CURLY/PAREN:' + token.toString());
                     //println("<i>"+token.data+"</i>");
                     var curTS = this.ts;
@@ -348,7 +363,7 @@ ScopeParser.prototype = {
                             // key value..
                             
                             this.ts = new TokenStream(token.props[prop].val);
-                            this.parseScope(false);
+                            this.parseExpression();
                             
                         }
                         this.ts = curTS;
@@ -411,7 +426,7 @@ ScopeParser.prototype = {
                     break;
 
                 case "KEYW.CATCH":
-                    //print('SCOPE-CATCH:' + token.toString());
+                    print('SCOPE-CATCH:' + token.toString());
                     //println("<i>"+token.data+"</i>");
                     this.parseCatch();
                     break;
@@ -520,10 +535,11 @@ ScopeParser.prototype = {
 
                         if (symbol == "eval") {
                             // look back one and see if we can find a comment!!!
-                            if (this.ts.look(-1).type == "COMM") {
+                            //if (this.ts.look(-1).type == "COMM") {
+                            if (token.prefix && token.prefix.match('/eval/')) {
                                 // look for eval:var:noreplace\n
                                 var _t = this;
-                                this.ts.look(-1).data.replace(/eval:var:([a-z_]+)/ig, function(m, a) {
+                                token.prefix.replace(/eval:var:([a-z_]+)/ig, function(m, a) {
                                     
                                     var hi = _t.getIdentifier(a, thisScope, token);
                                    // println("PROTECT "+a+" from munge" + (hi ? "FOUND" : "MISSING"));
@@ -627,21 +643,24 @@ ScopeParser.prototype = {
                         case '(': //Token.LP:
                         case '{': //Token.LC:
                         case '[': //Token.LB:
-                            print('SCOPE-CURLY/PAREN/BRACE:' + token.toString());
+                            //print('SCOPE-CURLY/PAREN/BRACE:' + token.toString());
+                           // print('SCOPE-CURLY/PAREN/BRACE:' + JSON.stringify(token, null,4));
                             //println("<i>"+token.data+"</i>");
                             var curTS = this.ts;
                             if (token.props) {
                                 
                                 for (var prop in token.props) {
-                                    if (token.props[prop].val.data == 'function') {
+                                    if (token.props[prop].val[0].data == 'function') {
                                         // parse a function..
-                                        this.parseFunctProp(token.props[prop]);
+                                        this.ts = new TokenStream(token.props[prop].val);
+                                        this.ts.nextTok();
+                                        this.parseFunctionDeclaration();
                                         continue;
                                     }
                                     // key value..
                                     
                                     this.ts = new TokenStream(token.props[prop].val);
-                                    this.parseScope(false);
+                                    this.parseExpression();
                                     
                                 }
                                 this.ts = curTS;
@@ -763,10 +782,10 @@ ScopeParser.prototype = {
                     if (this.mode == 'BUILDING_SYMBOL_TREE') {
 
                         if (symbol == "eval") {
-                            if (this.ts.look(-1).type == 'COMM') {
+                            if (token.prefix && token.prefix.match('/eval/')) {
                                 // look for eval:var:noreplace\n
                                 var _t = this;
-                                this.ts.look(-1).data.replace(/eval:var:([a-z]+)/ig, function(m, a) {
+                                token.prefix.replace(/eval:var:([a-z]+)/ig, function(m, a) {
                                     var hi = _t.getIdentifier(a, currentScope, token);
                                    //println("PROTECT "+a+" from munge" + (hi ? "FOUND" : "MISSING"));
                                     if (hi) {
@@ -804,28 +823,30 @@ ScopeParser.prototype = {
         var token;
         var currentScope;
         var identifier;
-
+        
         //token = getToken(-1);
         //assert token.getType() == Token.CATCH;
         token = this.ts.nextTok();
+        
+        //print(JSON.stringify(token,null,4));
         //assert token.getType() == Token.LP; (
         //token = this.ts.nextTok();
         //assert token.getType() == Token.NAME;
         
-        symbol = token.items[0].data;
+        symbol = token.items[0][0].data;
         currentScope = this.scopes[this.scopes.length-1];
 
         if (this.mode == 'BUILDING_SYMBOL_TREE') {
             // We must declare the exception identifier in the containing function
             // scope to avoid errors related to the obfuscation process. No need to
             // display a warning if the symbol was already declared here...
-            currentScope.declareIdentifier(symbol, token);
+            currentScope.declareIdentifier(symbol, token.items[0][0]);
         } else {
             //?? why inc the refcount?? - that should be set when building the tree???
-            identifier = this.getIdentifier(symbol, currentScope, token);
+            identifier = this.getIdentifier(symbol, currentScope, token.items[0][0]);
             identifier.refcount++;
         }
-
+        
         token = this.ts.nextTok();
         //assert token.getType() == Token.RP; // )
     },
@@ -855,7 +876,13 @@ ScopeParser.prototype = {
             }
             token =  this.ts.nextTok();
         }
-
+        // return function() {.... 
+        if (token.name == "RETURN") {
+            token =  this.ts.nextTok();
+        }
+        if (token.name == "FUNCTION") {
+            token =  this.ts.nextTok();
+        }
         //assert token.getType() == Token.LP;
         if (this.mode == 'BUILDING_SYMBOL_TREE') {
             fnScope = new Scope(1, currentScope, token.n, '', token);
@@ -867,10 +894,9 @@ ScopeParser.prototype = {
         } else {
             //qln("FETCHING SCOPE" + this.ts.cursor);
             fnScope = this.indexedScopes[token.id];
-          
         }
         //if (this.mode == 'BUILDING_SYMBOL_TREE') 
-        //    print('FUNC-PARSE:' + JSON.stringify(token,null,4));
+           // print('FUNC-PARSE:' + JSON.stringify(token,null,4));
         // Parse function arguments.
         var args = token.items;
         for (var argpos =0; argpos < args.length; argpos++) {