From 46d469f4bee6afd6b0d7dfdb3f095b98b18ac5f9 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 20 Nov 2022 21:39:40 +0100 Subject: [PATCH] Ignore linebreak directly after markup statement --- src/syntax/ast.rs | 12 +++++++++++- src/syntax/kind.rs | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 381ba712c..46ce40c80 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -56,7 +56,17 @@ node! { impl Markup { /// The children. pub fn children(&self) -> impl DoubleEndedIterator + '_ { - self.0.children().filter_map(SyntaxNode::cast) + let mut was_stmt = false; + self.0 + .children() + .filter(move |node| { + // Ignore linebreak directly after statements without semicolons. + let kind = node.kind(); + let keep = !was_stmt || !matches!(kind, NodeKind::Space { newlines: 1 }); + was_stmt = kind.is_stmt(); + keep + }) + .filter_map(SyntaxNode::cast) } } diff --git a/src/syntax/kind.rs b/src/syntax/kind.rs index b3948c663..c973632c1 100644 --- a/src/syntax/kind.rs +++ b/src/syntax/kind.rs @@ -314,6 +314,18 @@ impl NodeKind { matches!(self, NodeKind::Error(_, _)) } + /// Does this node need termination through a semicolon or linebreak? + pub fn is_stmt(&self) -> bool { + matches!( + self, + NodeKind::LetBinding + | NodeKind::SetRule + | NodeKind::ShowRule + | NodeKind::ModuleImport + | NodeKind::ModuleInclude + ) + } + /// A human-readable name for the kind. pub fn name(&self) -> &'static str { match self {