1 //<Script type="text/javascript">
6 * // FIXME - I need this to do next() without doccomments..
9 Identifier = imports['JSDOC/Identifier.js'].Identifier
10 XObject = imports.XObject.XObject;
13 function Scope(braceN, parent, startTokN, lastIdent)
15 if (lastIdent.length) {
16 // println("NEW SCOPE: " + lastIdent);
22 this.identifiers = { };
25 this.ident = lastIdent;
28 //println("ADD SCOPE(" + this.id + ") TO "+ (parent ? this.parent.id : 'TOP') + "<BR/>");
31 this.parent.subScopes.push(this);
54 protectedVars : {}, // only used by to parent..
55 declareIdentifier : function(symbol, token) {
57 //println("ADD IDENT(" + this.id + "):<B>" + symbol+"</B><BR/>");
59 if (typeof(this.identifiers[symbol])== 'undefined') {
61 this.identifiers[symbol] = new Identifier(symbol, this);
64 if (typeof(token) != 'undefined') { // shoudl this happen?
65 token.identifier = this.identifiers[symbol];
68 if (this.braceN < 0) {
69 // then it's global...
70 this.identifiers[symbol].toMunge = false;
72 this.addToParentScope(symbol);
73 return this.identifiers[symbol];
75 getIdentifier : function(symbol) {
76 return (typeof(this.identifiers[symbol])== 'undefined') ? false : this.identifiers[symbol];
79 addHint : function(varName, varType) {
80 this.hint[varName] = varType;
82 preventMunging : function() {
88 getUsedSymbols : function() {
91 // if (this.usedsymcache !== false) {
92 // return this.usedsymcache;
95 var idents = this.identifiers;
96 for(var i in idents) {
97 //println('<b>'+i+'</b>='+typeof(idents[i]) +'<br/>');
98 var identifier = this.identifiers[i];
99 var mungedValue = identifier.mungedValue
100 if (!mungedValue.length) {
101 //println(identifier.toSource());
102 mungedValue = identifier.name;
104 result.push(mungedValue);
106 //println("Symbols for ("+ this.id +"): <B>" + result.join(',') + "</B><BR/>");
107 //this.usedsymcache = result;
111 getAllUsedSymbols :function() {
112 var result = this.getUsedSymbols();
113 var scope = this.parent;
114 while (scope !== false) {
115 //println("addused:"+scope.id);
116 result = result.concat(scope.getUsedSymbols());
117 scope = scope.parent;
119 //println("Done - addused");
122 /** - we need to register short vairalbes so they never get munged into.. */
123 addToParentScope: function(ident) {
124 if (ident.length > 2) {
127 var scope = this.parent;
128 while (scope !== false) {
129 //println("addused:"+scope.id);
131 scope.protectedVars[ident] = true;
133 scope = scope.parent;
137 isProtectedVar: function(ident) {
138 if (ident.length > 2) {
141 var scope = this.parent;
142 while (scope !== false) {
143 //println("addused:"+scope.id);
145 if (typeof(scope.protectedVars[ident]) != 'undefined') return true;
147 scope = scope.parent;
157 // Stop right here if this scope was flagged as unsafe for munging.
158 // println("MUNGE: SKIP - Scope" + this.id+"</BR>");
166 //println("MUNGE: Scope:" + this.id+"</BR>");
170 // Do not munge symbols in the global scope!
174 //println("MUNGE: Building FreeSyms:" + this.id+"</BR>");
176 var freeSymbols = [];
177 var sy = this.getAllUsedSymbols();
179 var addSyms=function(batch)
181 for(var i =0;i<batch.length;i++) {
182 if (sy.indexOf(batch[i]) > -1) {
185 freeSymbols.push(batch[i]);
189 var exsymbols = function(n) {
190 if (sy.indexOf(n) > -1) {
196 addSyms(JSDOC.Scope.ones);
198 //if (freeSymbols.length == 0) {
200 // JSDOC.Scope.twos.filter(exsymbols);
203 //if (freeSymbols.length == 0) {
205 // throw "disabled threes!"
206 // JSDOC.Scope.threes.filter(exsymbols);
209 //if (freeSymbols.length == 0) {
210 // throw "The Compressor ran out of symbols. Aborting...???? ";
213 //println(freeSymbols.toSource());
215 //println("MUNGE: Replacing " + this.id+"</BR>");
216 for (var i in this.identifiers) {
218 // is the identifer in the global scope!?!!?
221 if (!this.identifiers[i].toMunge) {
225 if (this.isProtectedVar(i)) {
231 if (this.identifiers[i].constructor != JSDOC.Identifier) {
234 // println("IDENT:" +i+'</BR>');
236 if (!repsym.length) {
237 if (!freeSymbols.length) {
238 addSyms(JSDOC.Scope.twos);
240 repsym = freeSymbols.shift(); // pop off beginngin???
243 var identifier = this.identifiers[i];
244 //println(typeof(identifier.name));
245 var mungedValue = identifier.name;
247 //println([ repsym,mungedValue ]);
249 if (this.mungeM && repsym.length < mungedValue.length) {
250 //println("REPLACE:"+ mungedValue +" with " + repsym + "<BR>");
251 mungedValue = repsym;
254 identifier.mungedValue = mungedValue;
256 //println("MUNGE: Done " + this.id+"</BR>");
259 //println("Doing sub scopes");
260 for (var i = 0; i < this.subScopes.length; i++) {
261 var ss = this.subScopes[i];
273 XObject.extend(Scope, {
275 builtin : ["NaN","top"],
276 skips : [ 'as', 'is', 'do', 'if', 'in', 'for', 'int', 'new', 'try', 'use', 'var', "NaN","top"],
283 if (File.exists('/tmp/var_list_ones.js')) {
284 eval("JSDOC.Scope.ones = " + File.read('/tmp/var_list_ones.js'));
285 eval("JSDOC.Scope.twos = " + File.read('/tmp/var_twos_ones.js'));
286 eval("JSDOC.Scope.threes = " + File.read('/tmp/var_threes_ones.js'));
289 this.ones = 'A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'.split(',');
291 var n = a.concat( '0,1,2,3,4,5,6,7,8,9'.split(','));
292 for(var i = 0; i < a.length; i++) {
293 for(var j = 0; j < n.length; j++) {
294 var tw = a[i] + n[j];
295 if (this.skips.indexOf(tw) < 0) {
300 for(var k = 0; k < n.length; k++) {
301 var thr = a[i] + n[j] + n[k];
302 //println("thr="+ thr + ":iOf="+this.skips.indexOf(thr) );
303 if (this.skips.indexOf(thr) < 0) {
305 this.threes.push(thr);
312 //println("done creating var list");
313 //println("threes="+ this.threes.toSource());
319 // init the scope constants..