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:
parent
8d6d2cce59
commit
4a60de43b2
1 changed files with 26 additions and 7 deletions
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue