If you don't specify a constructor, one will be provided for you by the state.

This commit is contained in:
Jeremy Ashkenas 2010-02-28 00:13:17 -05:00
parent 62b2ab29cd
commit 56eb474bf3
3 changed files with 25 additions and 5 deletions

View File

@ -688,7 +688,7 @@
__extends(ClassNode, BaseNode);
ClassNode.prototype.type = 'Class';
ClassNode.prototype.compile_node = function compile_node(o) {
var _a, _b, _c, construct, extension, func, prop, props, ret, returns, val;
var _a, _b, _c, applied, construct, extension, func, prop, props, ret, returns, val;
extension = this.parent && new ExtendsNode(this.variable, this.parent);
constructor = null;
props = new Expressions();
@ -709,8 +709,13 @@
props.push(prop);
}
}
if (!(constructor)) {
constructor = new AssignNode(this.variable, new CodeNode());
if (!constructor) {
if (this.parent) {
applied = new ValueNode(this.parent, [new AccessorNode(new LiteralNode('apply'))]);
constructor = new AssignNode(this.variable, new CodeNode([], new Expressions([new CallNode(applied, [new LiteralNode('this'), new LiteralNode('arguments')])])));
} else {
constructor = new AssignNode(this.variable, new CodeNode());
}
}
construct = this.idt() + constructor.compile(o) + ';\n';
props = props.empty() ? '' : props.compile(o) + '\n';

View File

@ -523,7 +523,14 @@ exports.ClassNode: class ClassNode extends BaseNode
prop: new AssignNode(val, prop.value)
props.push prop
constructor: new AssignNode(@variable, new CodeNode()) unless constructor
if not constructor
if @parent
applied: new ValueNode(@parent, [new AccessorNode(new LiteralNode('apply'))])
constructor: new AssignNode(@variable, new CodeNode([], new Expressions([
new CallNode(applied, [new LiteralNode('this'), new LiteralNode('arguments')])
])))
else
constructor: new AssignNode(@variable, new CodeNode())
construct: @idt() + constructor.compile(o) + ';\n'
props: if props.empty() then '' else props.compile(o) + '\n'

View File

@ -35,4 +35,12 @@ class SubClass extends SuperClass
constructor: ->
super 'sub'
ok (new SubClass()).prop is 'top-super-sub'
ok (new SubClass()).prop is 'top-super-sub'
class OneClass
constructor: (name) -> @name: name
class TwoClass extends OneClass
ok (new TwoClass('three')).name is 'three'