Skip to content

Commit 7a6d3fd

Browse files
gkzfacebook-github-bot
authored andcommitted
[flow] Fix printer output of casting syntax when LHS of as or as const has low precedence
Summary: Changelog: [ide] Fix printer output of casting syntax when LHS of `as` or `as const` has low precedence Reviewed By: panagosg7 Differential Revision: D54875911 fbshipit-source-id: 2ff2b71ecdad45a5db8b506436191199e75ddf36
1 parent 72d7cce commit 7a6d3fd

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

src/parser_utils/output/__tests__/js_layout_generator_test.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1980,7 +1980,13 @@ let tests =
19801980
assert_statement_string ~ctxt "type T<in out A>=A;"
19811981
);
19821982
("as_expression" >:: fun ctxt -> assert_expression_string ~ctxt "a as T");
1983+
( "as_expression_precedence" >:: fun ctxt ->
1984+
assert_expression_string ~ctxt ~pretty:true "(x ?? a) as T"
1985+
);
19831986
("as_const_expression" >:: fun ctxt -> assert_expression_string ~ctxt "a as const");
1987+
( "as_const_expression_precedence" >:: fun ctxt ->
1988+
assert_expression_string ~ctxt ~pretty:true "(x ?? a) as const"
1989+
);
19841990
("satisfies_expression" >:: fun ctxt -> assert_expression_string ~ctxt "a satisfies T");
19851991
( "type_parameter" >:: fun ctxt ->
19861992
assert_statement_string ~ctxt "type a<a>=a;";

src/parser_utils/output/js_layout_generator.ml

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,8 +1263,8 @@ and expression ?(ctxt = normal_context) ~opts (root_expr : (Loc.t, Loc.t) Ast.Ex
12631263
| E.JSXElement el -> jsx_element ~opts loc el
12641264
| E.JSXFragment fr -> jsx_fragment ~opts loc fr
12651265
| E.TypeCast cast -> type_cast ~opts loc cast
1266-
| E.AsConstExpression cast -> as_const_expression ~opts loc cast
1267-
| E.AsExpression cast -> as_expression ~opts loc cast
1266+
| E.AsConstExpression cast -> as_const_expression ~ctxt ~opts ~precedence loc cast
1267+
| E.AsExpression cast -> as_expression ~ctxt ~opts ~precedence loc cast
12681268
| E.TSSatisfies cast -> ts_satisfies ~opts loc cast
12691269
| E.Import { E.Import.argument; comments } ->
12701270
layout_node_with_comments_opt loc comments
@@ -1487,18 +1487,25 @@ and type_cast ~opts loc cast =
14871487
layout_node_with_comments_opt loc comments
14881488
@@ wrap_in_parens (fuse [expr_layout; type_annotation ~opts annot])
14891489

1490-
and as_const_expression ~opts loc cast =
1490+
and as_const_expression ~ctxt ~opts ~precedence loc cast =
14911491
let open Ast.Expression.AsConstExpression in
14921492
let { expression = expr; comments } = cast in
1493-
let expr_layout = expression ~opts expr in
1493+
let expr_layout = expression_with_parens ~ctxt ~opts ~precedence expr in
14941494
let rhs = [Atom "as"; space; Atom "const"] in
14951495
layout_node_with_comments_opt loc comments @@ fuse [expr_layout; space; fuse rhs]
14961496

1497-
and as_expression ~opts loc cast =
1497+
and as_expression ~ctxt ~opts ~precedence loc cast =
14981498
let open Ast.Expression.AsExpression in
14991499
let { expression = expr; annot = (_, annot); comments } = cast in
15001500
layout_node_with_comments_opt loc comments
1501-
@@ fuse [expression ~opts expr; space; Atom "as"; space; type_ ~opts annot]
1501+
@@ fuse
1502+
[
1503+
expression_with_parens ~ctxt ~opts ~precedence expr;
1504+
space;
1505+
Atom "as";
1506+
space;
1507+
type_ ~opts annot;
1508+
]
15021509

15031510
and ts_satisfies ~opts loc cast =
15041511
let open Ast.Expression.TSSatisfies in

tests/annotate_exports_import_cycle/annotate_exports_import_cycle.exp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import type { E, C } from "./lib";import { foo, baz } from "./lib";
2727
const a = require("./a");
2828

2929
module.exports = [
30-
0 < 1 ? foo() : baz() as C | E
30+
(0 < 1 ? foo() : baz()) as C | E
3131
];
3232

3333
>>> Launching report...
@@ -86,7 +86,7 @@ import type { E, C } from "./lib";import { foo, baz } from "./lib";
8686
const a = require("./a");
8787

8888
module.exports = [
89-
0 < 1 ? foo() : baz() as C | E
89+
(0 < 1 ? foo() : baz()) as C | E
9090
];
9191

9292
>>> ./error-a.js
@@ -100,8 +100,8 @@ import { error_foo, error_bar } from "./error-lib";
100100
const b = require("./error-b");
101101

102102
module.exports = [
103-
0 < 1 ? foo() : error_foo() as C | C,
104-
0 < 1 ? bar() : error_bar() as D | D,
103+
(0 < 1 ? foo() : error_foo()) as C | C,
104+
(0 < 1 ? bar() : error_bar()) as D | D,
105105
];
106106

107107
>>> ./error-b.js
@@ -113,8 +113,8 @@ import { error_foo, error_baz } from "./error-lib";
113113
const a = require("./error-a");
114114

115115
module.exports = [
116-
0 < 1 ? foo() : error_foo() as C | C,
117-
0 < 1 ? baz() : error_baz() as E | E,
116+
(0 < 1 ? foo() : error_foo()) as C | C,
117+
(0 < 1 ? baz() : error_baz()) as E | E,
118118
];
119119

120120

@@ -124,14 +124,14 @@ module.exports = [
124124
< 0 < 1 ? foo() : error_foo(),
125125
< 0 < 1 ? bar() : error_bar(),
126126
---
127-
> 0 < 1 ? foo() : error_foo() as C | C,
128-
> 0 < 1 ? bar() : error_bar() as D | D,
127+
> (0 < 1 ? foo() : error_foo()) as C | C,
128+
> (0 < 1 ? bar() : error_bar()) as D | D,
129129

130130
>>> ./error-b.js
131131
9,10c9,10
132132
< 0 < 1 ? foo() : error_foo(),
133133
< 0 < 1 ? baz() : error_baz(),
134134
---
135-
> 0 < 1 ? foo() : error_foo() as C | C,
136-
> 0 < 1 ? baz() : error_baz() as E | E,
135+
> (0 < 1 ? foo() : error_foo()) as C | C,
136+
> (0 < 1 ? baz() : error_baz()) as E | E,
137137

tests/annotate_exports_no_import_on_error/annotate_exports_no_import_on_error.exp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ module.exports = (foo() as C); // error: C is not exported
5353
import type { D } from "./lib-2";import { foo, bar } from "./lib-2";
5454

5555
module.exports._1 = (foo() as C); // error: C is not exported
56-
module.exports._2 = (0 < 1 ? foo() : bar() as C | D); // error: C is not exported, even though D is okay
56+
module.exports._2 = ((0 < 1 ? foo() : bar()) as C | D); // error: C is not exported, even though D is okay
5757
module.exports._3 = (bar() as D); // okay
5858

5959

@@ -70,5 +70,5 @@ module.exports._3 = (bar() as D); // okay
7070
< module.exports._2 = 0 < 1 ? foo() : bar(); // error: C is not exported, even though D is okay
7171
---
7272
> module.exports._1 = (foo() as C); // error: C is not exported
73-
> module.exports._2 = (0 < 1 ? foo() : bar() as C | D); // error: C is not exported, even though D is okay
73+
> module.exports._2 = ((0 < 1 ? foo() : bar()) as C | D); // error: C is not exported, even though D is okay
7474

0 commit comments

Comments
 (0)