1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00

more refactors to utilities ... removing dependencies and the namespacing

This commit is contained in:
Jeremy Ashkenas 2010-03-30 19:27:38 -04:00
parent f3a60edc5d
commit 4a8c2e8a13
7 changed files with 46 additions and 60 deletions

View file

@ -11,11 +11,11 @@
(from < 0 ? from + array.length : from || 0),
(to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)
];
}, __bind = function(func, obj, args) {
}, __slice = Array.prototype.slice, __bind = function(func, obj, args) {
return function() {
return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);
};
}, __slice = Array.prototype.slice;
};
// `nodes.coffee` contains all of the node classes for the syntax tree. Most
// nodes are created as the result of actions in the [grammar](grammar.html),
// but some are created by other nodes as a method of code generation. To convert
@ -596,6 +596,7 @@
};
CurryNode.prototype.compile_node = function compile_node(o) {
var ref;
o.scope.utility('slice');
ref = new ValueNode(literal(o.scope.utility('bind')));
return (new CallNode(ref, [this.meth, this.context, literal(this.arguments(o))])).compile(o);
};
@ -1083,6 +1084,7 @@
if (!(this.bound)) {
return func;
}
o.scope.utility('slice');
ref = new ValueNode(literal(o.scope.utility('bind')));
return (new CallNode(ref, [literal(func), literal('this')])).compile(o);
};

View file

@ -1,10 +1,10 @@
(function(){
var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, INVERSES, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, helpers, include, pair;
var __bind = function(func, obj, args) {
var __slice = Array.prototype.slice, __bind = function(func, obj, args) {
return function() {
return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);
};
}, __slice = Array.prototype.slice, __hasProp = Object.prototype.hasOwnProperty;
}, __hasProp = Object.prototype.hasOwnProperty;
// The CoffeeScript language has a good deal of optional syntax, implicit syntax,
// and shorthand syntax. This can greatly complicate a grammar and bloat
// the resulting parse table. Instead of making the parser handle it all, we take

View file

@ -94,18 +94,13 @@
// Ensure the CoffeeScript utility object is included in the top level
// then return a CallNode curried constructor bound to the utility function
Scope.prototype.utility = function utility(name) {
var _a, _b, _c, _d, dep;
var _a;
if (this.parent) {
return Scope.root.utility(name);
}
if ((typeof (_d = utilities.functions[name]) !== "undefined" && _d !== null)) {
if ((typeof (_a = utilities[name]) !== "undefined" && _a !== null)) {
this.utilities = this.utilities || {};
this.utilities[name] = utilities.functions[name];
_b = (utilities.dependencies[name] || []);
for (_a = 0, _c = _b.length; _a < _c; _a++) {
dep = _b[_a];
!this.utilities[dep] ? this.utility(dep) : null;
}
this.utilities[name] = utilities[name];
}
return "__" + name;
};
@ -115,7 +110,7 @@
var _a, _b, key;
_a = []; _b = this.utilities;
for (key in _b) { if (__hasProp.call(_b, key)) {
_a.push("__" + key + " = " + (utilities.functions[key]));
_a.push("__" + key + " = " + (utilities[key]));
}}
return _a;
};

View file

@ -3,15 +3,10 @@
this.exports = this;
}
exports.utilities = {
dependencies: {
bind: ['slice']
},
functions: {
extend: "function(child, parent) {\n var ctor = function(){ };\n ctor.prototype = parent.prototype;\n child.__superClass__ = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n }",
bind: "function(func, obj, args) {\n return function() {\n return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);\n };\n }",
range: "function(array, from, to, exclusive) {\n return [\n (from < 0 ? from + array.length : from || 0),\n (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)\n ];\n }",
hasProp: 'Object.prototype.hasOwnProperty',
slice: 'Array.prototype.slice'
}
extend: "function(child, parent) {\n var ctor = function(){ };\n ctor.prototype = parent.prototype;\n child.__superClass__ = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n }",
bind: "function(func, obj, args) {\n return function() {\n return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);\n };\n }",
range: "function(array, from, to, exclusive) {\n return [\n (from < 0 ? from + array.length : from || 0),\n (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)\n ];\n }",
hasProp: 'Object.prototype.hasOwnProperty',
slice: 'Array.prototype.slice'
};
})();

View file

@ -430,6 +430,7 @@ exports.CurryNode: class CurryNode extends CallNode
(new ArrayNode(@args)).compile o
compile_node: (o) ->
o.scope.utility('slice')
ref: new ValueNode literal(o.scope.utility('bind'))
(new CallNode(ref, [@meth, @context, literal(@arguments(o))])).compile o
@ -801,6 +802,7 @@ exports.CodeNode: class CodeNode extends BaseNode
func: "function${ if @bound then '' else name_part }(${ params.join(', ') }) {$code${@idt(if @bound then 1 else 0)}}"
func: "($func)" if top and not @bound
return func unless @bound
o.scope.utility('slice')
ref: new ValueNode literal(o.scope.utility('bind'))
(new CallNode ref, [literal(func), literal('this')]).compile o

View file

@ -69,16 +69,15 @@ exports.Scope: class Scope
# then return a CallNode curried constructor bound to the utility function
utility: (name) ->
return Scope.root.utility(name) if @parent
if utilities.functions[name]?
if utilities[name]?
@utilities: or {}
@utilities[name]: utilities.functions[name]
@utility(dep) for dep in (utilities.dependencies[name] or []) when not @utilities[dep]
@utilities[name]: utilities[name]
"__$name"
# Formats an javascript object containing the utility methods required
# in the scope
included_utilities: ->
"__$key = ${utilities.functions[key]}" for key of @utilities
"__$key = ${utilities[key]}" for key of @utilities
# Does this scope reference any variables that need to be declared in the
# given function body?

View file

@ -2,42 +2,35 @@ this.exports: this unless process?
exports.utilities: {
dependencies: {
bind: ['slice']
}
extend: """
function(child, parent) {
var ctor = function(){ };
ctor.prototype = parent.prototype;
child.__superClass__ = parent.prototype;
child.prototype = new ctor();
child.prototype.constructor = child;
}
"""
functions: {
bind: """
function(func, obj, args) {
return function() {
return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);
};
}
"""
extend: """
function(child, parent) {
var ctor = function(){ };
ctor.prototype = parent.prototype;
child.__superClass__ = parent.prototype;
child.prototype = new ctor();
child.prototype.constructor = child;
}
"""
range: """
function(array, from, to, exclusive) {
return [
(from < 0 ? from + array.length : from || 0),
(to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)
];
}
"""
bind: """
function(func, obj, args) {
return function() {
return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);
};
}
"""
hasProp: 'Object.prototype.hasOwnProperty'
range: """
function(array, from, to, exclusive) {
return [
(from < 0 ? from + array.length : from || 0),
(to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)
];
}
"""
hasProp: 'Object.prototype.hasOwnProperty'
slice: 'Array.prototype.slice'
}
slice: 'Array.prototype.slice'
}