CoffeeScript-in-CoffeeScript can compile @property references.

This commit is contained in:
Jeremy Ashkenas
2010-02-08 23:51:34 -05:00
parent 863de88671
commit 522df2a355
4 changed files with 38 additions and 1 deletions

View File

@@ -1,5 +1,5 @@
(function(){ (function(){
var AccessorNode, CallNode, CommentNode, Expressions, ExtendsNode, IndexNode, LiteralNode, Node, ReturnNode, TAB, TRAILING_WHITESPACE, ValueNode, any, compact, del, dup, flatten, inherit, merge, statement; var AccessorNode, CallNode, CommentNode, Expressions, ExtendsNode, IndexNode, LiteralNode, Node, ReturnNode, TAB, TRAILING_WHITESPACE, ThisNode, ValueNode, any, compact, del, dup, flatten, inherit, merge, statement;
var __hasProp = Object.prototype.hasOwnProperty; var __hasProp = Object.prototype.hasOwnProperty;
process.mixin(require('./scope')); process.mixin(require('./scope'));
// The abstract base class for all CoffeeScript nodes. // The abstract base class for all CoffeeScript nodes.
@@ -744,4 +744,13 @@
return '[' + this.index.compile(o) + ']'; return '[' + this.index.compile(o) + ']';
} }
})); }));
// A this-reference, using '@'.
ThisNode = (exports.ThisNode = inherit(Node, {
constructor: function constructor(property) {
return this.property = property || null;
},
compile_node: function compile_node(o) {
return 'this' + (this.property ? '.' + this.property : '');
}
}));
})(); })();

View File

@@ -212,6 +212,8 @@
return new ValueNode($1); return new ValueNode($1);
}), o("Range", function() { }), o("Range", function() {
return new ValueNode($1); return new ValueNode($1);
}), o("This", function() {
return new ValueNode($1);
}), o("Value Accessor", function() { }), o("Value Accessor", function() {
return $1.push($2); return $1.push($2);
}), o("Invocation Accessor", function() { }), o("Invocation Accessor", function() {
@@ -285,6 +287,13 @@
return new CallNode('super', $3); return new CallNode('super', $3);
}) })
], ],
// This references, either naked or to a property.
This: [o("@", function() {
return new ThisNode();
}), o("@ IDENTIFIER", function() {
return new ThisNode(yytext);
})
],
// The range literal. // The range literal.
Range: [o("[ Expression . . Expression ]", function() { Range: [o("[ Expression . . Expression ]", function() {
return new RangeNode($2, $5); return new RangeNode($2, $5);

View File

@@ -473,6 +473,18 @@ IndexNode: exports.IndexNode: inherit Node, {
} }
# A this-reference, using '@'.
ThisNode: exports.ThisNode: inherit Node, {
constructor: (property) ->
@property: property or null
compile_node: (o) ->
'this' + (if @property then '.' + @property else '')
}

View File

@@ -230,6 +230,7 @@ grammar: {
o "Object", -> new ValueNode($1) o "Object", -> new ValueNode($1)
o "Parenthetical", -> new ValueNode($1) o "Parenthetical", -> new ValueNode($1)
o "Range", -> new ValueNode($1) o "Range", -> new ValueNode($1)
o "This", -> new ValueNode($1)
o "Value Accessor", -> $1.push($2) o "Value Accessor", -> $1.push($2)
o "Invocation Accessor", -> new ValueNode($1, [$2]) o "Invocation Accessor", -> new ValueNode($1, [$2])
] ]
@@ -291,6 +292,12 @@ grammar: {
o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3) o "SUPER CALL_START ArgList CALL_END", -> new CallNode('super', $3)
] ]
# This references, either naked or to a property.
This: [
o "@", -> new ThisNode()
o "@ IDENTIFIER", -> new ThisNode(yytext)
]
# The range literal. # The range literal.
Range: [ Range: [
o "[ Expression . . Expression ]", -> new RangeNode($2, $5) o "[ Expression . . Expression ]", -> new RangeNode($2, $5)