fix(es/parser): Fix priority of >>> (#6748)

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/6739.
This commit is contained in:
Donny/강동윤 2023-01-04 16:27:08 +09:00 committed by GitHub
parent d7081cc8a6
commit 65a0d3a310
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 246 additions and 3 deletions

View File

@ -0,0 +1,8 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false
}
}
}

View File

@ -0,0 +1 @@
console.log(x < y >>> z);

View File

@ -0,0 +1 @@
console.log(x < y >>> z);

View File

@ -0,0 +1 @@
console.log(x < y >>> z);

View File

@ -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!('>')));
}

View File

@ -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)]

View File

@ -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
};

View File

@ -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

View File

@ -0,0 +1 @@
console.log(x < y >>> z);

View File

@ -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
}

View File

@ -0,0 +1 @@
console.log(x < y >>> z);

View File

@ -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
}