git.delta.rocks / jrsonnet / refs/commits / 016538aa1e6d

difftreelog

feat(fmt) preserve comments at root of source code

Yaroslav Bolyukin2022-06-22parent: #014057b.patch.diff
in: master

3 files changed

modifiedcmds/jrsonnet-fmt/src/children.rsdiffbeforeafterboth
1// TODO: Return errors as trivia
2
1use std::{fmt::Debug, marker::PhantomData, mem};3use std::{fmt::Debug, marker::PhantomData, mem};
24
911
10pub type ChildTrivia = Vec<Trivia>;12pub type ChildTrivia = Vec<Trivia>;
1113
14/// Node should have no non-trivia tokens before element
15pub 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 }
21
22 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 out
35}
36/// Node should have no non-trivia tokens after element
12pub 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 out
60}
1661
17pub 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(),
3177
32pub 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 end
34 count_newlines_before(&tt) >= 280 count_newlines_before(tt) >= 2
35}81}
3682
37fn count_newlines_before(tt: &ChildTrivia) -> usize {83fn count_newlines_before(tt: &ChildTrivia) -> usize {
modifiedcmds/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
 "#,
 	);
 
modifiedcrates/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