Skip to content

Commit

Permalink
Add support for @foo a la CoffeeScript and add a bunch of tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wycats committed Oct 15, 2011
1 parent 9f495b5 commit 88e8cd9
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
4 changes: 4 additions & 0 deletions lib/grammar.y
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ MemberExpr
| FunctionExpr | FunctionExpr
| MemberExpr '[' Expr ']' | MemberExpr '[' Expr ']'
{ $$ = yy.Node('MemberExpression',$1,$3,true,yy.loc([@$,@4])); } { $$ = yy.Node('MemberExpression',$1,$3,true,yy.loc([@$,@4])); }
| AT_THISTOKEN IdentifierName
{ $$ = yy.Node('MemberExpression',yy.Node('ThisExpression'),yy.Node('Identifier', String($2)),false,yy.loc([@$,@2])); }
| MemberExpr '.' IdentifierName | MemberExpr '.' IdentifierName
{ $$ = yy.Node('MemberExpression',$1,yy.Node('Identifier', String($3)),false,yy.loc([@$,@3])); } { $$ = yy.Node('MemberExpression',$1,yy.Node('Identifier', String($3)),false,yy.loc([@$,@3])); }
| NEW MemberExpr Arguments | NEW MemberExpr Arguments
Expand All @@ -251,6 +253,8 @@ MemberExprNoBF
: PrimaryExprNoBrace : PrimaryExprNoBrace
| MemberExprNoBF '[' Expr ']' | MemberExprNoBF '[' Expr ']'
{ $$ = yy.Node('MemberExpression',$1,$3,true,yy.loc([@$,@4])); } { $$ = yy.Node('MemberExpression',$1,$3,true,yy.loc([@$,@4])); }
| AT_THISTOKEN IdentifierName
{ $$ = yy.Node('MemberExpression',yy.Node('ThisExpression'),yy.Node('Identifier', String($2)),false,yy.loc([@$,@2])); }
| MemberExprNoBF '.' IdentifierName | MemberExprNoBF '.' IdentifierName
{ $$ = yy.Node('MemberExpression',$1,yy.Node('Identifier', String($3)),false,yy.loc([@$,@3])); } { $$ = yy.Node('MemberExpression',$1,yy.Node('Identifier', String($3)),false,yy.loc([@$,@3])); }
| NEW MemberExpr Arguments | NEW MemberExpr Arguments
Expand Down
1 change: 1 addition & 0 deletions lib/lexer.l
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ RCLASS "["({BSL}|[^\\\]])*"]"
"static" return 'STATIC' "static" return 'STATIC'
"yield" return 'YIELD' "yield" return 'YIELD'
"this" return 'THISTOKEN' "this" return 'THISTOKEN'
"@" return 'AT_THISTOKEN'
"true" return 'TRUETOKEN' "true" return 'TRUETOKEN'
"false" return 'FALSETOKEN' "false" return 'FALSETOKEN'
"null" return 'NULLTOKEN' "null" return 'NULLTOKEN'
Expand Down
4 changes: 2 additions & 2 deletions lib/stringify.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ function sourceElement(n, indent) {
function decaf_handleFunctionDeclSpread(n) { function decaf_handleFunctionDeclSpread(n) {
var len = n.params.length - 1, params = n.params, spread, ast; var len = n.params.length - 1, params = n.params, spread, ast;


if (params[len].type === 'Spread') { if (params[len] && params[len].type === 'Spread') {
spread = params.pop(); spread = params.pop();
// TODO: save off AST // TODO: save off AST
ast = Reflect.parse("var " + spread.name + " = " + len + " < arguments.length ? [].slice.call(arguments, " + len + ") : []"); ast = Reflect.parse("var " + spread.name + " = " + len + " < arguments.length ? [].slice.call(arguments, " + len + ") : []");
Expand All @@ -654,7 +654,7 @@ function decaf_handleCallSpread(n, indent, callback) {


// more parameters than just the spread // more parameters than just the spread
if (params.length) { if (params.length) {
var argString = "[" + argBody(params, indent) + "].concat([].slice.call(" + spreadName + ")"; var argString = "[" + argBody(params, indent) + "].concat([].slice.call(" + spreadName + "))";
} else { } else {
var argString = spreadName; var argString = spreadName;
} }
Expand Down
30 changes: 28 additions & 2 deletions test/stringify-test.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -271,12 +271,38 @@ function runUnitTests() {
" }\n" + " }\n" +
" new test3;\n" + " new test3;\n" +
"}\n"), "}\n"),

// --- decaf extensions ---

// @foo
["@foo", "this.foo;\n"],
["@foo.bar", "this.foo.bar;\n"],
["x.y(@foo.bar(baz))", "x.y(this.foo.bar(baz));\n"],

// spread
["x(...y)", "x.apply(undefined, y);\n"],
["x(y, ...z)", "x.apply(undefined, [y].concat([].slice.call(z)));\n"],
["x(y, z, ...a)", "x.apply(undefined, [y, z].concat([].slice.call(a)));\n"],
["x.y(...z)", "x.y.apply(x, z);\n"],
["x.y(z, ...a)", "x.y.apply(x, [z].concat([].slice.call(a)));\n"],
["x.y(z, a, ...b)", "x.y.apply(x, [z, a].concat([].slice.call(b)));\n"],
["x.y.z(...a)", "(var _ref=x.y).z.apply(_ref, a);\n"],
["x.y.z(a, ...b)", "(var _ref=x.y).z.apply(_ref, [a].concat([].slice.call(b)));\n"],
["x.y.z(a, b, ...c)", "(var _ref=x.y).z.apply(_ref, [a, b].concat([].slice.call(c)));\n"],
["@x.y.z(a, b, ...c)", "(var _ref=this.x.y).z.apply(_ref, [a, b].concat([].slice.call(c)));\n"],
["x.y.z(a, @b, ...c)", "(var _ref=x.y).z.apply(_ref, [a, this.b].concat([].slice.call(c)));\n"],
]; ];


for (var i = 0; i < tests.length; i++) { for (var i = 0; i < tests.length; i++) {
var b = tests[i], a;
try { try {
a = Reflect.stringify(Reflect.parse(b, {loc: false})); if (typeof tests[i] === "string") {
var b = tests[i], a;
a = Reflect.stringify(Reflect.parse(b, {loc: false}));
} else {
var b = tests[i][1], a;
a = Reflect.stringify(Reflect.parse(tests[i][0], {loc: false}));
}

if (typeof a !== "string") { if (typeof a !== "string") {
throw new TypeError("Reflect.stringify returned " + throw new TypeError("Reflect.stringify returned " +
(a !== null && typeof a === "object" (a !== null && typeof a === "object"
Expand Down

0 comments on commit 88e8cd9

Please sign in to comment.