Skip to content

Commit

Permalink
fix(es/parser): Fix priority of >>> (#6748)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #6739.
  • Loading branch information
kdy1 committed Jan 4, 2023
1 parent d7081cc commit 65a0d3a
Show file tree
Hide file tree
Showing 12 changed files with 246 additions and 3 deletions.
8 changes: 8 additions & 0 deletions crates/swc/tests/fixture/issues-6xxx/6739/input/.swcrc
@@ -0,0 +1,8 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false
}
}
}
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-6xxx/6739/input/index.ts
@@ -0,0 +1 @@
console.log(x < y >>> z);
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-6xxx/6739/output/index.js
@@ -0,0 +1 @@
console.log(x < y >>> z);
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-6xxx/6739/output/index.ts
@@ -0,0 +1 @@
console.log(x < y >>> z);
2 changes: 1 addition & 1 deletion crates/swc_ecma_parser/src/lexer/state.rs
Expand Up @@ -329,7 +329,7 @@ impl<'a, I: Input> Iterator for Lexer<'a, I> {
if c == '<' {
self.input.bump();
return Ok(Some(tok!('<')));
} else if c == '>' {
} else if c == '>' && !self.ctx.prefer_bin_op_over_type_arg_closing {
self.input.bump();
return Ok(Some(tok!('>')));
}
Expand Down
4 changes: 4 additions & 0 deletions crates/swc_ecma_parser/src/lib.rs
Expand Up @@ -375,6 +375,10 @@ pub struct Context {
ignore_else_clause: bool,

disallow_conditional_types: bool,

/// Used for parsing `>`. If true, `>>` and `>>>` are parsed as binary
/// operators.
prefer_bin_op_over_type_arg_closing: bool,
}

#[derive(Debug, Clone, Copy, Default)]
Expand Down
6 changes: 5 additions & 1 deletion crates/swc_ecma_parser/src/parser/expr.rs
Expand Up @@ -671,7 +671,11 @@ impl<I: Tokens> Parser<I> {
return_if_arrow!(self, obj);

let type_args = if self.syntax().typescript() && is!(self, '<') {
self.try_parse_ts_type_args()
self.with_ctx(Context {
prefer_bin_op_over_type_arg_closing: true,
..self.ctx()
})
.try_parse_ts_type_args()
} else {
None
};
Expand Down
6 changes: 5 additions & 1 deletion crates/swc_ecma_parser/src/parser/typescript.rs
Expand Up @@ -557,7 +557,11 @@ impl<I: Tokens> Parser<I> {
pub(super) fn try_parse_ts_type_args(&mut self) -> Option<Box<TsTypeParamInstantiation>> {
debug_assert!(self.input.syntax().typescript());

self.try_parse_ts(|p| {
self.with_ctx(Context {
prefer_bin_op_over_type_arg_closing: true,
..self.ctx()
})
.try_parse_ts(|p| {
let type_args = p.parse_ts_type_args()?;
if is_one_of!(
p, '<', // invalid syntax
Expand Down
1 change: 1 addition & 0 deletions crates/swc_ecma_parser/tests/typescript/issue-6739/1.ts
@@ -0,0 +1 @@
console.log(x < y >>> z);
109 changes: 109 additions & 0 deletions crates/swc_ecma_parser/tests/typescript/issue-6739/1.ts.json
@@ -0,0 +1,109 @@
{
"type": "Script",
"span": {
"start": 1,
"end": 26,
"ctxt": 0
},
"body": [
{
"type": "ExpressionStatement",
"span": {
"start": 1,
"end": 26,
"ctxt": 0
},
"expression": {
"type": "CallExpression",
"span": {
"start": 1,
"end": 25,
"ctxt": 0
},
"callee": {
"type": "MemberExpression",
"span": {
"start": 1,
"end": 12,
"ctxt": 0
},
"object": {
"type": "Identifier",
"span": {
"start": 1,
"end": 8,
"ctxt": 0
},
"value": "console",
"optional": false
},
"property": {
"type": "Identifier",
"span": {
"start": 9,
"end": 12,
"ctxt": 0
},
"value": "log",
"optional": false
}
},
"arguments": [
{
"spread": null,
"expression": {
"type": "BinaryExpression",
"span": {
"start": 13,
"end": 24,
"ctxt": 0
},
"operator": "<",
"left": {
"type": "Identifier",
"span": {
"start": 13,
"end": 14,
"ctxt": 0
},
"value": "x",
"optional": false
},
"right": {
"type": "BinaryExpression",
"span": {
"start": 17,
"end": 24,
"ctxt": 0
},
"operator": ">>>",
"left": {
"type": "Identifier",
"span": {
"start": 17,
"end": 18,
"ctxt": 0
},
"value": "y",
"optional": false
},
"right": {
"type": "Identifier",
"span": {
"start": 23,
"end": 24,
"ctxt": 0
},
"value": "z",
"optional": false
}
}
}
}
],
"typeArguments": null
}
}
],
"interpreter": null
}
1 change: 1 addition & 0 deletions crates/swc_ecma_parser/tests/typescript/issue-6739/2.tsx
@@ -0,0 +1 @@
console.log(x < y >>> z);
109 changes: 109 additions & 0 deletions crates/swc_ecma_parser/tests/typescript/issue-6739/2.tsx.json
@@ -0,0 +1,109 @@
{
"type": "Script",
"span": {
"start": 1,
"end": 26,
"ctxt": 0
},
"body": [
{
"type": "ExpressionStatement",
"span": {
"start": 1,
"end": 26,
"ctxt": 0
},
"expression": {
"type": "CallExpression",
"span": {
"start": 1,
"end": 25,
"ctxt": 0
},
"callee": {
"type": "MemberExpression",
"span": {
"start": 1,
"end": 12,
"ctxt": 0
},
"object": {
"type": "Identifier",
"span": {
"start": 1,
"end": 8,
"ctxt": 0
},
"value": "console",
"optional": false
},
"property": {
"type": "Identifier",
"span": {
"start": 9,
"end": 12,
"ctxt": 0
},
"value": "log",
"optional": false
}
},
"arguments": [
{
"spread": null,
"expression": {
"type": "BinaryExpression",
"span": {
"start": 13,
"end": 24,
"ctxt": 0
},
"operator": "<",
"left": {
"type": "Identifier",
"span": {
"start": 13,
"end": 14,
"ctxt": 0
},
"value": "x",
"optional": false
},
"right": {
"type": "BinaryExpression",
"span": {
"start": 17,
"end": 24,
"ctxt": 0
},
"operator": ">>>",
"left": {
"type": "Identifier",
"span": {
"start": 17,
"end": 18,
"ctxt": 0
},
"value": "y",
"optional": false
},
"right": {
"type": "Identifier",
"span": {
"start": 23,
"end": 24,
"ctxt": 0
},
"value": "z",
"optional": false
}
}
}
}
],
"typeArguments": null
}
}
],
"interpreter": null
}

0 comments on commit 65a0d3a

Please sign in to comment.