From 7667e16732268944232d31cea6a201698ce0661a Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 14 Feb 2010 17:35:14 -0500 Subject: [PATCH] implementing grayrest's suggested cleanup for object comprehensions --- lib/coffee_script/grammar.js | 36 ++++++++++++++++----------------- lib/coffee_script/nodes.js | 16 +++++---------- lib/coffee_script/rewriter.js | 14 +++++-------- lib/coffee_script/scope.js | 16 ++++++--------- lib/coffee_script/underscore.js | 26 +++++++++--------------- src/nodes.coffee | 10 ++------- 6 files changed, 44 insertions(+), 74 deletions(-) diff --git a/lib/coffee_script/grammar.js b/lib/coffee_script/grammar.js index 7fcf62ab..b623fb61 100644 --- a/lib/coffee_script/grammar.js +++ b/lib/coffee_script/grammar.js @@ -522,26 +522,24 @@ bnf = {}; tokens = []; __a = grammar; - for (name in __a) { + for (name in __a) if (__hasProp.call(__a, name)) { non_terminal = __a[name]; - if (__hasProp.call(__a, name)) { - bnf[name] = (function() { - __b = []; __c = non_terminal; - for (__d = 0; __d < __c.length; __d++) { - option = __c[__d]; - __b.push((function() { - __e = option[0].split(" "); - for (__f = 0; __f < __e.length; __f++) { - part = __e[__f]; - !grammar[part] ? tokens.push(part) : null; - } - name === "Root" ? (option[1] = "return " + option[1]) : null; - return option; - }).call(this)); - } - return __b; - }).call(this); - } + bnf[name] = (function() { + __b = []; __c = non_terminal; + for (__d = 0; __d < __c.length; __d++) { + option = __c[__d]; + __b.push((function() { + __e = option[0].split(" "); + for (__f = 0; __f < __e.length; __f++) { + part = __e[__f]; + !grammar[part] ? tokens.push(part) : null; + } + name === "Root" ? (option[1] = "return " + option[1]) : null; + return option; + }).call(this)); + } + return __b; + }).call(this); } tokens = tokens.join(" "); parser = new Parser({ diff --git a/lib/coffee_script/nodes.js b/lib/coffee_script/nodes.js index 1fedb867..9f9f6f43 100644 --- a/lib/coffee_script/nodes.js +++ b/lib/coffee_script/nodes.js @@ -38,11 +38,9 @@ klass.prototype = new __a(); klass.prototype.constructor = klass; __b = props; - for (name in __b) { + for (name in __b) if (__hasProp.call(__b, name)) { prop = __b[name]; - if (__hasProp.call(__b, name)) { - ((klass.prototype[name] = prop)); - } + ((klass.prototype[name] = prop)); } return klass; }; @@ -1060,7 +1058,7 @@ return true; }, compile_node: function compile_node(o) { - var body, body_dent, call, for_part, index, index_found, index_var, ivar, name, name_found, range, return_result, rvar, scope, set_result, source, source_part, step_part, svar, top_level, var_part, vars; + var body, body_dent, for_part, index, index_found, index_var, ivar, name, name_found, range, return_result, rvar, scope, set_result, source, source_part, step_part, svar, top_level, var_part, vars; top_level = del(o, 'top') && !o.returns; range = this.source instanceof ValueNode && this.source.base instanceof RangeNode && !this.source.properties.length; source = range ? this.source.base : this.source; @@ -1088,7 +1086,7 @@ index_var = null; source_part = svar + ' = ' + this.source.compile(o) + ';\n' + this.idt(); step_part = this.step ? ivar + ' += ' + this.step.compile(o) : ivar + '++'; - for_part = this.object ? ivar + ' in ' + svar : ivar + ' = 0; ' + ivar + ' < ' + svar + '.length; ' + step_part; + for_part = ivar + ' = 0; ' + ivar + ' < ' + svar + '.length; ' + step_part; if (name) { var_part = body_dent + name + ' = ' + svar + '[' + ivar + '];\n'; } @@ -1116,11 +1114,7 @@ } if (this.object) { o.scope.assign('__hasProp', 'Object.prototype.hasOwnProperty', true); - call = new CallNode(new ValueNode(new LiteralNode('__hasProp'), [new AccessorNode(new LiteralNode('call'))]), [new LiteralNode(svar), new LiteralNode(ivar)]); - body = Expressions.wrap([new IfNode(call, Expressions.wrap([body]), null, { - statement: true - }) - ]); + for_part = ivar + ' in ' + svar + ') if (__hasProp.call(' + svar + ', ' + ivar + ')'; } if (!(top_level)) { return_result = '\n' + this.idt() + return_result + ';'; diff --git a/lib/coffee_script/rewriter.js b/lib/coffee_script/rewriter.js index 3b097b85..8fa4c3c2 100644 --- a/lib/coffee_script/rewriter.js +++ b/lib/coffee_script/rewriter.js @@ -297,12 +297,10 @@ })(this)); unclosed = (function() { __i = []; __j = levels; - for (key in __j) { + for (key in __j) if (__hasProp.call(__j, key)) { value = __j[key]; - if (__hasProp.call(__j, key)) { - if (value > 0) { - __i.push(key); - } + if (value > 0) { + __i.push(key); } } return __i; @@ -329,11 +327,9 @@ stack = []; debt = {}; __i = INVERSES; - for (key in __i) { + for (key in __i) if (__hasProp.call(__i, key)) { val = __i[key]; - if (__hasProp.call(__i, key)) { - ((debt[key] = 0)); - } + ((debt[key] = 0)); } return this.scan_tokens((function(__this) { var __func = function(prev, token, post, i) { diff --git a/lib/coffee_script/scope.js b/lib/coffee_script/scope.js index 01a7cbfd..1581c7a2 100644 --- a/lib/coffee_script/scope.js +++ b/lib/coffee_script/scope.js @@ -79,12 +79,10 @@ var __a, __b, key, val; return ((function() { __a = []; __b = this.variables; - for (key in __b) { + for (key in __b) if (__hasProp.call(__b, key)) { val = __b[key]; - if (__hasProp.call(__b, key)) { - if (val === 'var') { - __a.push(key); - } + if (val === 'var') { + __a.push(key); } } return __a; @@ -96,12 +94,10 @@ var __a, __b, key, val; return ((function() { __a = []; __b = this.variables; - for (key in __b) { + for (key in __b) if (__hasProp.call(__b, key)) { val = __b[key]; - if (__hasProp.call(__b, key)) { - if (val.assigned) { - __a.push([key, val.value]); - } + if (val.assigned) { + __a.push([key, val.value]); } } return __a; diff --git a/lib/coffee_script/underscore.js b/lib/coffee_script/underscore.js index 5527c963..df41bd4c 100644 --- a/lib/coffee_script/underscore.js +++ b/lib/coffee_script/underscore.js @@ -54,11 +54,9 @@ return __a; } __f = obj; - for (key in __f) { + for (key in __f) if (__hasProp.call(__f, key)) { val = __f[key]; - if (__hasProp.call(__f, key)) { - iterator.call(context, val, key, obj); - } + iterator.call(context, val, key, obj); } } catch (e) { if (e !== breaker) { @@ -180,12 +178,10 @@ return _.indexOf(obj, target) !== -1; } __a = obj; - for (key in __a) { + for (key in __a) if (__hasProp.call(__a, key)) { val = __a[key]; - if (__hasProp.call(__a, key)) { - if (val === target) { - return true; - } + if (val === target) { + return true; } } return false; @@ -528,11 +524,9 @@ return _.range(0, obj.length); } __a = []; __b = obj; - for (key in __b) { + for (key in __b) if (__hasProp.call(__b, key)) { val = __b[key]; - if (__hasProp.call(__b, key)) { - __a.push(key); - } + __a.push(key); } return __a; }; @@ -550,11 +544,9 @@ _.extend = function extend(destination, source) { var __a, key, val; __a = source; - for (key in __a) { + for (key in __a) if (__hasProp.call(__a, key)) { val = __a[key]; - if (__hasProp.call(__a, key)) { - destination[key] = val; - } + destination[key] = val; } return destination; }; diff --git a/src/nodes.coffee b/src/nodes.coffee index 07f47883..450f1507 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -896,7 +896,7 @@ ForNode: exports.ForNode: inherit Node, { index_var: null source_part: svar + ' = ' + @source.compile(o) + ';\n' + @idt() step_part: if @step then ivar + ' += ' + @step.compile(o) else ivar + '++' - for_part: if @object then ivar + ' in ' + svar else ivar + ' = 0; ' + ivar + ' < ' + svar + '.length; ' + step_part + for_part: ivar + ' = 0; ' + ivar + ' < ' + svar + '.length; ' + step_part var_part: body_dent + name + ' = ' + svar + '[' + ivar + '];\n' if name set_result: if rvar then @idt() + rvar + ' = []; ' else @idt() return_result: rvar or '' @@ -910,13 +910,7 @@ ForNode: exports.ForNode: inherit Node, { body: Expressions.wrap([new IfNode(@filter, body)]) if @object o.scope.assign('__hasProp', 'Object.prototype.hasOwnProperty', true) - call: new CallNode( - new ValueNode(new LiteralNode('__hasProp'), [new AccessorNode(new LiteralNode('call'))]) - [new LiteralNode(svar), new LiteralNode(ivar)] - ) - body: Expressions.wrap([new IfNode( - call, Expressions.wrap([body]), null, {statement: true} - )]) + for_part: ivar + ' in ' + svar + ') if (__hasProp.call(' + svar + ', ' + ivar + ')' return_result: '\n' + @idt() + return_result + ';' unless top_level body: body.compile(merge(o, {indent: body_dent, top: true})) vars: if range then name else name + ', ' + ivar