fix(parser): add missing ChainExpression in optional TSInstantiationExpression (#7371)

This commit is contained in:
Boshen 2024-11-20 11:51:55 +00:00
parent 7bf970a4b6
commit 666b6c104c
5 changed files with 15 additions and 4 deletions

View file

@ -98,6 +98,7 @@ fn test() {
("var x = a/*?.*/?.b", None),
("var x = '?.'?.['?.']", None),
("var x = '?.'?.['?.']", None),
("a?.c?.b<c>", None),
(
"var x = a?.b",
Some(serde_json::json!([{

View file

@ -56,6 +56,12 @@ snapshot_kind: text
· ────────────
╰────
⚠ oxc(no-optional-chaining): Optional chaining is not allowed.
╭─[no_optional_chaining.tsx:1:1]
1 │ a?.c?.b<c>
· ───────
╰────
⚠ oxc(no-optional-chaining): Optional chaining is not allowed.
╭─[no_optional_chaining.tsx:1:9]
1 │ var x = a?.b

View file

@ -14,9 +14,9 @@ use pico_args::Arguments;
fn main() -> Result<(), String> {
let mut args = Arguments::from_env();
let name = args.subcommand().ok().flatten().unwrap_or_else(|| String::from("test.js"));
let show_ast = args.contains("--ast");
let show_comments = args.contains("--comments");
let name = args.free_from_str().unwrap_or_else(|_| "test.js".to_string());
let path = Path::new(&name);
let source_text = fs::read_to_string(path).map_err(|_| format!("Missing '{name}'"))?;

View file

@ -674,9 +674,15 @@ impl<'a> ParserImpl<'a> {
self.parse_tagged_template(lhs_span, expr, *in_optional_chain, type_parameters)?
}
Kind::LAngle | Kind::ShiftLeft => {
let optional_chain_span = (*in_optional_chain).then(|| self.end_span(lhs_span));
if let Some(Some(arguments)) =
self.try_parse(Self::parse_type_arguments_in_expression)
{
// `a?.c?.b<c>`
if let Some(optional_chain_span) = optional_chain_span {
*in_optional_chain = false;
lhs = self.map_to_chain_expression(optional_chain_span, lhs);
}
lhs = self.ast.expression_ts_instantiation(
self.end_span(lhs_span),
lhs,

View file

@ -1987,9 +1987,7 @@ after transform: ["C", "T"]
rebuilt : ["C"]
* type-arguments/optional-call/input.ts
Unresolved references mismatch:
after transform: ["Q", "T", "f", "x"]
rebuilt : ["f", "x"]
x Output mismatch
* type-arguments/tagged-template/input.ts
Unresolved references mismatch: