Skip to content

Commit bdcdd84

Browse files
CR feedback.
1 parent 0c56541 commit bdcdd84

7 files changed

+153
-27
lines changed

src/compiler/emitter.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3179,35 +3179,38 @@ module ts {
31793179
}
31803180

31813181
function emitParenExpression(node: ParenthesizedExpression) {
3182-
if (node.expression.kind === SyntaxKind.TypeAssertionExpression) {
3183-
var operand = (<TypeAssertion>node.expression).expression;
3184-
3185-
// Make sure we consider all nested cast expressions, e.g.:
3186-
// (<any><number><any>-A).x;
3187-
while (operand.kind == SyntaxKind.TypeAssertionExpression) {
3188-
operand = (<TypeAssertion>operand).expression;
3189-
}
3190-
3191-
// We have an expression of the form: (<Type>SubExpr)
3192-
// Emitting this as (SubExpr) is really not desirable. We would like to emit the subexpr as is.
3193-
// Omitting the parentheses, however, could cause change in the semantics of the generated
3194-
// code if the casted expression has a lower precedence than the rest of the expression, e.g.:
3195-
// (<any>new A).foo should be emitted as (new A).foo and not new A.foo
3196-
// (<any>typeof A).toString() should be emitted as (typeof A).toString() and not typeof A.toString()
3197-
// new (<any>A()) should be emitted as new (A()) and not new A()
3198-
// (<any>function foo() { })() should be emitted as an IIF (function foo(){})() and not declaration function foo(){} ()
3199-
if (operand.kind !== SyntaxKind.PrefixUnaryExpression &&
3200-
operand.kind !== SyntaxKind.VoidExpression &&
3201-
operand.kind !== SyntaxKind.TypeOfExpression &&
3202-
operand.kind !== SyntaxKind.DeleteExpression &&
3203-
operand.kind !== SyntaxKind.PostfixUnaryExpression &&
3204-
operand.kind !== SyntaxKind.NewExpression &&
3205-
!(operand.kind === SyntaxKind.CallExpression && node.parent.kind === SyntaxKind.NewExpression) &&
3206-
!(operand.kind === SyntaxKind.FunctionExpression && node.parent.kind === SyntaxKind.CallExpression)) {
3207-
emit(operand);
3208-
return;
3182+
if (!node.parent || node.parent.kind !== SyntaxKind.ArrowFunction) {
3183+
if (node.expression.kind === SyntaxKind.TypeAssertionExpression) {
3184+
var operand = (<TypeAssertion>node.expression).expression;
3185+
3186+
// Make sure we consider all nested cast expressions, e.g.:
3187+
// (<any><number><any>-A).x;
3188+
while (operand.kind == SyntaxKind.TypeAssertionExpression) {
3189+
operand = (<TypeAssertion>operand).expression;
3190+
}
3191+
3192+
// We have an expression of the form: (<Type>SubExpr)
3193+
// Emitting this as (SubExpr) is really not desirable. We would like to emit the subexpr as is.
3194+
// Omitting the parentheses, however, could cause change in the semantics of the generated
3195+
// code if the casted expression has a lower precedence than the rest of the expression, e.g.:
3196+
// (<any>new A).foo should be emitted as (new A).foo and not new A.foo
3197+
// (<any>typeof A).toString() should be emitted as (typeof A).toString() and not typeof A.toString()
3198+
// new (<any>A()) should be emitted as new (A()) and not new A()
3199+
// (<any>function foo() { })() should be emitted as an IIF (function foo(){})() and not declaration function foo(){} ()
3200+
if (operand.kind !== SyntaxKind.PrefixUnaryExpression &&
3201+
operand.kind !== SyntaxKind.VoidExpression &&
3202+
operand.kind !== SyntaxKind.TypeOfExpression &&
3203+
operand.kind !== SyntaxKind.DeleteExpression &&
3204+
operand.kind !== SyntaxKind.PostfixUnaryExpression &&
3205+
operand.kind !== SyntaxKind.NewExpression &&
3206+
!(operand.kind === SyntaxKind.CallExpression && node.parent.kind === SyntaxKind.NewExpression) &&
3207+
!(operand.kind === SyntaxKind.FunctionExpression && node.parent.kind === SyntaxKind.CallExpression)) {
3208+
emit(operand);
3209+
return;
3210+
}
32093211
}
32103212
}
3213+
32113214
write("(");
32123215
emit(node.expression);
32133216
write(")");
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [arrowFunctionWithObjectLiteralBody5.ts]
2+
var a = () => <Error>{ name: "foo", message: "bar" };
3+
4+
var b = () => (<Error>{ name: "foo", message: "bar" });
5+
6+
var c = () => ({ name: "foo", message: "bar" });
7+
8+
var d = () => ((<Error>({ name: "foo", message: "bar" })));
9+
10+
//// [arrowFunctionWithObjectLiteralBody5.js]
11+
var a = function () { return { name: "foo", message: "bar" }; };
12+
var b = function () { return ({ name: "foo", message: "bar" }); };
13+
var c = function () { return ({ name: "foo", message: "bar" }); };
14+
var d = function () { return (({ name: "foo", message: "bar" })); };
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/compiler/arrowFunctionWithObjectLiteralBody5.ts ===
2+
var a = () => <Error>{ name: "foo", message: "bar" };
3+
>a : () => Error
4+
>() => <Error>{ name: "foo", message: "bar" } : () => Error
5+
><Error>{ name: "foo", message: "bar" } : Error
6+
>Error : Error
7+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
8+
>name : string
9+
>message : string
10+
11+
var b = () => (<Error>{ name: "foo", message: "bar" });
12+
>b : () => Error
13+
>() => (<Error>{ name: "foo", message: "bar" }) : () => Error
14+
>(<Error>{ name: "foo", message: "bar" }) : Error
15+
><Error>{ name: "foo", message: "bar" } : Error
16+
>Error : Error
17+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
18+
>name : string
19+
>message : string
20+
21+
var c = () => ({ name: "foo", message: "bar" });
22+
>c : () => { name: string; message: string; }
23+
>() => ({ name: "foo", message: "bar" }) : () => { name: string; message: string; }
24+
>({ name: "foo", message: "bar" }) : { name: string; message: string; }
25+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
26+
>name : string
27+
>message : string
28+
29+
var d = () => ((<Error>({ name: "foo", message: "bar" })));
30+
>d : () => Error
31+
>() => ((<Error>({ name: "foo", message: "bar" }))) : () => Error
32+
>((<Error>({ name: "foo", message: "bar" }))) : Error
33+
>(<Error>({ name: "foo", message: "bar" })) : Error
34+
><Error>({ name: "foo", message: "bar" }) : Error
35+
>Error : Error
36+
>({ name: "foo", message: "bar" }) : { name: string; message: string; }
37+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
38+
>name : string
39+
>message : string
40+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [arrowFunctionWithObjectLiteralBody6.ts]
2+
var a = () => <Error>{ name: "foo", message: "bar" };
3+
4+
var b = () => (<Error>{ name: "foo", message: "bar" });
5+
6+
var c = () => ({ name: "foo", message: "bar" });
7+
8+
var d = () => ((<Error>({ name: "foo", message: "bar" })));
9+
10+
//// [arrowFunctionWithObjectLiteralBody6.js]
11+
var a = () => ({ name: "foo", message: "bar" });
12+
var b = () => ({ name: "foo", message: "bar" });
13+
var c = () => ({ name: "foo", message: "bar" });
14+
var d = () => (({ name: "foo", message: "bar" }));
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/compiler/arrowFunctionWithObjectLiteralBody6.ts ===
2+
var a = () => <Error>{ name: "foo", message: "bar" };
3+
>a : () => Error
4+
>() => <Error>{ name: "foo", message: "bar" } : () => Error
5+
><Error>{ name: "foo", message: "bar" } : Error
6+
>Error : Error
7+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
8+
>name : string
9+
>message : string
10+
11+
var b = () => (<Error>{ name: "foo", message: "bar" });
12+
>b : () => Error
13+
>() => (<Error>{ name: "foo", message: "bar" }) : () => Error
14+
>(<Error>{ name: "foo", message: "bar" }) : Error
15+
><Error>{ name: "foo", message: "bar" } : Error
16+
>Error : Error
17+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
18+
>name : string
19+
>message : string
20+
21+
var c = () => ({ name: "foo", message: "bar" });
22+
>c : () => { name: string; message: string; }
23+
>() => ({ name: "foo", message: "bar" }) : () => { name: string; message: string; }
24+
>({ name: "foo", message: "bar" }) : { name: string; message: string; }
25+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
26+
>name : string
27+
>message : string
28+
29+
var d = () => ((<Error>({ name: "foo", message: "bar" })));
30+
>d : () => Error
31+
>() => ((<Error>({ name: "foo", message: "bar" }))) : () => Error
32+
>((<Error>({ name: "foo", message: "bar" }))) : Error
33+
>(<Error>({ name: "foo", message: "bar" })) : Error
34+
><Error>({ name: "foo", message: "bar" }) : Error
35+
>Error : Error
36+
>({ name: "foo", message: "bar" }) : { name: string; message: string; }
37+
>{ name: "foo", message: "bar" } : { name: string; message: string; }
38+
>name : string
39+
>message : string
40+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var a = () => <Error>{ name: "foo", message: "bar" };
2+
3+
var b = () => (<Error>{ name: "foo", message: "bar" });
4+
5+
var c = () => ({ name: "foo", message: "bar" });
6+
7+
var d = () => ((<Error>({ name: "foo", message: "bar" })));
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @target: es6
2+
var a = () => <Error>{ name: "foo", message: "bar" };
3+
4+
var b = () => (<Error>{ name: "foo", message: "bar" });
5+
6+
var c = () => ({ name: "foo", message: "bar" });
7+
8+
var d = () => ((<Error>({ name: "foo", message: "bar" })));

0 commit comments

Comments
 (0)