Fixes #494: Forcing named classes in CoffeeScript (named functions) ... even in IE.

This commit is contained in:
Jeremy Ashkenas 2011-12-18 20:00:09 -05:00
parent 8d8c345216
commit 1018c51359
7 changed files with 76 additions and 6 deletions

View File

@ -7,7 +7,7 @@
_ref2 = require('./helpers'), count = _ref2.count, starts = _ref2.starts, compact = _ref2.compact, last = _ref2.last;
exports.Lexer = Lexer = (function() {
Lexer.name = 'Lexer';
function Lexer() {}
Lexer.prototype.tokenize = function(code, opts) {

View File

@ -30,7 +30,7 @@
};
exports.Base = Base = (function() {
Base.name = 'Base';
function Base() {}
Base.prototype.compile = function(o, lvl) {
@ -191,6 +191,8 @@
__extends(Block, _super);
Block.name = 'Block';
function Block(nodes) {
this.expressions = compact(flatten(nodes || []));
}
@ -385,6 +387,8 @@
__extends(Literal, _super);
Literal.name = 'Literal';
function Literal(value) {
this.value = value;
}
@ -441,6 +445,8 @@
__extends(Return, _super);
Return.name = 'Return';
function Return(expr) {
if (expr && !expr.unwrap().isUndefined) this.expression = expr;
}
@ -475,6 +481,8 @@
__extends(Value, _super);
Value.name = 'Value';
function Value(base, props, tag) {
if (!props && base instanceof Value) return base;
this.base = base;
@ -623,6 +631,8 @@
__extends(Comment, _super);
Comment.name = 'Comment';
function Comment(comment) {
this.comment = comment;
}
@ -646,6 +656,8 @@
__extends(Call, _super);
Call.name = 'Call';
function Call(variable, args, soak) {
this.args = args != null ? args : [];
this.soak = soak;
@ -815,6 +827,8 @@
__extends(Extends, _super);
Extends.name = 'Extends';
function Extends(child, parent) {
this.child = child;
this.parent = parent;
@ -834,6 +848,8 @@
__extends(Access, _super);
Access.name = 'Access';
function Access(name, tag) {
this.name = name;
this.name.asKey = true;
@ -862,6 +878,8 @@
__extends(Index, _super);
Index.name = 'Index';
function Index(index) {
this.index = index;
}
@ -884,6 +902,8 @@
__extends(Range, _super);
Range.name = 'Range';
Range.prototype.children = ['from', 'to'];
function Range(from, to, tag) {
@ -963,6 +983,8 @@
__extends(Slice, _super);
Slice.name = 'Slice';
Slice.prototype.children = ['range'];
function Slice(range) {
@ -989,6 +1011,8 @@
__extends(Obj, _super);
Obj.name = 'Obj';
function Obj(props, generated) {
this.generated = generated != null ? generated : false;
this.objects = this.properties = props || [];
@ -1055,6 +1079,8 @@
__extends(Arr, _super);
Arr.name = 'Arr';
function Arr(objs) {
this.objects = objs || [];
}
@ -1103,6 +1129,8 @@
__extends(Class, _super);
Class.name = 'Class';
function Class(variable, parent, body) {
this.variable = variable;
this.parent = parent;
@ -1235,6 +1263,9 @@
this.ensureConstructor(name);
this.body.spaced = true;
if (!(this.ctor instanceof Code)) this.body.expressions.unshift(this.ctor);
if (decl) {
this.body.expressions.unshift(new Literal("" + name + ".name = '" + name + "'"));
}
this.body.expressions.push(lname);
this.addBoundFunctions(o);
call = Closure.wrap(this.body);
@ -1257,6 +1288,8 @@
__extends(Assign, _super);
Assign.name = 'Assign';
function Assign(variable, value, context, options) {
this.variable = variable;
this.value = value;
@ -1455,6 +1488,8 @@
__extends(Code, _super);
Code.name = 'Code';
function Code(params, body, tag) {
this.params = params || [];
this.body = body || new Block;
@ -1567,6 +1602,8 @@
__extends(Param, _super);
Param.name = 'Param';
function Param(name, value, splat) {
this.name = name;
this.value = value;
@ -1606,6 +1643,8 @@
__extends(Splat, _super);
Splat.name = 'Splat';
Splat.prototype.children = ['name'];
Splat.prototype.isAssignable = YES;
@ -1672,6 +1711,8 @@
__extends(While, _super);
While.name = 'While';
function While(condition, options) {
this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition;
this.guard = options != null ? options.guard : void 0;
@ -1745,6 +1786,8 @@
__extends(Op, _super);
Op.name = 'Op';
function Op(op, first, second, flip) {
var call;
if (op === 'in') return new In(first, second);
@ -1896,6 +1939,8 @@
__extends(In, _super);
In.name = 'In';
function In(object, array) {
this.object = object;
this.array = array;
@ -1968,6 +2013,8 @@
__extends(Try, _super);
Try.name = 'Try';
function Try(attempt, error, recovery, ensure) {
this.attempt = attempt;
this.error = error;
@ -2008,6 +2055,8 @@
__extends(Throw, _super);
Throw.name = 'Throw';
function Throw(expression) {
this.expression = expression;
}
@ -2032,6 +2081,8 @@
__extends(Existence, _super);
Existence.name = 'Existence';
function Existence(expression) {
this.expression = expression;
}
@ -2065,6 +2116,8 @@
__extends(Parens, _super);
Parens.name = 'Parens';
function Parens(body) {
this.body = body;
}
@ -2103,6 +2156,8 @@
__extends(For, _super);
For.name = 'For';
function For(body, source) {
var _ref2;
this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;
@ -2236,6 +2291,8 @@
__extends(Switch, _super);
Switch.name = 'Switch';
function Switch(subject, cases, otherwise) {
this.subject = subject;
this.cases = cases;
@ -2311,6 +2368,8 @@
__extends(If, _super);
If.name = 'If';
function If(condition, body, options) {
this.body = body;
if (options == null) options = {};

View File

@ -2,7 +2,7 @@
var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments;
exports.OptionParser = OptionParser = (function() {
OptionParser.name = 'OptionParser';
function OptionParser(rules, banner) {
this.banner = banner;
this.rules = buildRules(rules);

View File

@ -4,7 +4,7 @@
__slice = Array.prototype.slice;
exports.Rewriter = (function() {
Rewriter.name = 'Rewriter';
function Rewriter() {}
Rewriter.prototype.rewrite = function(tokens) {

View File

@ -4,7 +4,7 @@
_ref = require('./helpers'), extend = _ref.extend, last = _ref.last;
exports.Scope = Scope = (function() {
Scope.name = 'Scope';
Scope.root = null;
function Scope(parent, expressions, method) {

View File

@ -928,6 +928,7 @@ exports.Class = class Class extends Base
@ensureConstructor name
@body.spaced = yes
@body.expressions.unshift @ctor unless @ctor instanceof Code
@body.expressions.unshift new Literal "#{name}.name = '#{name}'" if decl
@body.expressions.push lname
@addBoundFunctions o

View File

@ -593,4 +593,14 @@ test "#1813: Passing class definitions as expressions", ->
x = 1
eq result, B
test "#494: Named classes", ->
class A
eq A.name, 'A'
class A.B
eq A.B.name, 'B'
class A.B["C"]
ok A.B.C.name isnt 'C'