summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/syntax/ast.rs12
-rw-r--r--src/syntax/kind.rs12
2 files changed, 23 insertions, 1 deletions
diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs
index 381ba712..46ce40c8 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<Item = MarkupNode> + '_ {
- 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 b3948c66..c973632c 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 {