difftreelog
feat(fmt) preserve comments at root of source code
in: master
3 files changed
cmds/jrsonnet-fmt/src/children.rsdiffbeforeafterboth1// TODO: Return errors as trivia21use std::{fmt::Debug, marker::PhantomData, mem};3use std::{fmt::Debug, marker::PhantomData, mem};2491110pub type ChildTrivia = Vec<Trivia>;12pub type ChildTrivia = Vec<Trivia>;111314/// Node should have no non-trivia tokens before element15pub fn trivia_before(node: SyntaxNode, end: Option<&SyntaxElement>) -> ChildTrivia {16 let mut out = Vec::new();17 for item in node.children_with_tokens() {18 if Some(&item) == end {19 break;20 }2122 if let Some(trivia) = item.as_token().cloned().and_then(Trivia::cast) {23 out.push(trivia);24 } else if end.is_none() {25 break;26 } else {27 assert!(28 TS![, ;].contains(item.kind()) || item.kind() == ERROR,29 "silently eaten token: {:?}",30 item.kind()31 )32 }33 }34 out35}36/// Node should have no non-trivia tokens after element12pub struct ChildIterator<I, T> {37pub fn trivia_after(node: SyntaxNode, start: Option<&SyntaxElement>) -> ChildTrivia {13 inner: I,38 if start.is_none() {14 _marker: PhantomData<T>,39 return Vec::new();15}40 }41 let mut iter = node.children_with_tokens().peekable();42 while iter.peek() != start {43 // println!("Skipped {}");44 dbg!(&iter.next());45 }46 dbg!(&iter.next());47 let mut out = Vec::new();48 for item in iter {49 if let Some(trivia) = item.as_token().cloned().and_then(Trivia::cast) {50 out.push(trivia);51 } else {52 assert!(53 TS![, ;].contains(item.kind()) || item.kind() == ERROR,54 "silently eaten token: {:?}",55 item.kind()56 )57 }58 }59 out60}166117pub fn children_between<T: AstNode + Debug>(62pub fn children_between<T: AstNode + Debug>(18 node: SyntaxNode,63 node: SyntaxNode,19 start: Option<&SyntaxElement>,64 start: Option<&SyntaxElement>,20 end: Option<&SyntaxElement>,65 end: Option<&SyntaxElement>,21) -> (Vec<Child<T>>, ChildTrivia) {66) -> (Vec<Child<T>>, ChildTrivia) {22 let mut iter = node.children_with_tokens().peekable();67 let mut iter = node.children_with_tokens().peekable();23 while iter.peek() == start {68 while iter.peek() != start {24 iter.next();69 iter.next();25 }70 }71 iter.next();26 children(72 children(27 iter.take_while(|i| Some(i) != end),73 iter.take_while(|i| Some(i) != end),28 start.is_none() || end.is_none(),74 start.is_none() || end.is_none(),317732pub fn should_start_with_newline(tt: &ChildTrivia) -> bool {78pub fn should_start_with_newline(tt: &ChildTrivia) -> bool {33 // First for previous item end79 // First for previous item end34 count_newlines_before(&tt) >= 280 count_newlines_before(tt) >= 235}81}368237fn count_newlines_before(tt: &ChildTrivia) -> usize {83fn count_newlines_before(tt: &ChildTrivia) -> usize {cmds/jrsonnet-fmt/src/main.rsdiffbeforeafterboth--- a/cmds/jrsonnet-fmt/src/main.rs
+++ b/cmds/jrsonnet-fmt/src/main.rs
@@ -1,6 +1,6 @@
use std::any::type_name;
-use children::children_between;
+use children::{children_between, trivia_before};
use dprint_core::formatting::{PrintItems, PrintOptions};
use jrsonnet_rowan_parser::{
nodes::{
@@ -13,7 +13,7 @@
};
use crate::{
- children::should_start_with_newline,
+ children::{should_start_with_newline, trivia_after},
comments::{format_comments, CommentLocation},
};
@@ -463,8 +463,25 @@
impl Printable for SourceFile {
fn print(&self) -> PrintItems {
- assert!(self.expr().is_some());
- self.expr().print()
+ let mut pi = p!(new:);
+ let before = trivia_before(
+ self.syntax().clone(),
+ self.expr()
+ .map(|e| e.syntax().clone())
+ .map(Into::into)
+ .as_ref(),
+ );
+ let after = trivia_after(
+ self.syntax().clone(),
+ self.expr()
+ .map(|e| e.syntax().clone())
+ .map(Into::into)
+ .as_ref(),
+ );
+ p!(pi: items(format_comments(&before, CommentLocation::AboveItem)));
+ p!(pi: {self.expr()} nl);
+ p!(pi: items(format_comments(&after, CommentLocation::EndOfItems)));
+ pi
}
}
@@ -574,6 +591,7 @@
} + Template
+ // Comment after everything
"#,
);
crates/jrsonnet-rowan-parser/src/event.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/event.rs
+++ b/crates/jrsonnet-rowan-parser/src/event.rs
@@ -117,6 +117,9 @@
eat_start_whitespace = false;
}
Event::Finish { wrapper } => {
+ if depth == 1 {
+ self.skip_whitespace();
+ }
self.builder.finish_node();
depth -= 1;
let mut idx = idx;
@@ -126,6 +129,9 @@
wrapper = if let Event::Finish { wrapper } =
mem::replace(&mut self.events[idx], Event::Noop)
{
+ if depth == 1 {
+ self.skip_whitespace();
+ }
self.builder.finish_node();
depth -= 1;
wrapper