JSDOC/ScopeParser.js
authorAlan Knowles <alan@akkbhome.com>
Tue, 6 Jul 2010 13:39:12 +0000 (21:39 +0800)
committerAlan Knowles <alan@akkbhome.com>
Tue, 6 Jul 2010 13:39:12 +0000 (21:39 +0800)
JSDOC/ScopeParser.js [deleted file]

diff --git a/JSDOC/ScopeParser.js b/JSDOC/ScopeParser.js
deleted file mode 100644 (file)
index 1b315b0..0000000
+++ /dev/null
@@ -1,859 +0,0 @@
-//<Script type="text/javascript">
-
-Scope = imports['JSDOC/Scope.js'].Scope;
-
-/**
-* Scope stuff
-* 
-* // FIXME - I need this to do next() without doccomments..
-*/
-
-ScopeParser = function(ts) {
-    this.ts = ts; // {TokenStream}
-    this.warnings = [];
-    this.scopes = [];
-    this.indexedScopes = {};
-    this.timer = new Date() * 1;
-    this.debug = false;
-}
-
-// list of keywords that should not be used in object literals.
-ScopeParser.idents = [
-       "break",         
-        "case",                 
-        "continue",    
-        "default",     
-        "delete",      
-        "do",           
-       "else",         
-       "export",       
-       "false",        
-       "for",          
-       "function",     
-       "if",           
-       "import",       
-       "in",           
-       "new",          
-       "null",         
-       "return",       
-       "switch",       
-       "this",         
-       "true",         
-       "typeof",       
-       "var",          
-       "void",         
-       "while",        
-       "with",         
-
-       "catch",        
-       "class",        
-       "const",        
-       "debugger",     
-       "enum",         
-       "extends",      
-       "finally",      
-       "super",        
-        "throw",        
-        "try",         
-
-        "abstract",    
-        "boolean",     
-        "byte",                
-        "char",                
-        "double",      
-        "final",       
-        "float",       
-        "goto",                
-        "implements", 
-        "instanceof",
-        "int",          
-        "interface",    
-        "long",                 
-        "native",      
-        "package",     
-        "private",     
-        "protected",    
-        "public",       
-        "short",       
-        "static",      
-        "synchronized",         
-        "throws",       
-        "transient",    
-               "include",       
-               "undefined"
-];
-
-
-ScopeParser.prototype = {
-    timer: 0,
-    timerPrint: function (str) {
-        var ntime = new Date() * 1;
-        var tdif =  ntime -this.timer;
-        this.timer = ntime;
-        var pref = '';
-        if (tdif > 100) { //slower ones..
-            pref = '***';
-        }
-        println(pref+'['+tdif+']'+str);
-        
-    },
-    warn: function(s) {
-        //print('****************' + s);
-        this.warnings.push(s);
-        //println("WARNING:" + htmlescape(s) + "<BR>");
-    },
-    // defaults should not be initialized here =- otherwise they get duped on new, rather than initalized..
-    warnings : false,
-    ts : false,
-    scopes : false,
-    global : false,
-    mode : "", //"BUILDING_SYMBOL_TREE",
-    braceNesting : 0,
-    indexedScopes : false,
-    munge: true,
-
-
-
-
-
-    buildSymbolTree : function()
-    {
-        //println("<PRE>");
-        
-        this.ts.rewind();
-        this.braceNesting = 0;
-        this.scopes = [];
-        
-        
-        
-        
-        this.globalScope = new  Scope(-1, false, -1, '');
-        indexedScopes = { 0 : this.globalScope };
-        
-        this.mode = 'BUILDING_SYMBOL_TREE';
-        this.parseScope(this.globalScope);
-        
-        //print("---------------END PASS 1 ---------------- ");
-        
-    },
-    mungeSymboltree : function()
-    {
-
-        if (!this.munge) {
-            return;
-        }
-
-        // One problem with obfuscation resides in the use of undeclared
-        // and un-namespaced global symbols that are 3 characters or less
-        // in length. Here is an example:
-        //
-        //     var declaredGlobalVar;
-        //
-        //     function declaredGlobalFn() {
-        //         var localvar;
-        //         localvar = abc; // abc is an undeclared global symbol
-        //     }
-        //
-        // In the example above, there is a slim chance that localvar may be
-        // munged to 'abc', conflicting with the undeclared global symbol
-        // abc, creating a potential bug. The following code detects such
-        // global symbols. This must be done AFTER the entire file has been
-        // parsed, and BEFORE munging the symbol tree. Note that declaring
-        // extra symbols in the global scope won't hurt.
-        //
-        // Note: Since we go through all the tokens to do this, we also use
-        // the opportunity to count how many times each identifier is used.
-
-        this.ts.rewind();
-        this.braceNesting = 0;
-        this.scopes= [];
-        this.mode = 'PASS2_SYMBOL_TREE';
-        
-        //println("MUNGING?");
-        
-        this.parseScope(this.globalScope);
-        this.globalScope.munge();
-    },
-
-
-    log : function(str)
-    {
-        print ("                    ".substring(0, this.braceNesting*2) + str);
-        
-        //println("<B>LOG:</B>" + htmlescape(str) + "<BR/>\n");
-    },
-    logR : function(str)
-    {
-            //println("<B>LOG:</B>" + str + "<BR/>");
-    },
-
-
-
-
-
-
-    parseScope : function(scope) // parse a token stream..
-    {
-        //this.timerPrint("parseScope EnterScope"); 
-        //this.log(">>> ENTER SCOPE" + this.scopes.length);
-        var symbol;
-        var token;
-        
-        var identifier;
-
-        var expressionBraceNesting = this.braceNesting;
-        
-        var parensNesting = 0;
-        
-        var isObjectLitAr = [ false ];
-        var isInObjectLitAr;
-        this.scopes.push(scope);
-        token = this.ts.lookTok(1);
-        while (token) {
-          //  this.timerPrint("parseScope AFTER lookT: " + token.toString()); 
-             
-            //this.log(token.data);
-            if (token.type == 'NAME') {
-            //    print('*' + token.data);
-            }
-            switch(token.type + '.' + token.name) {
-                case "KEYW.VAR":
-                case "KEYW.CONST": // not really relivant as it's only mozzy that does this.
-                    
-                    //this.log("parseScope GOT VAR/CONST : " + token.toString()); 
-                    while (true) {
-                        token = this.ts.nextTok();
-                        !this.debug|| print( token.toString());
-                      
-                        if (!token) { // can return false at EOF!
-                            break;
-                        }
-                        if (token.name == "VAR" || token.data == ',') { // kludge..
-                            continue;
-                        }
-                        //this.logR("parseScope GOT VAR  : <B>" + token.toString() + "</B>"); 
-                        if (token.type !="NAME") {
-                            for(var i = Math.max(this.ts.cursor-10,0); i < this.ts.cursor+1; i++) {
-                                print(this.ts.tokens[i].toString());
-                            }
-                            
-                            print( "var without ident");
-                            Seed.quit()
-                        }
-                        
-
-                        if (this.mode == "BUILDING_SYMBOL_TREE") {
-                            identifier = scope.getIdentifier(token.data) ;
-                            
-                            if (identifier == false) {
-                                scope.declareIdentifier(token.data, token);
-                            } else {
-                                token.identifier = identifier;
-                                this.warn("(SCOPE) The variable " + token.data  + ' (line:' + token.line + ")  has already been declared in the same scope...");
-                            }
-                        }
-
-                        token = this.ts.nextTok();
-                        !this.debug|| print(token.toString());
-                        /*
-                        assert token.getType() == Token.SEMI ||
-                                token.getType() == Token.ASSIGN ||
-                                token.getType() == Token.COMMA ||
-                                token.getType() == Token.IN;
-                        */
-                        if (token.name == "IN") {
-                            break;
-                        } else {
-                            //var bn = this.braceNesting;
-                            this.parseExpression();
-                            //this.braceNesting = bn;
-                            //this.logR("parseScope DONE  : <B>ParseExpression</B> - tok is:" + this.ts.lookT(0).toString()); 
-                            
-                            token = this.ts.lookTok(1);
-                            !this.debug|| print("AFTER EXP: " + token.toString());
-                            if (token.data == ';') {
-                                break;
-                            }
-                        }
-                    }
-                    break;
-                case "KEYW.FUNCTION":
-                    //println("<i>"+token.data+"</i>");
-                     var bn = this.braceNesting;
-                    this.parseFunctionDeclaration();
-                     this.braceNesting = bn;
-                    break;
-
-                case "PUNC.LEFT_CURLY": // {
-                    //println("<i>"+token.data+"</i>");
-                    isObjectLitAr.push(false);
-                    this.braceNesting++;
-                    
-                    //print(">>>>>> OBJLIT PUSH(false)" + this.braceNesting);
-                    break;
-
-                case "PUNC.RIGHT_CURLY": // }
-                    //println("<i>"+token.data+"</i>");
-                    this.braceNesting--;
-                    isObjectLitAr.pop();
-                    //print(">>>>>> OBJLIT POP"+ this.braceNesting);
-                        //assert braceNesting >= scope.getBra ceNesting();
-                    
-                    if (this.braceNesting < expressionBraceNesting) {
-                        var ls = this.scopes.pop();
-                        ls.getUsedSymbols();
-                        // eat symbol if we are currently at { 
-                        if (this.ts.look(0).data == '{') {
-                            this.ts.nextTok();
-                        }
-                        
-                        //print("<<<<<<<EXIT SCOPE" +this.scopes.length);
-                        return;
-                    }
-                    break;
-
-                case "KEYW.WITH":
-                    //println("<i>"+token.data+"</i>");   
-                    if (this.mode == "BUILDING_SYMBOL_TREE") {
-                        // Inside a 'with' block, it is impossible to figure out
-                        // statically whether a symbol is a local variable or an
-                        // object member. As a consequence, the only thing we can
-                        // do is turn the obfuscation off for the highest scope
-                        // containing the 'with' block.
-                        this.protectScopeFromObfuscation(scope);
-                        this.warn("Using 'with' is not recommended." + (this.munge ? " Moreover, using 'with' reduces the level of compression!" : ""), true);
-                    }
-                    break;
-
-                case "KEYW.CATCH":
-                    //println("<i>"+token.data+"</i>");
-                    this.parseCatch();
-                    break;
-                /*
-                case Token.SPECIALCOMMENT:
-                        if (mode == BUILDING_SYMBOL_TREE) {
-                            protectScopeFromObfuscation(scope);
-                            this.warn("Using JScript conditional comments is not recommended." + (munge ? " Moreover, using JScript conditional comments reduces the level of compression." : ""), true);
-                        }
-                        break;
-                */
-                
-                case "STRN.DOUBLE_QUOTE": // used for object lit detection..
-                case "STRN.SINGLE_QUOTE":
-                    //println("<i>"+token.data+"</i>");
-                    if (this.ts.lookTok(-1).data == '{' && this.ts.lookTok(1).data == ':') {
-                        // then we are in an object lit.. -> we need to flag the brace as such...
-                        isObjectLitAr.pop();
-                        isObjectLitAr.push(true);
-                        //print(">>>>>> OBJLIT REPUSH(true)");
-                    }
-                    isInObjectLitAr = isObjectLitAr[isObjectLitAr.length-1];
-                    
-                    if (isInObjectLitAr &&  this.ts.lookTok(1).data == ':' &&
-                        ( this.ts.lookTok(-1).data == '{'  ||  this.ts.lookTok(-1).data == ':' )) {
-                        // see if we can replace..
-                        // remove the quotes..
-                        // should do a bit more checking!!!! (what about wierd char's in the string..
-                        var str = token.data.substring(1,token.data.length-1);
-                        if (/^[a-z_]+$/i.test(str) && ScopeParser.idents.indexOf(str) < 0) {
-                            token.outData = str;
-                        }
-                        
-                         
-                        
-                    }
-                    
-                    
-                    
-                    break;
-                
-                case "NAME.NAME":
-                
-                    //print("DEAL WITH NAME:");
-                    // got identifier..
-                    
-                    // look for  { ** : <- indicates obj literal.. ** this could occur with numbers ..
-                    if ((this.ts.lookTok(-1).data == "{") && (this.ts.lookTok(1).data == ":")) {
-                        isObjectLitAr.pop();
-                        isObjectLitAr.push(true);
-                        //print(">>>>>> OBJLIT REPUSH(true)");
-                        //println("<i>"+token.data+"</i>");
-                        break;
-                    }
-                   // print("DEAL WITH obj lit:");
-                    isInObjectLitAr = isObjectLitAr[isObjectLitAr.length-1];
-                    
-                    if (isInObjectLitAr && (this.ts.lookTok(1).data == ":") && (this.ts.lookTok(-1).data == ",")) {
-                        // skip, it's an object lit key..
-                        //println("<i>"+token.data+"</i>");
-                        break;
-                    }
-                    
-                    
-                    // skip anyting with "." before it..!!
-                     
-                    if (this.ts.lookTok(-1).data == ".") {
-                        // skip, it's an object prop.
-                        //println("<i>"+token.data+"</i>");
-                        break;
-                    }
-                    symbol = token.data;
-                    if (this.mode == 'PASS2_SYMBOL_TREE') {
-                        
-                        //println("GOT IDENT: -2 : " + this.ts.lookT(-2).toString() + " <BR> ..... -1 :  " +  this.ts.lookT(-1).toString() + " <BR> "); 
-                        
-                        //print ("MUNGE?" + symbol);
-                        
-                        //println("GOT IDENT: <B>" + symbol + "</B><BR/>");
-                             
-                            //println("GOT IDENT (2): <B>" + symbol + "</B><BR/>");
-                        identifier = this.getIdentifier(symbol, scope);
-                        
-                        if (identifier == false) {
-// BUG!find out where builtin is defined...
-                            if (symbol.length <= 3 &&  Scope.builtin.indexOf(symbol) < 0) {
-                                // Here, we found an undeclared and un-namespaced symbol that is
-                                // 3 characters or less in length. Declare it in the global scope.
-                                // We don't need to declare longer symbols since they won't cause
-                                // any conflict with other munged symbols.
-                                this.globalScope.declareIdentifier(symbol, token);
-                                this.warn("Found an undeclared symbol: " + symbol + ' (line:' + token.line + ')', true);
-                            }
-                            
-                            //println("GOT IDENT IGNORE(3): <B>" + symbol + "</B><BR/>");
-                        } else {
-                            token.identifier = identifier;
-                            identifier.refcount++;
-                        }
-                    }   
-                    
-                    break;
-                    //println("<B>SID</B>");
-                default:
-                    if (token.type != 'KEYW') {
-                        break;
-                    }
-                   // print("Check eval:");
-                
-                    symbol = token.data;
-                    
-                     if (this.mode == 'BUILDING_SYMBOL_TREE') {
-
-                        if (symbol == "eval") {
-                            // look back one and see if we can find a comment!!!
-                            if (this.ts.look(-1).type == "COMM") {
-                                // look for eval:var:noreplace\n
-                                var _t = this;
-                                this.ts.look(-1).data.replace(/eval:var:([a-z_]+)/ig, function(m, a) {
-                                    
-                                    var hi = _t.getIdentifier(a, scope);
-                                   // println("PROTECT "+a+" from munge" + (hi ? "FOUND" : "MISSING"));
-                                    if (hi) {
-                                     //   println("PROTECT "+a+" from munge");
-                                        hi.toMunge = false;
-                                    }
-                                    
-                                });
-                                
-                                
-                            } else {
-                                
-                            
-                                this.protectScopeFromObfuscation(scope);
-                                this.warn("Using 'eval' is not recommended. (use  eval:var:noreplace in comments to optimize) " + (this.munge ? " Moreover, using 'eval' reduces the level of compression!" : ""), true);
-                            }
-
-                        }
-
-                    }
-                    break;
-                
-                
-            } // end switch
-            
-            
-            //this.timerPrint("parseScope TOK : " + token.toString()); 
-            token = this.ts.nextTok();
-            //if (this.ts.nextT()) break;
-            
-        }
-        //print("<<<<<<<EXIT SCOPE ERR?" +this.scopes.length);
-    },
-
-
-    parseExpression : function() {
-
-        // Parse the expression until we encounter a comma or a semi-colon
-        // in the same brace nesting, bracket nesting and paren nesting.
-        // Parse functions if any...
-        //println("<i>EXP</i><BR/>");
-        !this.debug || print("PARSE EXPR");
-        var symbol;
-        var token;
-        var currentScope;
-        var identifier;
-
-        var expressionBraceNesting = this.braceNesting;
-        var bracketNesting = 0;
-        var parensNesting = 0;
-        var isInObjectLitAr;
-        var isObjectLitAr = [ false ];
-        while (token = this.ts.lookTok()) {
-     
-
-            
-            currentScope = this.scopes[this.scopes.length-1];
-            
-            //println("<i>"+token.data+"</i>");
-            //this.log("EXP:" + token.data);
-            switch (token.type) {
-                case 'PUNC':
-                    switch(token.data) {
-                         
-                        case ';':
-                        case ',':
-                            if (this.braceNesting == expressionBraceNesting &&
-                                    bracketNesting == 0 &&
-                                    parensNesting == 0) {
-                                
-                                return;
-                            }
-                            break;
-
-                       
-
-                        case '{': //Token.LC:
-                            isObjectLitAr.push(false);
-                            
-                            this.braceNesting++;
-                            ///print(">>>>> EXP PUSH(false)"+this.braceNesting);
-                            break;
-
-                        case '}': //Token.RC:
-                            this.braceNesting--;
-                            isObjectLitAr.pop();
-                            //print(">>>>> EXP POP" + this.braceNesting);    
-                           // assert braceNesting >= expressionBraceNesting;
-                            break;
-
-                        case '[': //Token.LB:
-                            bracketNesting++;
-                            break;
-
-                        case ']': //Token.RB:
-                            bracketNesting--;
-                            break;
-
-                        case '(': //Token.LP:
-                            parensNesting++;
-                            break;
-
-                        case ')': //Token.RP:
-                            parensNesting--;
-                            break;
-                    }
-                    break;
-                    
-                case 'STRN': // used for object lit detection..
-                    if (this.ts.lookTok(-1).data == "{" && this.ts.lookTok(1).data == ":" ) {
-                        // then we are in an object lit.. -> we need to flag the brace as such...
-                        isObjectLitAr.pop();
-                        isObjectLitAr.push(true);
-                        //print(">>>>> EXP PUSH(true)");
-                    }
-                    
-                    
-                     
-                    isInObjectLitAr = isObjectLitAr[isObjectLitAr.length-1];
-                    if (isInObjectLitAr &&  this.ts.lookTok(1).data == ":"  &&
-                        ( this.ts.lookTok(-1).data == "{"  ||  this.ts.lookTok(-1).data == "," )) {
-                        // see if we can replace..
-                        // remove the quotes..
-                        var str = token.data.substring(1,token.data.length-1);
-                        if (/^[a-z_]+$/i.test(str) && ScopeParser.idents.indexOf(str) < 0) {
-                            token.outData = str;
-                        }
-                        
-                         
-                        
-                    }
-                    
-                    break;
-                
-                      
-             
-                case 'NAME':
-               
-                    symbol = token.data;
-                  
-                    if (this.ts.look(0).data == "{"  && this.ts.lookTok(2).data == ":") {
-                        // then we are in an object lit.. -> we need to flag the brace as such...
-                        isObjectLitAr.pop();
-                        isObjectLitAr.push(true);
-                         //print(">>>>> EXP  PUSH(true)");
-                        break;
-                    }
-                    isInObjectLitAr = isObjectLitAr[isObjectLitAr.length-1];
-                    if (isInObjectLitAr && this.ts.lookTok(0).data == "," && this.ts.lookTok(2).data == ":") {
-                        break;
-                    }
-                    //print(this.ts.lookTok(0).data);
-                    if (this.ts.lookTok(0).data == ".") {
-                        //skip '.'
-                        break;
-                    }
-                    
-                     if (this.mode == 'PASS2_SYMBOL_TREE') {
-
-                        identifier = this.getIdentifier(symbol, currentScope);
-                        //println("<B>??</B>");
-                        if (identifier == false) {
-
-                            if (symbol.length <= 3 &&  Scope.builtin.indexOf(symbol) < 0) {
-                                // Here, we found an undeclared and un-namespaced symbol that is
-                                // 3 characters or less in length. Declare it in the global scope.
-                                // We don't need to declare longer symbols since they won't cause
-                                // any conflict with other munged symbols.
-                                this.globalScope.declareIdentifier(symbol, token);
-                                this.warn("Found an undeclared symbol: " + symbol + ' (line:' + token.line + ')', true);
-                            } else {
-                                //println("undeclared")
-                            }
-                            
-                            
-                        } else {
-                            //println("<B>++</B>");
-                            token.identifier = identifier;
-                            identifier.refcount++;
-                        }
-                        
-                    }
-                    break;
-                    
-                    
-                    
-                    
-                    //println("<B>EID</B>");
-                 case 'KEYW':   
-                 
-                    if (token.name == "FUNCTION") {
-                        
-                        this.parseFunctionDeclaration();
-                        break;
-                    }
-               
-                    
-             
-                    symbol = token.data;
-                    if (this.mode == 'BUILDING_SYMBOL_TREE') {
-
-                        if (symbol == "eval") {
-                            if (this.ts.look(-1).type == 'COMM') {
-                                // look for eval:var:noreplace\n
-                                var _t = this;
-                                this.ts.look(-1).data.replace(/eval:var:([a-z]+)/ig, function(m, a) {
-                                    var hi = _t.getIdentifier(a, currentScope);
-                                   //println("PROTECT "+a+" from munge" + (hi ? "FOUND" : "MISSING"));
-                                    if (hi) {
-                                      //  println("PROTECT "+a+" from munge");
-                                        hi.toMunge = false;
-                                    }
-                                    
-                                    
-                                });
-                                
-                            } else {
-                                this.protectScopeFromObfuscation(currentScope);
-                                this.warn("Using 'eval' is not recommended." + (this.munge ? " Moreover, using 'eval' reduces the level of compression!" : ""), true);
-                            }
-                            
-
-                        }
-                        break;
-                    } 
-                   
-            }
-            if (!this.ts.nextTok()) break;
-        }
-    },
-
-
-    parseCatch : function() {
-
-        var symbol;
-        var token;
-        var currentScope;
-        var identifier;
-
-        //token = getToken(-1);
-        //assert token.getType() == Token.CATCH;
-        token = this.ts.nextTok();
-        //assert token.getType() == Token.LP; (
-        token = this.ts.nextTok();
-        //assert token.getType() == Token.NAME;
-        
-        symbol = token.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);
-        } else {
-            //?? why inc the refcount?? - that should be set when building the tree???
-            identifier = this.getIdentifier(symbol, currentScope);
-            identifier.refcount++;
-        }
-
-        token = this.ts.nextTok();
-        //assert token.getType() == Token.RP; // )
-    },
-    
-    parseFunctionDeclaration : function() 
-    {
-       // print("PARSE FUNCTION");
-        var symbol;
-        var token;
-        var currentScope  = false; 
-        var fnScope = false;
-        var identifier;
-        //this.logR("<B>PARSING FUNCTION</B>");
-        currentScope = this.scopes[this.scopes.length-1];
-
-        token = this.ts.nextTok();
-        if (token.type == "NAME") {
-            if (this.mode == 'BUILDING_SYMBOL_TREE') {
-                // Get the name of the function and declare it in the current scope.
-                symbol = token.data;
-                if (currentScope.getIdentifier(symbol) != false) {
-                    this.warn("The function " + symbol + " has already been declared in the same scope...", true);
-                }
-                currentScope.declareIdentifier(symbol,token);
-            }
-            token =  this.ts.nextTok();
-        }
-
-        //assert token.getType() == Token.LP;
-        if (this.mode == 'BUILDING_SYMBOL_TREE') {
-            fnScope = new Scope(this.braceNesting, currentScope, token.n, '');
-            
-            //println("STORING SCOPE" + this.ts.cursor);
-            
-            this.indexedScopes[this.ts.cursor] = fnScope;
-            
-        } else {
-            //qln("FETCHING SCOPE" + this.ts.cursor);
-            fnScope = this.indexedScopes[this.ts.cursor];
-          
-        }
-        
-        // Parse function arguments.
-        var argpos = 0;
-        while (this.ts.lookTok().data != ')') { //(token = consumeToken()).getType() != Token.RP) {
-            token = this.ts.nextTok();
-           // print ("FUNC ARGS: " + token.toString())
-            //assert token.getType() == Token.NAME ||
-            //        token.getType() == Token.COMMA;
-            if (token.type == 'NAME' && this.mode == 'BUILDING_SYMBOL_TREE') {
-                symbol = token.data;
-                identifier = fnScope.declareIdentifier(symbol,token);
-                if (symbol == "$super" && argpos == 0) {
-                    // Exception for Prototype 1.6...
-                    identifier.preventMunging();
-                }
-                argpos++;
-            }
-        }
-
-        token = this.ts.nextTok();
-        // assert token.getType() == Token.LC;
-        this.braceNesting++;
-
-        token = this.ts.nextTok();
-        if (token.type == "STRN" && this.ts.lookTok(1).data == ';') {
-            /*
-            
-            NOT SUPPORTED YET!?!!?!
-            
-            // This is a hint. Hints are empty statements that look like
-            // "localvar1:nomunge, localvar2:nomunge"; They allow developers
-            // to prevent specific symbols from getting obfuscated (some heretic
-            // implementations, such as Prototype 1.6, require specific variable
-            // names, such as $super for example, in order to work appropriately.
-            // Note: right now, only "nomunge" is supported in the right hand side
-            // of a hint. However, in the future, the right hand side may contain
-            // other values.
-            consumeToken();
-            String hints = token.getValue();
-            // Remove the leading and trailing quotes...
-            hints = hints.substring(1, hints.length() - 1).trim();
-            StringTokenizer st1 = new StringTokenizer(hints, ",");
-            while (st1.hasMoreTokens()) {
-                String hint = st1.nextToken();
-                int idx = hint.indexOf(':');
-                if (idx <= 0 || idx >= hint.length() - 1) {
-                    if (mode == BUILDING_SYMBOL_TREE) {
-                        // No need to report the error twice, hence the test...
-                        this.warn("Invalid hint syntax: " + hint, true);
-                    }
-                    break;
-                }
-                String variableName = hint.substring(0, idx).trim();
-                String variableType = hint.substring(idx + 1).trim();
-                if (mode == BUILDING_SYMBOL_TREE) {
-                    fnScope.addHint(variableName, variableType);
-                } else if (mode == CHECKING_SYMBOL_TREE) {
-                    identifier = fnScope.getIdentifier(variableName);
-                    if (identifier != null) {
-                        if (variableType.equals("nomunge")) {
-                            identifier.preventMunging();
-                        } else {
-                            this.warn("Unsupported hint value: " + hint, true);
-                        }
-                    } else {
-                        this.warn("Hint refers to an unknown identifier: " + hint, true);
-                    }
-                }
-            }
-            */
-        }
-
-        this.parseScope(fnScope);
-        // now pop it off the stack!!!
-       
-        
-        
-    },
-    
-    protectScopeFromObfuscation : function(scope) {
-            //assert scope != null;
-        
-        if (scope == this.globalScope) {
-            // The global scope does not get obfuscated,
-            // so we don't need to worry about it...
-            return;
-        }
-
-        // Find the highest local scope containing the specified scope.
-        while (scope && scope.parent != this.globalScope) {
-            scope = scope.parent;
-        }
-
-        //assert scope.getParentScope() == globalScope;
-        scope.preventMunging();
-    },
-    
-    getIdentifier: function(symbol, scope) {
-        var identifier;
-        while (scope != false) {
-            identifier = scope.getIdentifier(symbol);
-            //println("ScopeParser.getIdentgetUsedSymbols("+symbol+")=" + scope.getUsedSymbols().join(','));
-            if (identifier) {
-                return identifier;
-            }
-            scope = scope.parent;
-        }
-        return false;
-    }
-};
\ No newline at end of file