0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-04 01:44:26 -05:00

fix: panic with js lint plugins and invalid js syntax (#28006)

Noticed that the LSP might panic during serialization when working on a
file with a syntax error.

This PR changes the serialization so that invalid nodes are simply
serialized to the invalid node `0`. The plugin code treats the node with
id `0` as an invalid node and will ignore it during visiting.

I'm not sure how to write a test for the LSP.
This commit is contained in:
Marvin Hagemeister 2025-02-07 12:35:44 +01:00 committed by Bartek Iwańczuk
parent 8d6d2cce59
commit 4a60de43b2
No known key found for this signature in database
GPG key ID: 0C6BCDDC3B3AD750

View file

@ -214,7 +214,10 @@ fn serialize_module_decl(
// Already handled earlier
ExportSpecifier::Namespace(_) => unreachable!(),
// this is not syntactically valid
ExportSpecifier::Default(_) => unreachable!(),
ExportSpecifier::Default(_) => {
// Ignore syntax errors
NodeRef(0)
}
}
})
.collect::<Vec<_>>();
@ -397,7 +400,10 @@ fn serialize_import_attrs(
.map(|prop| {
let (key, value) = match prop {
// Invalid syntax
PropOrSpread::Spread(_) => unreachable!(),
PropOrSpread::Spread(_) => {
// Ignore syntax errors
(NodeRef(0), NodeRef(0))
}
PropOrSpread::Prop(prop) => {
match prop.as_ref() {
Prop::Shorthand(ident) => (
@ -412,7 +418,10 @@ fn serialize_import_attrs(
Prop::Assign(_)
| Prop::Getter(_)
| Prop::Setter(_)
| Prop::Method(_) => unreachable!(),
| Prop::Method(_) => {
// Ignore syntax errors
(NodeRef(0), NodeRef(0))
}
}
}
};
@ -723,7 +732,10 @@ fn serialize_expr(ctx: &mut TsEsTreeBuilder, expr: &Expr) -> NodeRef {
SimpleAssignTarget::TsInstantiation(target) => {
serialize_expr(ctx, &Expr::TsInstantiation(target.clone()))
}
SimpleAssignTarget::Invalid(_) => unreachable!(),
SimpleAssignTarget::Invalid(_) => {
// Ignore syntax errors
NodeRef(0)
}
}
}
AssignTarget::Pat(target) => match target {
@ -733,7 +745,10 @@ fn serialize_expr(ctx: &mut TsEsTreeBuilder, expr: &Expr) -> NodeRef {
AssignTargetPat::Object(object_pat) => {
serialize_pat(ctx, &Pat::Object(object_pat.clone()))
}
AssignTargetPat::Invalid(_) => unreachable!(),
AssignTargetPat::Invalid(_) => {
// Ignore syntax errors
NodeRef(0)
}
},
};
@ -1033,7 +1048,8 @@ fn serialize_expr(ctx: &mut TsEsTreeBuilder, expr: &Expr) -> NodeRef {
ctx.write_chain_expr(&node.span, expr)
}
Expr::Invalid(_) => {
unreachable!()
// Ignore syntax errors
NodeRef(0)
}
}
}
@ -1817,7 +1833,10 @@ fn serialize_pat(ctx: &mut TsEsTreeBuilder, pat: &Pat) -> NodeRef {
ctx.write_assign_pat(&node.span, left, right)
}
Pat::Invalid(_) => unreachable!(),
Pat::Invalid(_) => {
// Ignore syntax errors
NodeRef(0)
}
Pat::Expr(node) => serialize_expr(ctx, node),
}
}