git.delta.rocks / jrsonnet / refs/commits / 9b1cb43cbd7b

difftreelog

fix(fmt) differentiate between nodes of the same type

qkluvrtkYaroslav Bolyukin2026-02-08parent: #0c7230b.patch.diff
in: master

4 files changed

addedcrates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__asserts.snapdiffbeforeafterboth

no changes

modifiedcrates/jrsonnet-formatter/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-formatter/src/tests.rs
+++ b/crates/jrsonnet-formatter/src/tests.rs
@@ -91,3 +91,16 @@
 		"
 	)));
 }
+
+#[test]
+fn asserts() {
+	insta::assert_snapshot!(reformat(indoc!(
+		"
+			{
+				assert 1 > 0 : 'one should be greater than zero',
+				assert true,
+				value: 42,
+			}
+		"
+	)));
+}
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
@@ -14,7 +14,7 @@
 }
 impl SourceFile {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -27,7 +27,7 @@
 		support::children(&self.syntax)
 	}
 	pub fn expr_base(&self) -> Option<ExprBase> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn suffixs(&self) -> AstChildren<Suffix> {
 		support::children(&self.syntax)
@@ -46,7 +46,7 @@
 		support::token(&self.syntax, T![.])
 	}
 	pub fn index(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -75,7 +75,7 @@
 		support::token(&self.syntax, T!['['])
 	}
 	pub fn index(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![']'])
@@ -88,7 +88,7 @@
 }
 impl SuffixSlice {
 	pub fn slice_desc(&self) -> Option<SliceDesc> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -101,16 +101,16 @@
 		support::token(&self.syntax, T!['['])
 	}
 	pub fn from(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn colon_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![:])
 	}
 	pub fn end(&self) -> Option<SliceDescEnd> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn step(&self) -> Option<SliceDescStep> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![']'])
@@ -123,7 +123,7 @@
 }
 impl SuffixApply {
 	pub fn args_desc(&self) -> Option<ArgsDesc> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![tailstrict])
@@ -168,7 +168,7 @@
 }
 impl StmtAssert {
 	pub fn assertion(&self) -> Option<Assertion> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn semi_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![;])
@@ -184,13 +184,13 @@
 		support::token(&self.syntax, T![assert])
 	}
 	pub fn condition(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn colon_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![:])
 	}
 	pub fn message(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).nth(1usize)
 	}
 }
 
@@ -200,13 +200,13 @@
 }
 impl ExprBinary {
 	pub fn lhs(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn binary_operator(&self) -> Option<BinaryOperator> {
 		support::token_child(&self.syntax)
 	}
 	pub fn rhs(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).nth(1usize)
 	}
 }
 
@@ -219,7 +219,7 @@
 		support::token_child(&self.syntax)
 	}
 	pub fn rhs(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -229,7 +229,7 @@
 }
 impl ExprObjExtend {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -242,7 +242,7 @@
 		support::token(&self.syntax, T!['('])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![')'])
@@ -301,7 +301,7 @@
 }
 impl ExprObject {
 	pub fn obj_body(&self) -> Option<ObjBody> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -314,7 +314,7 @@
 		support::token(&self.syntax, T!['['])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn comma_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![,])
@@ -346,7 +346,7 @@
 }
 impl ExprVar {
 	pub fn name(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -359,19 +359,19 @@
 		support::token(&self.syntax, T![if])
 	}
 	pub fn cond(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn then_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![then])
 	}
 	pub fn then(&self) -> Option<TrueExpr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn else_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![else])
 	}
 	pub fn else_(&self) -> Option<FalseExpr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -381,7 +381,7 @@
 }
 impl TrueExpr {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -391,7 +391,7 @@
 }
 impl FalseExpr {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -407,13 +407,13 @@
 		support::token(&self.syntax, T!['('])
 	}
 	pub fn params_desc(&self) -> Option<ParamsDesc> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![')'])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -442,7 +442,7 @@
 		support::token(&self.syntax, T![error])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -452,7 +452,7 @@
 }
 impl SliceDescEnd {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -462,7 +462,7 @@
 }
 impl SliceDescStep {
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -472,13 +472,13 @@
 }
 impl Arg {
 	pub fn name(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn assign_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![=])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -523,7 +523,7 @@
 }
 impl MemberBindStmt {
 	pub fn obj_local(&self) -> Option<ObjLocal> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -536,7 +536,7 @@
 		support::token(&self.syntax, T![local])
 	}
 	pub fn bind(&self) -> Option<Bind> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -546,7 +546,7 @@
 }
 impl MemberAssertStmt {
 	pub fn assertion(&self) -> Option<Assertion> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -556,7 +556,7 @@
 }
 impl MemberFieldNormal {
 	pub fn field_name(&self) -> Option<FieldName> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn plus_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![+])
@@ -565,7 +565,7 @@
 		support::token_child(&self.syntax)
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -575,16 +575,16 @@
 }
 impl MemberFieldMethod {
 	pub fn field_name(&self) -> Option<FieldName> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn params_desc(&self) -> Option<ParamsDesc> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn visibility(&self) -> Option<Visibility> {
 		support::token_child(&self.syntax)
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -594,7 +594,7 @@
 }
 impl FieldNameFixed {
 	pub fn id(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn text(&self) -> Option<Text> {
 		support::token_child(&self.syntax)
@@ -610,7 +610,7 @@
 		support::token(&self.syntax, T!['['])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![']'])
@@ -626,13 +626,13 @@
 		support::token(&self.syntax, T![for])
 	}
 	pub fn bind(&self) -> Option<Destruct> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn in_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![in])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -645,7 +645,7 @@
 		support::token(&self.syntax, T![if])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -655,13 +655,13 @@
 }
 impl BindDestruct {
 	pub fn into(&self) -> Option<Destruct> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn assign_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![=])
 	}
 	pub fn value(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -671,16 +671,16 @@
 }
 impl BindFunction {
 	pub fn name(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn params(&self) -> Option<ParamsDesc> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn assign_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![=])
 	}
 	pub fn value(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -690,13 +690,13 @@
 }
 impl Param {
 	pub fn destruct(&self) -> Option<Destruct> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn assign_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![=])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -706,7 +706,7 @@
 }
 impl DestructFull {
 	pub fn name(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -748,7 +748,7 @@
 		support::children(&self.syntax)
 	}
 	pub fn destruct_rest(&self) -> Option<DestructRest> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn comma_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![,])
@@ -764,19 +764,19 @@
 }
 impl DestructObjectField {
 	pub fn field(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn colon_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![:])
 	}
 	pub fn destruct(&self) -> Option<Destruct> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 	pub fn assign_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![=])
 	}
 	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -789,7 +789,7 @@
 		support::token(&self.syntax, T![...])
 	}
 	pub fn into(&self) -> Option<Name> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
@@ -799,7 +799,7 @@
 }
 impl DestructArrayElement {
 	pub fn destruct(&self) -> Option<Destruct> {
-		support::child(&self.syntax)
+		support::children(&self.syntax).next()
 	}
 }
 
modifiedxtask/src/sourcegen/mod.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/mod.rs
+++ b/xtask/src/sourcegen/mod.rs
@@ -1,4 +1,4 @@
-use std::path::PathBuf;
+use std::{collections::HashMap, path::PathBuf};
 
 use anyhow::Result;
 use ast::{lower, AstSrc};
@@ -202,7 +202,15 @@
 				quote!(impl ast::#trait_name for #name {})
 			});
 
-			let methods = node.fields.iter().map(|field| {
+			let mut type_positions: HashMap<String, usize> = HashMap::new();
+			let field_positions: Vec<_> = node.fields.iter().map(|field| {
+				let ty_str = field.ty().to_string();
+				let pos = *type_positions.get(&ty_str).unwrap_or(&0);
+				type_positions.insert(ty_str, pos + 1);
+				pos
+			}).collect();
+
+			let methods = node.fields.iter().zip(field_positions.iter()).map(|(field, &pos)| {
 				let method_name = field.method_name(kinds);
 				let ty = field.ty();
 
@@ -224,10 +232,16 @@
 							support::token_child(&self.syntax)
 						}
 					}
+				} else if pos == 0 {
+					quote! {
+						pub fn #method_name(&self) -> Option<#ty> {
+							support::children(&self.syntax).next()
+						}
+					}
 				} else {
 					quote! {
 						pub fn #method_name(&self) -> Option<#ty> {
-							support::child(&self.syntax)
+							support::children(&self.syntax).nth(#pos)
 						}
 					}
 				}