git.delta.rocks / jrsonnet / refs/commits / e9c741d736e9

difftreelog

refactor AssertStmt to struct

zksvlxnsYaroslav Bolyukin2026-04-25parent: #6fbff53.patch.diff
in: master

6 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs
@@ -454,19 +454,18 @@
 }
 
 pub fn evaluate_assert(ctx: Context, assertion: &AssertStmt) -> Result<()> {
-	let value = &assertion.0;
-	let msg = &assertion.1;
+	let AssertStmt { assertion, message } = assertion;
 	let assertion_result = in_frame(
-		CallLocation::new(&value.span),
+		CallLocation::new(&assertion.span),
 		|| "assertion condition".to_owned(),
-		|| bool::from_untyped(evaluate(ctx.clone(), value)?),
+		|| bool::from_untyped(evaluate(ctx.clone(), assertion)?),
 	)?;
 	if !assertion_result {
 		in_frame(
-			CallLocation::new(&value.span),
+			CallLocation::new(&assertion.span),
 			|| "assertion failure".to_owned(),
 			|| {
-				if let Some(msg) = msg {
+				if let Some(msg) = message {
 					bail!(AssertionFailed(evaluate(ctx, msg)?.to_string()?));
 				}
 				bail!(AssertionFailed(Val::Null.to_string()?));
modifiedcrates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/lib.rs
+++ b/crates/jrsonnet-ir-parser/src/lib.rs
@@ -237,13 +237,13 @@
 
 fn assert_stmt(p: &mut Parser<'_>) -> Result<AssertStmt> {
 	p.eat(T![assert])?;
-	let cond = spanned(p, expr)?;
-	let msg = if p.try_eat(T![:]) {
-		Some(spanned(p, expr)?)
+	let assertion = spanned(p, expr)?;
+	let message = if p.try_eat(T![:]) {
+		Some(expr(p)?)
 	} else {
 		None
 	};
-	Ok(AssertStmt(cond, msg))
+	Ok(AssertStmt { assertion, message })
 }
 
 fn if_spec_data(p: &mut Parser<'_>) -> Result<IfSpecData> {
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
@@ -4,8 +4,8 @@
 ---
 AssertExpr(
     AssertExpr {
-        assert: AssertStmt(
-            Index {
+        assert: AssertStmt {
+            assertion: Index {
                 indexable: Literal(
                     True,
                 ),
@@ -18,12 +18,12 @@
                     },
                 ],
             } from virtual:<test>:7-18,
-            Some(
+            message: Some(
                 Literal(
                     False,
-                ) from virtual:<test>:21-26,
+                ),
             ),
-        ),
+        },
         rest: Literal(
             True,
         ),
modifiedcrates/jrsonnet-ir/src/expr.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/expr.rs
+++ b/crates/jrsonnet-ir/src/expr.rs
@@ -38,7 +38,10 @@
 }
 
 #[derive(Debug, PartialEq, Acyclic)]
-pub struct AssertStmt(pub Spanned<Expr>, pub Option<Spanned<Expr>>);
+pub struct AssertStmt {
+	pub assertion: Spanned<Expr>,
+	pub message: Option<Expr>,
+}
 
 #[derive(Debug, PartialEq, Acyclic)]
 pub struct FieldMember {
modifiedcrates/jrsonnet-ir/src/visit.rsdiffbeforeafterboth
before · crates/jrsonnet-ir/src/visit.rs
1use jrsonnet_interner::IStr;23use crate::{4	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, Expr, ExprParam,5	ExprParams, FieldMember, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, IndexPart,6	ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,7};89pub trait Visitor: Sized {10	fn visit_expr(&mut self, e: &Expr) {11		visit_expr(self, e)12	}13	fn visit_import(&mut self, _as_expression: bool, _value: IStr) {}14}1516#[cfg(feature = "exp-destruct")]17pub fn visit_destruct_rest<V: Visitor>(_v: &mut V, destruct: &crate::DestructRest) {18	match destruct {19		crate::DestructRest::Keep(_name) => {}20		crate::DestructRest::Drop => {}21	}22}2324#[allow(unused_variables, reason = "used with exp-destruct")]25pub fn visit_destruct<V: Visitor>(v: &mut V, destruct: &Destruct) {26	match destruct {27		Destruct::Full(_istr) => {}28		#[cfg(feature = "exp-destruct")]29		Destruct::Skip => {}30		#[cfg(feature = "exp-destruct")]31		Destruct::Array { start, rest, end } => {32			for s in start {33				visit_destruct(v, s);34			}35			if let Some(rest) = rest {36				visit_destruct_rest(v, rest);37			}38			for s in end {39				visit_destruct(v, s);40			}41		}42		#[cfg(feature = "exp-destruct")]43		Destruct::Object { fields, rest } => {44			for (_name, into, default) in fields {45				if let Some(into) = into {46					visit_destruct(v, into);47				}48				if let Some(default) = default {49					v.visit_expr(default);50				}51				if let Some(rest) = rest {52					visit_destruct_rest(v, rest);53				}54			}55		}56	}57}5859pub fn visit_if_spec<V: Visitor>(v: &mut V, cond: &IfSpecData) {60	let IfSpecData { span: _, cond } = cond;61	v.visit_expr(cond);62}6364pub fn visit_comp_spec<V: Visitor>(v: &mut V, c: &CompSpec) {65	match c {66		CompSpec::IfSpec(cond) => visit_if_spec(v, cond),67		CompSpec::ForSpec(for_spec_data) => {68			let ForSpecData { destruct, over } = for_spec_data;69			visit_destruct(v, destruct);70			v.visit_expr(over);71		}72	}73}74pub fn visit_params<V: Visitor>(v: &mut V, par: &ExprParams) {75	let ExprParams {76		exprs,77		signature: _,78		binds_len: _,79	} = par;80	for par in &**exprs {81		let ExprParam { destruct, default } = &par;82		visit_destruct(v, destruct);83		if let Some(default) = default {84			v.visit_expr(default);85		}86	}87}8889pub fn visit_bind_spec<V: Visitor>(v: &mut V, bind: &BindSpec) {90	match bind {91		BindSpec::Field { into, value } => {92			visit_destruct(v, into);93			v.visit_expr(value);94		}95		BindSpec::Function {96			name: _,97			params,98			value,99		} => {100			visit_params(v, params);101			v.visit_expr(value);102		}103	}104}105106pub fn visit_field_member<V: Visitor>(v: &mut V, mem: &FieldMember) {107	let FieldMember {108		name,109		plus: _,110		params,111		visibility: _,112		value,113	} = mem;114	match &**name {115		FieldName::Fixed(_istr) => {}116		FieldName::Dyn(expr) => v.visit_expr(expr),117	}118	if let Some(params) = params {119		visit_params(v, params);120	}121	v.visit_expr(value);122}123124pub fn visit_obj_body<V: Visitor>(v: &mut V, obj_body: &ObjBody) {125	match obj_body {126		ObjBody::MemberList(obj_members) => {127			let ObjMembers {128				locals,129				asserts,130				fields,131			} = obj_members;132			for local in &**locals {133				visit_bind_spec(v, local);134			}135			for assert in &**asserts {136				visit_assert_stmt(v, assert);137			}138			for field in fields {139				visit_field_member(v, field);140			}141		}142		ObjBody::ObjComp(obj_comp) => {143			let ObjComp {144				locals,145				field,146				compspecs,147			} = obj_comp;148			for local in &**locals {149				visit_bind_spec(v, local);150			}151			visit_field_member(v, field);152			for compspec in compspecs {153				visit_comp_spec(v, compspec);154			}155		}156	}157}158159pub fn visit_assert_stmt<V: Visitor>(v: &mut V, ass: &AssertStmt) {160	let AssertStmt(cond, msg) = ass;161	v.visit_expr(cond);162	if let Some(msg) = msg {163		v.visit_expr(msg);164	}165}166pub fn visit_expr<V: Visitor>(v: &mut V, e: &Expr) {167	match e {168		Expr::Literal(_literal_type) => {}169		Expr::Str(_istr) => {}170		Expr::Num(_num) => {}171		Expr::Var(_spanned) => {}172		Expr::Arr(exprs) => {173			for e in &**exprs {174				v.visit_expr(e);175			}176		}177		Expr::ArrComp(expr, comp_specs) => {178			v.visit_expr(expr);179			for ele in comp_specs {180				visit_comp_spec(v, ele);181			}182		}183		Expr::Obj(obj_body) => visit_obj_body(v, obj_body),184		Expr::ObjExtend(expr, obj_body) => {185			v.visit_expr(expr);186			visit_obj_body(v, obj_body);187		}188		Expr::UnaryOp(_unary_op_type, expr) => {189			v.visit_expr(expr);190		}191		Expr::BinaryOp(binary_op) => {192			let BinaryOp { lhs, op: _, rhs } = &**binary_op;193			v.visit_expr(lhs);194			v.visit_expr(rhs);195		}196		Expr::AssertExpr(assert_expr) => {197			let AssertExpr { assert, rest } = &**assert_expr;198			visit_assert_stmt(v, assert);199			v.visit_expr(rest);200		}201		Expr::LocalExpr(bind_specs, expr) => {202			for local in bind_specs {203				visit_bind_spec(v, local);204			}205			v.visit_expr(expr);206		}207		Expr::Import(kind, expr) => {208			v.visit_expr(expr);209210			if let Expr::Str(expr) = &**expr {211				v.visit_import(matches!(**kind, ImportKind::Normal), expr.clone());212			}213		}214		Expr::ErrorStmt(_span, expr) => {215			v.visit_expr(expr);216		}217		Expr::Apply(expr, spanned, _) => {218			v.visit_expr(expr);219			let ArgsDesc {220				unnamed,221				names: _,222				values,223			} = &**spanned;224			for unnamed in unnamed {225				v.visit_expr(unnamed);226			}227			for named in values {228				v.visit_expr(named);229			}230		}231		Expr::Index { indexable, parts } => {232			v.visit_expr(indexable);233234			for part in parts {235				let IndexPart {236					span: _,237					value,238					#[cfg(feature = "exp-null-coaelse")]239						null_coaelse: _,240				} = part;241				v.visit_expr(value);242			}243		}244		Expr::Function(expr_params, expr) => {245			visit_params(v, expr_params);246			v.visit_expr(expr);247		}248		Expr::IfElse(if_else) => {249			let IfElse {250				cond,251				cond_then,252				cond_else,253			} = &**if_else;254			visit_if_spec(v, cond);255			v.visit_expr(cond_then);256			if let Some(cond_else) = cond_else {257				v.visit_expr(cond_else);258			}259		}260		Expr::Slice(slice) => {261			let Slice { value, slice } = &**slice;262			v.visit_expr(value);263			let SliceDesc { start, end, step } = slice;264265			if let Some(start) = start {266				v.visit_expr(start);267			}268			if let Some(end) = end {269				v.visit_expr(end);270			}271			if let Some(step) = step {272				v.visit_expr(step);273			}274		}275	}276}
modifiedcrates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/lib.rs
+++ b/crates/jrsonnet-peg-parser/src/lib.rs
@@ -138,7 +138,7 @@
 			/ name:id() _ "(" _ params:params(s) _ ")" _ "=" _ value:expr(s) {BindSpec::Function{name, params, value: Rc::new(value)}}
 
 		pub rule assertion(s: &ParserSettings) -> AssertStmt
-			= keyword("assert") _ cond:spanned(<expr(s)>, s) msg:(_ ":" _ e:spanned(<expr(s)>, s) {e})? { AssertStmt(cond, msg) }
+			= keyword("assert") _ assertion:spanned(<expr(s)>, s) message:(_ ":" _ e:expr(s) {e})? { AssertStmt{assertion, message} }
 
 		pub rule whole_line() -> &'input str
 			= str:$((!['\n'][_])* "\n") {str}