diff --git a/lib/grammar.js b/lib/grammar.js index 615681f0..d6e4400c 100644 --- a/lib/grammar.js +++ b/lib/grammar.js @@ -214,22 +214,25 @@ }) ], Class: [ - o("CLASS SimpleAssignable", function() { + o('CLASS SimpleAssignable', function() { return new Class($2); - }), o("CLASS SimpleAssignable EXTENDS Value", function() { + }), o('CLASS SimpleAssignable EXTENDS Value', function() { return new Class($2, $4); - }), o("CLASS SimpleAssignable INDENT ClassBody OUTDENT", function() { + }), o('CLASS SimpleAssignable\ + INDENT ClassBody OUTDENT', function() { return new Class($2, null, $4); - }), o("CLASS SimpleAssignable EXTENDS Value INDENT ClassBody OUTDENT", function() { + }), o('CLASS SimpleAssignable EXTENDS Value\ + INDENT ClassBody OUTDENT', function() { return new Class($2, $4, $6); - }), o("CLASS INDENT ClassBody OUTDENT", function() { - return new Class('__temp__', null, $3); - }), o("CLASS", function() { - return new Class('__temp__', null, new Expressions); - }), o("CLASS EXTENDS Value", function() { - return new Class('__temp__', $3, new Expressions); - }), o("CLASS EXTENDS Value INDENT ClassBody OUTDENT", function() { - return new Class('__temp__', $3, $5); + }), o('CLASS INDENT ClassBody OUTDENT', function() { + return new Class(null, null, $3); + }), o('CLASS', function() { + return new Class(null, null, new Expressions); + }), o('CLASS EXTENDS Value', function() { + return new Class(null, $3, new Expressions); + }), o('CLASS EXTENDS Value\ + INDENT ClassBody OUTDENT', function() { + return new Class(null, $3, $5); }) ], ClassAssign: [ diff --git a/lib/nodes.js b/lib/nodes.js index 3ab3aace..b09753e3 100644 --- a/lib/nodes.js +++ b/lib/nodes.js @@ -750,10 +750,10 @@ })(); exports.Class = (function() { Class = (function() { - function Class(variable, _arg, props) { - this.parent = _arg; + function Class(_arg, _arg2, props) { + this.parent = _arg2; + this.variable = _arg; Class.__super__.constructor.call(this); - this.variable = variable === '__temp__' ? new Literal(variable) : variable; this.properties = props || []; this.returns = false; return this; @@ -769,10 +769,7 @@ }; Class.prototype.compileNode = function(o) { var _i, _len, _ref2, _ref3, access, applied, apply, className, constScope, construct, constructor, extension, func, me, pname, prop, props, pvar, ref, val, variable; - variable = this.variable; - if (variable.value === '__temp__') { - variable = new Literal(o.scope.freeVariable('ctor')); - } + variable = this.variable || new Literal(o.scope.freeVariable('ctor')); extension = this.parent && new Extends(variable, this.parent); props = new Expressions; me = null; diff --git a/lib/parser.js b/lib/parser.js index a9480a1f..9b3e9035 100755 --- a/lib/parser.js +++ b/lib/parser.js @@ -205,13 +205,13 @@ case 95:this.$ = new yy.Class($$[$0-5+2-1], null, $$[$0-5+4-1]); break; case 96:this.$ = new yy.Class($$[$0-7+2-1], $$[$0-7+4-1], $$[$0-7+6-1]); break; -case 97:this.$ = new yy.Class('__temp__', null, $$[$0-4+3-1]); +case 97:this.$ = new yy.Class(null, null, $$[$0-4+3-1]); break; -case 98:this.$ = new yy.Class('__temp__', null, new yy.Expressions); +case 98:this.$ = new yy.Class(null, null, new yy.Expressions); break; -case 99:this.$ = new yy.Class('__temp__', $$[$0-3+3-1], new yy.Expressions); +case 99:this.$ = new yy.Class(null, $$[$0-3+3-1], new yy.Expressions); break; -case 100:this.$ = new yy.Class('__temp__', $$[$0-6+3-1], $$[$0-6+5-1]); +case 100:this.$ = new yy.Class(null, $$[$0-6+3-1], $$[$0-6+5-1]); break; case 101:this.$ = $$[$0-1+1-1]; break; diff --git a/src/grammar.coffee b/src/grammar.coffee index cfd7c2aa..0f3b1c54 100644 --- a/src/grammar.coffee +++ b/src/grammar.coffee @@ -272,14 +272,17 @@ grammar = # Class definitions have optional bodies of prototype property assignments, # and optional references to the superclass. Class: [ - o "CLASS SimpleAssignable", -> new Class $2 - o "CLASS SimpleAssignable EXTENDS Value", -> new Class $2, $4 - o "CLASS SimpleAssignable INDENT ClassBody OUTDENT", -> new Class $2, null, $4 - o "CLASS SimpleAssignable EXTENDS Value INDENT ClassBody OUTDENT", -> new Class $2, $4, $6 - o "CLASS INDENT ClassBody OUTDENT", -> new Class '__temp__', null, $3 - o "CLASS", -> new Class '__temp__', null, new Expressions - o "CLASS EXTENDS Value", -> new Class '__temp__', $3, new Expressions - o "CLASS EXTENDS Value INDENT ClassBody OUTDENT", -> new Class '__temp__', $3, $5 + o 'CLASS SimpleAssignable', -> new Class $2 + o 'CLASS SimpleAssignable EXTENDS Value', -> new Class $2, $4 + o 'CLASS SimpleAssignable + INDENT ClassBody OUTDENT', -> new Class $2, null, $4 + o 'CLASS SimpleAssignable EXTENDS Value + INDENT ClassBody OUTDENT', -> new Class $2, $4, $6 + o 'CLASS INDENT ClassBody OUTDENT', -> new Class null, null, $3 + o 'CLASS', -> new Class null, null, new Expressions + o 'CLASS EXTENDS Value', -> new Class null, $3 , new Expressions + o 'CLASS EXTENDS Value + INDENT ClassBody OUTDENT', -> new Class null, $3, $5 ] # Assignments that can happen directly inside a class declaration. diff --git a/src/nodes.coffee b/src/nodes.coffee index b7825269..56252457 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -645,9 +645,8 @@ exports.Class = class Class extends Base # Initialize a **Class** with its name, an optional superclass, and a # list of prototype property assignments. - constructor: (variable, @parent, props) -> + constructor: (@variable, @parent, props) -> super() - @variable = if variable is '__temp__' then new Literal variable else variable @properties = props or [] @returns = false @@ -659,9 +658,8 @@ exports.Class = class Class extends Base # equivalent syntax tree and compile that, in pieces. You can see the # constructor, property assignments, and inheritance getting built out below. compileNode: (o) -> - {variable} = this - variable = new Literal o.scope.freeVariable 'ctor' if variable.value is '__temp__' - extension = @parent and new Extends variable, @parent + variable = @variable or new Literal o.scope.freeVariable 'ctor' + extension = @parent and new Extends variable, @parent props = new Expressions me = null className = variable.compile o