Skip to content

Commit

Permalink
fix: various parsing fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
CertainLach committed Mar 17, 2024
1 parent bfcd43b commit 00fbb91
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 59 deletions.
90 changes: 84 additions & 6 deletions cmds/jrsonnet-fmt/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ use std::{
io::{self, Write},
path::PathBuf,
process,
rc::Rc,
};

use children::{children_between, trivia_before};
use clap::Parser;
use dprint_core::formatting::{PrintItems, PrintOptions};
use dprint_core::formatting::{
condition_helpers::is_multiple_lines, condition_resolvers::true_resolver,
ConditionResolverContext, LineNumber, PrintItems, PrintOptions,
};
use jrsonnet_rowan_parser::{
nodes::{
ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,
Arg, ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,
DestructRest, Expr, ExprBase, FieldName, ForSpec, IfSpec, ImportKind, Literal, Member,
Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, Stmt, Suffix, Text,
UnaryOperator, Visibility,
Expand Down Expand Up @@ -64,6 +68,55 @@ macro_rules! pi {
$o.push_signal(dprint_core::formatting::Signal::FinishIndent);
pi!(@s; $o: $($t)*);
}};
(@s; $o:ident: info($v:expr) $($t:tt)*) => {{
$o.push_info($v);
pi!(@s; $o: $($t)*);
}};
(@s; $o:ident: if($s:literal, $cond:expr, $($i:tt)*) $($t:tt)*) => {{
$o.push_condition(dprint_core::formatting::conditions::if_true(
$s,
$cond.clone(),
{
let mut o = PrintItems::new();
p!(o, $($i)*);
o
},
));
pi!(@s; $o: $($t)*);
}};
(@s; $o:ident: if_else($s:literal, $cond:expr, $($i:tt)*)($($e:tt)+) $($t:tt)*) => {{
$o.push_condition(dprint_core::formatting::conditions::if_true_or(
$s,
$cond.clone(),
{
let mut o = PrintItems::new();
p!(o, $($i)*);
o
},
{
let mut o = PrintItems::new();
p!(o, $($e)*);
o
},
));
pi!(@s; $o: $($t)*);
}};
(@s; $o:ident: if_not($s:literal, $cond:expr, $($e:tt)*) $($t:tt)*) => {{
$o.push_condition(dprint_core::formatting::conditions::if_true_or(
$s,
$cond.clone(),
{
let o = PrintItems::new();
o
},
{
let mut o = PrintItems::new();
p!(o, $($e)*);
o
},
));
pi!(@s; $o: $($t)*);
}};
(@s; $o:ident: {$expr:expr} $($t:tt)*) => {{
$expr.print($o);
pi!(@s; $o: $($t)*);
Expand Down Expand Up @@ -244,14 +297,38 @@ impl Printable for ParamsDesc {
}
impl Printable for ArgsDesc {
fn print(&self, out: &mut PrintItems) {
p!(out, str("(") >i nl);
for arg in self.args() {
let start = LineNumber::new("start");
let end = LineNumber::new("end");
let multi_line = Rc::new(move |condition_context: &mut ConditionResolverContext| {
is_multiple_lines(condition_context, start, end).map(|v| !v)
});
p!(out, str("(") info(start) if("start args", multi_line, >i nl));
let (children, end_comments) = children_between::<Arg>(
self.syntax().clone(),
self.l_paren_token().map(Into::into).as_ref(),
self.r_paren_token().map(Into::into).as_ref(),
None,
);
let mut args = children.into_iter().peekable();
while let Some(ele) = args.next() {
if ele.should_start_with_newline {
p!(out, nl);
}
format_comments(&ele.before_trivia, CommentLocation::AboveItem, out);
let arg = ele.value;
if arg.name().is_some() || arg.assign_token().is_some() {
p!(out, {arg.name()} str(" = "));
}
p!(out, {arg.expr()} str(",") nl)
let comma_between = if args.peek().is_some() {
true_resolver()
} else {
multi_line.clone()
};
p!(out, {arg.expr()} if("arg comma", comma_between, str(",") if_not("between args", multi_line, str(" "))));
format_comments(&ele.inline_trivia, CommentLocation::ItemInline, out);
p!(out, if("between args", multi_line, nl));
}
p!(out, <i str(")"));
p!(out, if("end args", multi_line, <i info(end)) str(")"));
}
}
impl Printable for SliceDesc {
Expand Down Expand Up @@ -513,6 +590,7 @@ impl Printable for Stmt {
format_comments(&bind.before_trivia, CommentLocation::AboveItem, out);
p!(out, {bind.value} str(","));
format_comments(&bind.inline_trivia, CommentLocation::ItemInline, out);
p!(out, nl)
}
if end_comments.should_start_with_newline {
p!(out, nl)
Expand Down
49 changes: 0 additions & 49 deletions cmds/jrsonnet-fmt/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,55 +21,6 @@ fn reformat(input: &str) -> String {
)
}

macro_rules! assert_formatted {
($input:literal, $output:literal) => {
let formatted = reformat(indoc!($input));
let mut expected = indoc!($output).to_owned();
expected.push('\n');
if formatted != expected {
panic!(
"bad formatting, expected\n```\n{formatted}\n```\nto be equal to\n```\n{expected}\n```",
)
}
};
}

#[test]
fn padding_stripped_for_multiline_comment() {
assert_formatted!(
"{
/*
Hello
World
*/
_: null,
}",
"{
/*
Hello
World
*/
_: null,
}"
);
}

#[test]
fn last_comment_respects_spacing_with_inline_comment_above() {
assert_formatted!(
"{
a: '', // Inline
// Comment
}",
"{
a: '', // Inline
// Comment
}"
);
}

#[test]
fn complex_comments_snapshot() {
insta::assert_display_snapshot!(reformat(indoc!(
Expand Down
4 changes: 2 additions & 2 deletions crates/jrsonnet-rowan-parser/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ fn object(p: &mut Parser) -> CompletedMarker {
p.bump();
break;
}
if p.at_ts(COMPSPEC) {
if p.at_ts(TS![for]) {
if elems == 0 {
let m = p.start();
m.complete_missing(p, ExpectedSyntax::Named("field definition"));
Expand Down Expand Up @@ -612,7 +612,7 @@ fn array(p: &mut Parser) -> CompletedMarker {
p.bump();
break;
}
if elems != 0 && p.at_ts(COMPSPEC) {
if elems != 0 && p.at_ts(TS![for]) {
while p.at_ts(COMPSPEC) {
compspecs.push(compspec(p));
}
Expand Down
3 changes: 1 addition & 2 deletions crates/jrsonnet-rowan-parser/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,7 @@ fn stdlib() {
#[test]
fn eval_simple() {
let src = "local a = 1, b = 2; a + local c = 1; c";
let (node, errors) = parse(src);
assert!(errors.is_empty());
let (node, _errors) = parse(src);

dbg!(node);
}

0 comments on commit 00fbb91

Please sign in to comment.