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

difftreelog

refactor more spans wanted from IR

uvqsltluYaroslav Bolyukin2026-03-22parent: #d34410c.patch.diff
in: master

222 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -672,6 +672,7 @@
  "hi-doc",
  "indoc",
  "insta",
+ "jrsonnet-lexer",
  "jrsonnet-rowan-parser",
 ]
 
@@ -716,6 +717,16 @@
 ]
 
 [[package]]
+name = "jrsonnet-ir-parser"
+version = "0.5.0-pre97"
+dependencies = [
+ "insta",
+ "jrsonnet-gcmodule",
+ "jrsonnet-ir",
+ "jrsonnet-lexer",
+]
+
+[[package]]
 name = "jrsonnet-lexer"
 version = "0.5.0-pre97"
 dependencies = [
modifiedCargo.tomldiffbeforeafterboth
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,6 +14,7 @@
 jrsonnet-evaluator = { path = "./crates/jrsonnet-evaluator", version = "0.5.0-pre97" }
 jrsonnet-macros = { path = "./crates/jrsonnet-macros", version = "0.5.0-pre97" }
 jrsonnet-ir = { path = "./crates/jrsonnet-ir", version = "0.5.0-pre97" }
+jrsonnet-ir-parser = { path = "./crates/jrsonnet-rowan-parser", version = "0.5.0-pre97" }
 jrsonnet-peg-parser = { path = "./crates/jrsonnet-peg-parser", version = "0.5.0-pre97" }
 jrsonnet-rowan-parser = { path = "./crates/jrsonnet-rowan-parser", version = "0.5.0-pre97" }
 jrsonnet-interner = { path = "./crates/jrsonnet-interner", version = "0.5.0-pre97" }
modifiedcrates/jrsonnet-evaluator/src/arr/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/arr/mod.rs
+++ b/crates/jrsonnet-evaluator/src/arr/mod.rs
@@ -7,7 +7,7 @@
 
 use jrsonnet_gcmodule::{cc_dyn, Cc};
 use jrsonnet_interner::IBytes;
-use jrsonnet_ir::{Expr, Spanned};
+use jrsonnet_ir::Expr;
 
 use crate::{function::NativeFn, Context, Result, Thunk, Val};
 
modifiedcrates/jrsonnet-evaluator/src/arr/spec.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/arr/spec.rs
+++ b/crates/jrsonnet-evaluator/src/arr/spec.rs
@@ -3,7 +3,7 @@
 
 use jrsonnet_gcmodule::{Cc, Trace};
 use jrsonnet_interner::{IBytes, IStr};
-use jrsonnet_ir::{Expr, Spanned};
+use jrsonnet_ir::Expr;
 
 use super::ArrValue;
 use crate::function::NativeFn;
modifiedcrates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/error.rs
+++ b/crates/jrsonnet-evaluator/src/error.rs
@@ -290,7 +290,7 @@
 }
 impl<T: Acyclic> ErrorSource for &Spanned<T> {
 	fn to_location(self) -> Option<Span> {
-		Some(self.span())
+		Some(self.span.clone())
 	}
 }
 impl ErrorSource for &Span {
modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs
@@ -49,15 +49,15 @@
 
 pub fn evaluate_trivial(expr: &Expr) -> Option<Val> {
 	fn is_trivial(expr: &Expr) -> bool {
-		match &*expr {
+		match expr {
 			Expr::Str(_)
 			| Expr::Num(_)
 			| Expr::Literal(LiteralType::False | LiteralType::True | LiteralType::Null) => true,
-			Expr::Arr(a) => a.iter().all(|e| is_trivial(&*e)),
+			Expr::Arr(a) => a.iter().all(is_trivial),
 			_ => false,
 		}
 	}
-	Some(match &*expr {
+	Some(match expr {
 		Expr::Str(s) => Val::string(s.clone()),
 		Expr::Num(n) => {
 			Val::Num(NumValue::new(*n).expect("parser will not allow non-finite values"))
@@ -71,7 +71,7 @@
 			}
 			Val::Arr(ArrValue::eager(
 				n.iter()
-					.map(|e| evaluate_trivial(&*e))
+					.map(evaluate_trivial)
 					.map(|e| e.expect("checked trivial"))
 					.collect(),
 			))
@@ -89,24 +89,21 @@
 	})))
 }
 
-pub fn evaluate_field_name(ctx: Context, field_name: &FieldName) -> Result<Option<IStr>> {
-	Ok(match field_name {
+pub fn evaluate_field_name(ctx: Context, field_name: &Spanned<FieldName>) -> Result<Option<IStr>> {
+	Ok(match &field_name.value {
 		FieldName::Fixed(n) => Some(n.clone()),
-		FieldName::Dyn(expr) => {
-			// FIXME: Span
-			let value = evaluate(ctx, expr)?;
-			if matches!(value, Val::Null) {
-				None
-			} else {
-				Some(IStr::from_untyped(value)?)
-			}
-		} //
-		  // 	in_frame(
-		  // 	CallLocation::new(&expr.span()),
-		  // 	|| "evaluating field name".to_string(),
-		  // 	|| {
-		  // 	},
-		  // )?,
+		FieldName::Dyn(expr) => in_frame(
+			CallLocation::new(&field_name.span),
+			|| "evaluating field name".to_string(),
+			|| {
+				let v = evaluate(ctx, expr)?;
+				Ok(if matches!(v, Val::Null) {
+					None
+				} else {
+					Some(IStr::from_untyped(v)?)
+				})
+			},
+		)?,
 	})
 }
 
@@ -117,18 +114,21 @@
 ) -> Result<()> {
 	match specs.first() {
 		None => callback(ctx)?,
-		Some(CompSpec::IfSpec(Spanned(IfSpecData(cond), _))) => {
+		Some(CompSpec::IfSpec(IfSpecData { cond, span: _ })) => {
 			if bool::from_untyped(evaluate(ctx.clone(), cond)?)? {
 				evaluate_comp(ctx, &specs[1..], callback)?;
 			}
 		}
-		Some(CompSpec::ForSpec(Spanned(ForSpecData(var, expr), _))) => {
-			match evaluate(ctx.clone(), expr)? {
+		Some(CompSpec::ForSpec(ForSpecData {
+			destruct: into,
+			over,
+		})) => {
+			match evaluate(ctx.clone(), over)? {
 				Val::Arr(list) => {
 					for item in list.iter_lazy() {
 						let fctx = Pending::new();
-						let mut new_bindings = FxHashMap::with_capacity(var.binds_len());
-						destruct(var, item, fctx.clone(), &mut new_bindings)?;
+						let mut new_bindings = FxHashMap::with_capacity(into.binds_len());
+						destruct(into, item, fctx.clone(), &mut new_bindings)?;
 						let ctx = ctx.clone().extend_bindings(new_bindings).into_future(fctx);
 
 						evaluate_comp(ctx, &specs[1..], callback)?;
@@ -235,8 +235,7 @@
 				.field(name.clone())
 				.with_add(*plus)
 				.with_visibility(*visibility)
-				// FIXME
-				// .with_location(value.span())
+				.with_location(field.name.span.clone())
 				.bindable(UnboundValue {
 					uctx,
 					value: value.clone(),
@@ -361,13 +360,13 @@
 	let value = &assertion.0;
 	let msg = &assertion.1;
 	let assertion_result = in_frame(
-		CallLocation::new(&value.span()),
+		CallLocation::new(&value.span),
 		|| "assertion condition".to_owned(),
 		|| bool::from_untyped(evaluate(ctx.clone(), value)?),
 	)?;
 	if !assertion_result {
 		in_frame(
-			CallLocation::new(&value.span()),
+			CallLocation::new(&value.span),
 			|| "assertion failure".to_owned(),
 			|| {
 				if let Some(msg) = msg {
@@ -389,7 +388,7 @@
 
 pub fn evaluate_named(ctx: Context, expr: &Expr, name: IStr) -> Result<Val> {
 	use Expr::*;
-	Ok(match &*expr {
+	Ok(match expr {
 		Function(params, body) => evaluate_method(ctx, name, params.clone(), body.clone()),
 		_ => evaluate(ctx, expr)?,
 	})
@@ -433,7 +432,7 @@
 		BinaryOp(bin) => evaluate_binary_op_special(ctx, &bin.lhs, bin.op, &bin.rhs)?,
 		UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(ctx, v)?)?,
 		Var(name) => in_frame(
-			CallLocation::new(&name.span()),
+			CallLocation::new(&name.span),
 			|| format!("local <{}> access", &**name),
 			|| ctx.binding((**name).clone())?.evaluate(),
 		)?,
@@ -591,13 +590,7 @@
 			&Val::Obj(evaluate_object(ctx, b)?),
 		)?,
 		Apply(value, args, tailstrict) => ensure_sufficient_stack(|| {
-			evaluate_apply(
-				ctx,
-				value,
-				args,
-				CallLocation::new(&args.span()),
-				*tailstrict,
-			)
+			evaluate_apply(ctx, value, args, CallLocation::new(&args.span), *tailstrict)
 		})?,
 		Function(params, body) => {
 			evaluate_method(ctx, "anonymous".into(), params.clone(), body.clone())
@@ -607,20 +600,16 @@
 			evaluate(ctx, &assert.rest)?
 		}
 		ErrorStmt(s, e) => in_frame(
-			CallLocation::new(&s),
+			CallLocation::new(s),
 			|| "error statement".to_owned(),
 			|| bail!(RuntimeError(evaluate(ctx, e)?.to_string()?,)),
 		)?,
 		IfElse(if_else) => {
-			if
-			// FIXME
-			//in_frame(
-			// CallLocation::new(&if_else.cond.0.span()),
-			// || "if condition".to_owned(),
-			// ||
-			bool::from_untyped(evaluate(ctx.clone(), &if_else.cond.0)?)?
-			// )?
-			{
+			if in_frame(
+				CallLocation::new(&if_else.cond.span),
+				|| "if condition".to_owned(),
+				|| bool::from_untyped(evaluate(ctx.clone(), &if_else.cond.cond)?),
+			)? {
 				evaluate(ctx, &if_else.cond_then)?
 			} else {
 				match &if_else.cond_else {
@@ -637,7 +626,7 @@
 			) -> Result<Option<T>> {
 				if let Some(value) = expr {
 					Ok(in_frame(
-						CallLocation::new(&value.span()),
+						CallLocation::new(&value.span),
 						|| format!("slice {desc}"),
 						|| <Option<T>>::from_untyped(evaluate(ctx, value)?),
 					)?)
@@ -659,11 +648,11 @@
 				bail!("computed imports are not supported")
 			};
 			with_state(|s| {
-				let span = kind.span();
+				let span = &kind.span;
 				let resolved_path = s.resolve_from(span.0.source_path(), path)?;
 				Ok(match &**kind {
 					ImportKind::Normal => in_frame(
-						CallLocation::new(&span),
+						CallLocation::new(span),
 						|| format!("import {:?}", path.clone()),
 						|| s.import_resolved(resolved_path),
 					)?,
modifiedcrates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate/operator.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/operator.rs
@@ -1,6 +1,6 @@
 use std::cmp::Ordering;
 
-use jrsonnet_ir::{BinaryOpType, Expr, Spanned, UnaryOpType};
+use jrsonnet_ir::{BinaryOpType, Expr, UnaryOpType};
 
 use crate::{
 	arr::ArrValue,
modifiedcrates/jrsonnet-evaluator/src/function/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/mod.rs
+++ b/crates/jrsonnet-evaluator/src/function/mod.rs
@@ -3,7 +3,7 @@
 use educe::Educe;
 use jrsonnet_gcmodule::{Cc, Trace};
 use jrsonnet_interner::IStr;
-use jrsonnet_ir::{ArgsDesc, Destruct, Expr, ExprParams, Span, Spanned};
+use jrsonnet_ir::{ArgsDesc, Destruct, Expr, ExprParams, Span};
 pub use jrsonnet_macros::builtin;
 
 use self::{
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
before · crates/jrsonnet-evaluator/src/lib.rs
1//! jsonnet interpreter implementation2#![cfg_attr(nightly, feature(thread_local, type_alias_impl_trait))]34// For jrsonnet-macros5extern crate self as jrsonnet_evaluator;67mod arr;8// pub mod async_import;9mod ctx;10mod dynamic;11pub mod error;12mod evaluate;13pub mod function;14pub mod gc;15mod import;16mod integrations;17pub mod manifest;18mod map;19mod obj;20pub mod stack;21pub mod stdlib;22pub mod tla;23pub mod trace;24pub mod typed;25pub mod val;2627use std::{28	any::Any,29	cell::{RefCell, RefMut},30	clone::Clone,31	collections::hash_map::Entry,32	fmt::{self, Debug},33	marker::PhantomData,34	rc::Rc,35};3637pub use ctx::*;38pub use dynamic::*;39pub use error::{Error, ErrorKind::*, Result, ResultExt};40pub use evaluate::*;41use function::CallLocation;42pub use import::*;43use jrsonnet_gcmodule::{cc_dyn, Cc, Trace};44pub use jrsonnet_interner::{IBytes, IStr};45#[doc(hidden)]46pub use jrsonnet_macros;47pub use jrsonnet_ir as parser;48use jrsonnet_ir::{Expr, Source, SourcePath, Spanned};49use jrsonnet_peg_parser::ParserSettings;50pub use obj::*;51pub use rustc_hash;52use rustc_hash::FxHashMap;53use stack::check_depth;54pub use tla::apply_tla;55pub use val::{Thunk, Val};5657use crate::gc::WithCapacityExt as _;5859cc_dyn!(60	#[derive(Clone)]61	CcUnbound<V>,62	Unbound<Bound = V>63);6465/// Thunk without bound `super`/`this`66/// object inheritance may be overriden multiple times, and will be fixed only on field read67pub trait Unbound: Trace {68	/// Type of value after object context is bound69	type Bound;70	/// Create value bound to specified object context71	fn bind(&self, sup_this: SupThis) -> Result<Self::Bound>;72}7374/// Object fields may, or may not depend on `this`/`super`, this enum allows cheaper reuse of object-independent fields for native code75/// Standard jsonnet fields are always unbound76#[derive(Clone, Trace)]77pub enum MaybeUnbound {78	/// Value needs to be bound to `this`/`super`79	Unbound(CcUnbound<Val>),80	/// Value is object-independent81	Bound(Thunk<Val>),82}8384impl Debug for MaybeUnbound {85	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {86		write!(f, "MaybeUnbound")87	}88}89impl MaybeUnbound {90	/// Attach object context to value, if required91	pub fn evaluate(&self, sup_this: SupThis) -> Result<Val> {92		match self {93			Self::Unbound(v) => v.0.bind(sup_this),94			Self::Bound(v) => Ok(v.evaluate()?),95		}96	}97}9899cc_dyn!(CcContextInitializer, ContextInitializer);100101/// During import, this trait will be called to create initial context for file.102/// It may initialize global variables, stdlib for example.103pub trait ContextInitializer: Trace {104	/// For which size the builder should be preallocated105	fn reserve_vars(&self) -> usize {106		0107	}108	/// Initialize default file context.109	/// Has default implementation, which calls `populate`.110	/// Prefer to always implement `populate` instead.111	fn initialize(&self, for_file: Source) -> Context {112		let mut builder = ContextBuilder::with_capacity(self.reserve_vars());113		self.populate(for_file, &mut builder);114		builder.build()115	}116	/// For composability: extend builder. May panic if this initialization is not supported,117	/// and the context may only be created via `initialize`.118	fn populate(&self, for_file: Source, builder: &mut ContextBuilder);119	/// Allows upcasting from abstract to concrete context initializer.120	/// jrsonnet by itself doesn't use this method, it is allowed for it to panic.121	fn as_any(&self) -> &dyn Any;122}123124/// Context initializer which adds nothing.125impl ContextInitializer for () {126	fn populate(&self, _for_file: Source, _builder: &mut ContextBuilder) {}127	fn as_any(&self) -> &dyn Any {128		self129	}130}131132impl<T> ContextInitializer for Option<T>133where134	T: ContextInitializer,135{136	fn initialize(&self, for_file: Source) -> Context {137		if let Some(ctx) = self {138			ctx.initialize(for_file)139		} else {140			().initialize(for_file)141		}142	}143144	fn populate(&self, for_file: Source, builder: &mut ContextBuilder) {145		if let Some(ctx) = self {146			ctx.populate(for_file, builder);147		}148	}149150	fn as_any(&self) -> &dyn Any {151		self152	}153}154155macro_rules! impl_context_initializer {156	($($gen:ident)*) => {157		#[allow(non_snake_case)]158		impl<$($gen: ContextInitializer + Trace,)*> ContextInitializer for ($($gen,)*) {159			fn reserve_vars(&self) -> usize {160				let mut out = 0;161				let ($($gen,)*) = self;162				$(out += $gen.reserve_vars();)*163				out164			}165			fn populate(&self, for_file: Source, builder: &mut ContextBuilder) {166				let ($($gen,)*) = self;167				$($gen.populate(for_file.clone(), builder);)*168			}169			fn as_any(&self) -> &dyn Any {170				self171			}172		}173	};174	($($cur:ident)* @ $c:ident $($rest:ident)*) => {175		impl_context_initializer!($($cur)*);176		impl_context_initializer!($($cur)* $c @ $($rest)*);177	};178	($($cur:ident)* @) => {179		impl_context_initializer!($($cur)*);180	}181}182impl_context_initializer! {183	A @ B C D E F G184}185186#[derive(Trace)]187struct FileData {188	string: Option<IStr>,189	bytes: Option<IBytes>,190	parsed: Option<Rc<Expr>>,191	evaluated: Option<Val>,192193	evaluating: bool,194}195impl FileData {196	fn new_string(data: IStr) -> Self {197		Self {198			string: Some(data),199			bytes: None,200			parsed: None,201			evaluated: None,202			evaluating: false,203		}204	}205	fn new_bytes(data: IBytes) -> Self {206		Self {207			string: None,208			bytes: Some(data),209			parsed: None,210			evaluated: None,211			evaluating: false,212		}213	}214	pub(crate) fn get_string(&mut self) -> Option<IStr> {215		if self.string.is_none() {216			self.string = Some(217				self.bytes218					.as_ref()219					.expect("either string or bytes should be set")220					.clone()221					.cast_str()?,222			);223		}224		Some(self.string.clone().expect("just set"))225	}226}227228#[derive(Trace)]229pub struct EvaluationStateInternals {230	/// Internal state231	file_cache: RefCell<FxHashMap<SourcePath, FileData>>,232	/// Context initializer, which will be used for imports and everything233	/// [`NoopContextInitializer`] is used by default, most likely you want to have `jrsonnet-stdlib`234	context_initializer: CcContextInitializer,235	/// Used to resolve file locations/contents236	import_resolver: Rc<dyn ImportResolver>,237}238239/// Maintains stack trace and import resolution240#[derive(Clone, Trace)]241pub struct State(Cc<EvaluationStateInternals>);242243thread_local! {244	pub static DEFAULT_STATE: State = State::builder().build();245	pub static STATE: RefCell<Option<State>> = const {RefCell::new(None)};246}247pub struct StateEnterGuard(PhantomData<()>);248impl Drop for StateEnterGuard {249	fn drop(&mut self) {250		STATE.with_borrow_mut(|v| *v = None);251	}252}253254pub fn with_state<V>(v: impl FnOnce(State) -> V) -> V {255	if let Some(state) = STATE.with_borrow(Clone::clone) {256		v(state)257	} else {258		let s = DEFAULT_STATE.with(Clone::clone);259		v(s)260	}261}262263impl State {264	pub fn enter(&self) -> StateEnterGuard {265		self.try_enter().expect("entered state already exists")266	}267	pub fn try_enter(&self) -> Option<StateEnterGuard> {268		STATE.with_borrow_mut(|v| {269			if v.is_none() {270				*v = Some(self.clone());271				Some(StateEnterGuard(PhantomData))272			} else {273				None274			}275		})276	}277	/// Should only be called with path retrieved from [`resolve_path`], may panic otherwise278	pub fn import_resolved_str(&self, path: SourcePath) -> Result<IStr> {279		let mut file_cache = self.file_cache();280		let mut file = file_cache.entry(path.clone());281282		let file = match file {283			Entry::Occupied(ref mut d) => d.get_mut(),284			Entry::Vacant(v) => {285				let data = self.import_resolver().load_file_contents(&path)?;286				v.insert(FileData::new_string(287					std::str::from_utf8(&data)288						.map_err(|_| ImportBadFileUtf8(path.clone()))?289						.into(),290				))291			}292		};293		Ok(file294			.get_string()295			.ok_or_else(|| ImportBadFileUtf8(path.clone()))?)296	}297	/// Should only be called with path retrieved from [`resolve_path`], may panic otherwise298	pub fn import_resolved_bin(&self, path: SourcePath) -> Result<IBytes> {299		let mut file_cache = self.file_cache();300		let mut file = file_cache.entry(path.clone());301302		let file = match file {303			Entry::Occupied(ref mut d) => d.get_mut(),304			Entry::Vacant(v) => {305				let data = self.import_resolver().load_file_contents(&path)?;306				v.insert(FileData::new_bytes(data.as_slice().into()))307			}308		};309		if let Some(str) = &file.bytes {310			return Ok(str.clone());311		}312		if file.bytes.is_none() {313			file.bytes = Some(314				file.string315					.as_ref()316					.expect("either string or bytes should be set")317					.clone()318					.cast_bytes(),319			);320		}321		Ok(file.bytes.as_ref().expect("just set").clone())322	}323	/// Should only be called with path retrieved from [`resolve_path`], may panic otherwise324	pub fn import_resolved(&self, path: SourcePath) -> Result<Val> {325		let mut file_cache = self.file_cache();326		let mut file = file_cache.entry(path.clone());327328		let file = match file {329			Entry::Occupied(ref mut d) => d.get_mut(),330			Entry::Vacant(v) => {331				let data = self.import_resolver().load_file_contents(&path)?;332				v.insert(FileData::new_string(333					std::str::from_utf8(&data)334						.map_err(|_| ImportBadFileUtf8(path.clone()))?335						.into(),336				))337			}338		};339		if let Some(val) = &file.evaluated {340			return Ok(val.clone());341		}342		let code = file343			.get_string()344			.ok_or_else(|| ImportBadFileUtf8(path.clone()))?;345		let file_name = Source::new(path.clone(), code.clone());346		if file.parsed.is_none() {347			file.parsed = Some(348				jrsonnet_peg_parser::parse(349					&code,350					&ParserSettings {351						source: file_name.clone(),352					},353				)354				.map(Rc::new)355				.map_err(|e| ImportSyntaxError {356					path: file_name.clone(),357					error: Box::new(e),358				})?,359			);360		}361		let parsed = file.parsed.as_ref().expect("just set").clone();362		if file.evaluating {363			bail!(InfiniteRecursionDetected)364		}365		file.evaluating = true;366		// Dropping file cache guard here, as evaluation may use this map too367		drop(file_cache);368		let res = evaluate(self.create_default_context(file_name), &parsed);369370		let mut file_cache = self.file_cache();371		let mut file = file_cache.entry(path);372373		let Entry::Occupied(file) = &mut file else {374			unreachable!("this file was just here")375		};376		let file = file.get_mut();377		file.evaluating = false;378		match res {379			Ok(v) => {380				file.evaluated = Some(v.clone());381				Ok(v)382			}383			Err(e) => Err(e),384		}385	}386387	/// Has same semantics as `import 'path'` called from `from` file388	pub fn import_from(&self, from: &SourcePath, path: impl AsPathLike) -> Result<Val> {389		let resolved = self.resolve_from(from, &path)?;390		self.import_resolved(resolved)391	}392	pub fn import(&self, path: impl AsPathLike) -> Result<Val> {393		let resolved = self.resolve_from_default(&path)?;394		self.import_resolved(resolved)395	}396397	/// Creates context with all passed global variables398	pub fn create_default_context(&self, source: Source) -> Context {399		self.context_initializer().initialize(source)400	}401402	/// Creates context with all passed global variables, calling custom modifier403	pub fn create_default_context_with(404		&self,405		source: Source,406		context_initializer: impl ContextInitializer,407	) -> Context {408		let default_initializer = self.context_initializer();409		let mut builder = ContextBuilder::with_capacity(410			default_initializer.reserve_vars() + context_initializer.reserve_vars(),411		);412		default_initializer.populate(source.clone(), &mut builder);413		context_initializer.populate(source, &mut builder);414415		builder.build()416	}417}418419/// Internals420impl State {421	fn file_cache(&self) -> RefMut<'_, FxHashMap<SourcePath, FileData>> {422		self.0.file_cache.borrow_mut()423	}424}425/// Executes code creating a new stack frame, to be replaced with try{}426pub fn in_frame<T>(427	e: CallLocation<'_>,428	frame_desc: impl FnOnce() -> String,429	f: impl FnOnce() -> Result<T>,430) -> Result<T> {431	let _guard = check_depth()?;432433	f().with_description_src(e, frame_desc)434}435436/// Executes code creating a new stack frame, to be replaced with try{}437pub fn in_description_frame<T>(438	frame_desc: impl FnOnce() -> String,439	f: impl FnOnce() -> Result<T>,440) -> Result<T> {441	let _guard = check_depth()?;442443	f().with_description(frame_desc)444}445446#[derive(Trace)]447pub struct InitialUnderscore(pub Thunk<Val>);448impl ContextInitializer for InitialUnderscore {449	fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {450		builder.bind("_", self.0.clone());451	}452453	fn as_any(&self) -> &dyn Any {454		self455	}456}457458/// Raw methods evaluate passed values but don't perform TLA execution459impl State {460	/// Parses and evaluates the given snippet461	pub fn evaluate_snippet(&self, name: impl Into<IStr>, code: impl Into<IStr>) -> Result<Val> {462		let code = code.into();463		let source = Source::new_virtual(name.into(), code.clone());464		let parsed = jrsonnet_peg_parser::parse(465			&code,466			&ParserSettings {467				source: source.clone(),468			},469		)470		.map_err(|e| ImportSyntaxError {471			path: source.clone(),472			error: Box::new(e),473		})?;474		evaluate(self.create_default_context(source), &parsed)475	}476	/// Parses and evaluates the given snippet with custom context modifier477	pub fn evaluate_snippet_with(478		&self,479		name: impl Into<IStr>,480		code: impl Into<IStr>,481		context_initializer: impl ContextInitializer,482	) -> Result<Val> {483		let code = code.into();484		let source = Source::new_virtual(name.into(), code.clone());485		let parsed = jrsonnet_peg_parser::parse(486			&code,487			&ParserSettings {488				source: source.clone(),489			},490		)491		.map_err(|e| ImportSyntaxError {492			path: source.clone(),493			error: Box::new(e),494		})?;495		evaluate(496			self.create_default_context_with(source, context_initializer),497			&parsed,498		)499	}500}501502/// Settings utilities503impl State {504	// Only panics in case of [`ImportResolver`] contract violation505	#[allow(clippy::missing_panics_doc)]506	pub fn resolve_from(&self, from: &SourcePath, path: &dyn AsPathLike) -> Result<SourcePath> {507		self.import_resolver().resolve_from(from, path)508	}509	#[allow(clippy::missing_panics_doc)]510	pub fn resolve_from_default(&self, path: &dyn AsPathLike) -> Result<SourcePath> {511		self.import_resolver().resolve_from_default(path)512	}513	pub fn import_resolver(&self) -> &dyn ImportResolver {514		&*self.0.import_resolver515	}516	pub fn context_initializer(&self) -> &dyn ContextInitializer {517		&*self.0.context_initializer.0518	}519}520521impl State {522	pub fn builder() -> StateBuilder {523		StateBuilder::default()524	}525}526527impl Default for State {528	fn default() -> Self {529		Self::builder().build()530	}531}532533#[derive(Default)]534pub struct StateBuilder {535	import_resolver: Option<Rc<dyn ImportResolver>>,536	context_initializer: Option<CcContextInitializer>,537}538impl StateBuilder {539	pub fn import_resolver(&mut self, import_resolver: impl ImportResolver) -> &mut Self {540		let _ = self.import_resolver.insert(Rc::new(import_resolver));541		self542	}543	pub fn context_initializer(544		&mut self,545		context_initializer: impl ContextInitializer,546	) -> &mut Self {547		let _ = self548			.context_initializer549			.insert(CcContextInitializer::new(context_initializer));550		self551	}552	pub fn build(mut self) -> State {553		State(Cc::new(EvaluationStateInternals {554			file_cache: RefCell::new(FxHashMap::new()),555			context_initializer: self556				.context_initializer557				.take()558				.unwrap_or_else(|| CcContextInitializer::new(())),559			import_resolver: self560				.import_resolver561				.take()562				.unwrap_or_else(|| Rc::new(DummyImportResolver)),563		}))564	}565}
addedcrates/jrsonnet-ir-parser/Cargo.tomldiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-ir-parser/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "jrsonnet-ir-parser"
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+repository.workspace = true
+version.workspace = true
+
+[dependencies]
+insta.workspace = true
+jrsonnet-gcmodule.workspace = true
+jrsonnet-ir.workspace = true
+jrsonnet-lexer = { version = "0.5.0-pre97", path = "../jrsonnet-lexer" }
+
+[lints]
+workspace = true
addedcrates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/lib.rs
@@ -0,0 +1,183 @@
+use std::rc::Rc;
+
+use insta::assert_snapshot;
+use jrsonnet_gcmodule::Acyclic;
+use jrsonnet_ir::{
+	AssertExpr, AssertStmt, Expr, IfElse, IfSpecData, LiteralType, Slice, SliceDesc, Source,
+	SourceVirtual, Span, Spanned,
+};
+use jrsonnet_lexer::{Lexeme, Lexer, SyntaxKind, T};
+
+struct Parser<'a> {
+	lexemes: Vec<Lexeme<'a>>,
+	offset: usize,
+	source: Source,
+}
+
+impl<'a> Parser<'a> {
+	fn new(s: &'a str) -> Self {
+		Self {
+			lexemes: Lexer::new(s)
+				.filter(|l| l.kind != SyntaxKind::WHITESPACE)
+				.collect(),
+			offset: 0,
+			source: Source::new_virtual("<test>".into(), s.into()),
+		}
+	}
+	fn peek(&self) -> SyntaxKind {
+		self.lexemes[self.offset].kind
+	}
+	fn text(&self) -> &str {
+		self.lexemes[self.offset].text
+	}
+	fn at(&self, kind: SyntaxKind) -> bool {
+		!self.at_eof() && self.peek() == kind
+	}
+	fn eat_any(&mut self) {
+		self.offset += 1
+	}
+
+	fn at_eof(&self) -> bool {
+		self.offset == self.lexemes.len()
+	}
+
+	fn try_eat(&mut self, t: SyntaxKind) -> bool {
+		if self.at(t) {
+			self.eat_any();
+			return true;
+		}
+		false
+	}
+	fn eat(&mut self, t: SyntaxKind) {
+		assert_eq!(self.peek(), t);
+		self.eat_any();
+	}
+
+	fn span_start(&self) -> u32 {
+		self.lexemes[self.offset].range.0
+	}
+	fn span_end(&self) -> u32 {
+		self.lexemes[self.offset - 1].range.1
+	}
+}
+
+fn literal(p: &mut Parser<'_>) -> Option<LiteralType> {
+	let t = match p.peek() {
+		T![self] => LiteralType::This,
+		T![super] => LiteralType::Super,
+		T!['$'] => LiteralType::Dollar,
+		T![null] => LiteralType::Null,
+		T![true] => LiteralType::True,
+		T![false] => LiteralType::False,
+		_ => return None,
+	};
+	p.eat_any();
+	Some(t)
+}
+
+fn spanned<T: Acyclic>(p: &mut Parser<'_>, cb: impl FnOnce(&mut Parser<'_>) -> T) -> Spanned<T> {
+	let start = p.span_start();
+	let v = cb(p);
+	let end = p.span_end();
+
+	Spanned::new(v, Span(p.source.clone(), start, end))
+}
+
+fn assert_stmt(p: &mut Parser<'_>) -> AssertStmt {
+	p.eat(T![assert]);
+	let cond = spanned(p, expr);
+	dbg!(p.peek());
+	let msg = if p.try_eat(T![:]) {
+		Some(spanned(p, expr))
+	} else {
+		None
+	};
+	dbg!(AssertStmt(cond, msg))
+}
+
+fn if_spec_data(p: &mut Parser<'_>) -> IfSpecData {
+	let v = spanned(p, |p| p.eat(T![if]));
+	let cond = expr(p);
+	IfSpecData { span: v.span, cond }
+}
+
+fn if_else(p: &mut Parser<'_>) -> IfElse {
+	let cond = if_spec_data(p);
+	p.eat(T![then]);
+	let cond_then = expr(p);
+	let cond_else = if p.at(T![else]) { Some(expr(p)) } else { None };
+	IfElse {
+		cond,
+		cond_then,
+		cond_else,
+	}
+}
+
+fn slice_desc(p: &mut Parser<'_>, start: Option<Spanned<Expr>>) -> SliceDesc {
+	// start
+	p.eat(T![:]);
+	let end = if !p.at(T![:]) && !p.at(T![']']) {
+		Some(spanned(p, expr))
+	} else {
+		None
+	};
+	let step = if p.try_eat(T![:]) && !p.at(T![']']) {
+		Some(spanned(p, expr))
+	} else {
+		None
+	};
+	SliceDesc { start, end, step }
+}
+
+fn expr_simple(p: &mut Parser<'_>) -> Expr {
+	let mut e = if let Some(literal) = literal(p) {
+		Expr::Literal(literal)
+	} else if p.at(T![assert]) {
+		let assert = assert_stmt(p);
+		p.eat(T![;]);
+		let rest = expr(p);
+		Expr::AssertExpr(Rc::new(AssertExpr { assert, rest }))
+	} else if p.at(T![if]) {
+		Expr::IfElse(Box::new(if_else(p)))
+	} else {
+		panic!("unexpected token: {:?}", p.peek());
+	};
+
+	dbg!(&e);
+
+	loop {
+		if p.try_eat(T!['[']) {
+			if p.at(T![:]) {
+				let slice = slice_desc(p, None);
+				e = Expr::Slice(Box::new(Slice { value: e, slice }));
+				p.eat(T![']']);
+				continue;
+			}
+
+			let idx = spanned(p, expr);
+			if p.at(T![:]) {
+				let slice = slice_desc(p, Some(idx));
+				e = Expr::Slice(Box::new(Slice { value: e, slice }));
+			} else {
+			}
+			p.eat(T![']']);
+		} else {
+			break;
+		}
+	}
+
+	dbg!(e)
+}
+
+fn expr(p: &mut Parser<'_>) -> Expr {
+	expr_simple(p)
+}
+
+#[test]
+fn basic_test() {
+	let mut parser = Parser::new(" assert true[false] : false ; true ");
+	let e = expr(&mut parser);
+	let l = &parser.lexemes;
+
+	assert_snapshot!(format!("{l:#?}\n\n---\n\n{e:#?}"));
+}
addedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__basic_test.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__basic_test.snap
@@ -0,0 +1,98 @@
+---
+source: crates/jrsonnet-ir-parser/src/lib.rs
+expression: "format!(\"{l:#?}\\n\\n---\\n\\n{e:#?}\")"
+---
+[
+    Lexeme {
+        kind: ASSERT_KW,
+        text: "assert",
+        range: Span(
+            1,
+            7,
+        ),
+    },
+    Lexeme {
+        kind: TRUE_KW,
+        text: "true",
+        range: Span(
+            8,
+            12,
+        ),
+    },
+    Lexeme {
+        kind: L_BRACK,
+        text: "[",
+        range: Span(
+            12,
+            13,
+        ),
+    },
+    Lexeme {
+        kind: FALSE_KW,
+        text: "false",
+        range: Span(
+            13,
+            18,
+        ),
+    },
+    Lexeme {
+        kind: R_BRACK,
+        text: "]",
+        range: Span(
+            18,
+            19,
+        ),
+    },
+    Lexeme {
+        kind: COLON,
+        text: ":",
+        range: Span(
+            20,
+            21,
+        ),
+    },
+    Lexeme {
+        kind: FALSE_KW,
+        text: "false",
+        range: Span(
+            22,
+            27,
+        ),
+    },
+    Lexeme {
+        kind: SEMI,
+        text: ";",
+        range: Span(
+            28,
+            29,
+        ),
+    },
+    Lexeme {
+        kind: TRUE_KW,
+        text: "true",
+        range: Span(
+            30,
+            34,
+        ),
+    },
+]
+
+---
+
+AssertExpr(
+    AssertExpr {
+        assert: AssertStmt(
+            Literal(
+                True,
+            ) from virtual:<test>:8-19,
+            Some(
+                Literal(
+                    False,
+                ) from virtual:<test>:22-27,
+            ),
+        ),
+        rest: Literal(
+            True,
+        ),
+    },
+)
modifiedcrates/jrsonnet-ir/src/expr.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/expr.rs
+++ b/crates/jrsonnet-ir/src/expr.rs
@@ -42,7 +42,7 @@
 
 #[derive(Debug, PartialEq, Acyclic)]
 pub struct FieldMember {
-	pub name: FieldName,
+	pub name: Spanned<FieldName>,
 	pub plus: bool,
 	pub params: Option<ExprParams>,
 	pub visibility: Visibility,
@@ -295,15 +295,21 @@
 }
 
 #[derive(Debug, PartialEq, Acyclic)]
-pub struct IfSpecData(pub Expr);
+pub struct IfSpecData {
+	pub span: Span,
+	pub cond: Expr,
+}
 
 #[derive(Debug, PartialEq, Acyclic)]
-pub struct ForSpecData(pub Destruct, pub Expr);
+pub struct ForSpecData {
+	pub destruct: Destruct,
+	pub over: Expr,
+}
 
 #[derive(Debug, PartialEq, Acyclic)]
 pub enum CompSpec {
-	IfSpec(Spanned<IfSpecData>),
-	ForSpec(Spanned<ForSpecData>),
+	IfSpec(IfSpecData),
+	ForSpec(ForSpecData),
 }
 
 #[derive(Debug, PartialEq, Acyclic)]
@@ -462,21 +468,20 @@
 }
 
 #[derive(Clone, PartialEq, Acyclic)]
-pub struct Spanned<T: Acyclic>(pub T, pub Span);
+pub struct Spanned<T: Acyclic> {
+	pub value: T,
+	pub span: Span,
+}
 impl<T: Acyclic> Deref for Spanned<T> {
 	type Target = T;
 	fn deref(&self) -> &Self::Target {
-		&self.0
+		&self.value
 	}
 }
 impl<T: Acyclic> Spanned<T> {
 	#[inline]
-	pub fn new(v: T, s: Span) -> Self {
-		Self(v, s)
-	}
-	#[inline]
-	pub fn span(&self) -> Span {
-		self.1.clone()
+	pub fn new(value: T, span: Span) -> Self {
+		Self { value, span }
 	}
 }
 
@@ -488,7 +493,7 @@
 		} else {
 			write!(f, "{:?}", expr)?;
 		}
-		write!(f, " from {:?}", self.span())?;
+		write!(f, " from {:?}", self.span)?;
 		Ok(())
 	}
 }
modifiedcrates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/lib.rs
+++ b/crates/jrsonnet-peg-parser/src/lib.rs
@@ -181,14 +181,14 @@
 			/ "::" {Visibility::Hidden}
 			/ ":" {Visibility::Normal}
 		pub rule field(s: &ParserSettings) -> FieldMember
-			= name:field_name(s) _ plus:"+"? _ visibility:visibility() _ value:expr(s) {FieldMember{
+			= name:spanned(<field_name(s)>, s) _ plus:"+"? _ visibility:visibility() _ value:expr(s) {FieldMember{
 				name,
 				plus: plus.is_some(),
 				params: None,
 				visibility,
 				value: Rc::new(value),
 			}}
-			/ name:field_name(s) _ "(" _ params:params(s) _ ")" _ visibility:visibility() _ value:expr(s) {FieldMember{
+			/ name:spanned(<field_name(s)>, s) _ "(" _ params:params(s) _ ")" _ visibility:visibility() _ value:expr(s) {FieldMember{
 				name,
 				plus: false,
 				params: Some(params),
@@ -239,11 +239,11 @@
 				})
 			}
 		pub rule ifspec(s: &ParserSettings) -> IfSpecData
-			= keyword("if") _ expr:expr(s) {IfSpecData(expr)}
+			= i:spanned(<keyword("if")>, s) _ cond:expr(s) {IfSpecData { span: i.span, cond }}
 		pub rule forspec(s: &ParserSettings) -> ForSpecData
-			= keyword("for") _ id:destruct(s) _ keyword("in") _ cond:expr(s) {ForSpecData(id, cond)}
+			= keyword("for") _ destruct:destruct(s) _ keyword("in") _ over:expr(s) { ForSpecData { destruct, over } }
 		rule compspec(s: &ParserSettings) -> CompSpec
-			= i:spanned(<ifspec(s)>, s) { CompSpec::IfSpec(i) } / f:spanned(<forspec(s)>, s) {CompSpec::ForSpec(f)}
+			= i:ifspec(s) { CompSpec::IfSpec(i) } / f:forspec(s) {CompSpec::ForSpec(f)}
 		pub rule compspecs(s: &ParserSettings) -> Vec<CompSpec>
 			= specs:compspec(s) ++ _ {?
 				if !matches!(specs[0], CompSpec::ForSpec(_)) {
@@ -319,7 +319,7 @@
 				assert, rest
 			})) }
 
-			/ err_kw:spanned(<keyword("error")>, s) _ expr:expr(s) { Expr::ErrorStmt(err_kw.1, Box::new(expr)) }
+			/ err_kw:spanned(<keyword("error")>, s) _ expr:expr(s) { Expr::ErrorStmt(err_kw.span, Box::new(expr)) }
 
 		rule slice_part(s: &ParserSettings) -> Option<Spanned<Expr>>
 			= _ e:(e:spanned(<expr(s)>, s) _{e})? {e}
@@ -396,14 +396,14 @@
 			}
 		pub rule index_part(s: &ParserSettings) -> IndexPart
 		= n:("?" _ ensure_null_coaelse())? "." _ value:id_loc(s) {IndexPart {
-			span: value.1,
-			value: value.0,
+			span: value.span,
+			value: value.value,
 			#[cfg(feature = "exp-null-coaelse")]
 			null_coaelse: n.is_some(),
 		}}
 		/ n:("?" _ "." _ ensure_null_coaelse())? value:spanned(<"[" _ v:expr(s) _ "]" {v}>, s) {IndexPart {
-			span: value.1,
-			value: value.0,
+			span: value.span,
+			value: value.value,
 			#[cfg(feature = "exp-null-coaelse")]
 			null_coaelse: n.is_some(),
 		}}
@@ -423,140 +423,27 @@
 }
 
 #[cfg(test)]
-pub mod tests {
-	use insta::assert_snapshot;
-	use jrsonnet_ir::{IStr, Source};
-
-	use super::parse;
-	use crate::ParserSettings;
-
-	fn parsep(s: &str) -> String {
-		let v = parse(
-			s,
-			&ParserSettings {
-				source: Source::new_virtual("<test>".into(), IStr::empty()),
-			},
-		)
-		.unwrap();
-		format!("{v:#?}")
-	}
-
-	macro_rules! parse {
-		($s:expr) => {
-			assert_snapshot!(parsep($s));
-		};
-	}
-
-	#[test]
-	fn multiline_string() {
-		parse!("|||\n    Hello world!\n     a\n|||");
-		parse!("|||\n  Hello world!\n   a\n|||");
-		parse!("|||\n\t\tHello world!\n\t\t\ta\n|||");
-		parse!("|||\n   Hello world!\n    a\n |||");
-	}
-
-	#[test]
-	fn slice() {
-		parse!("a[1:]");
-		parse!("a[1::]");
-		parse!("a[:1:]");
-		parse!("a[::1]");
-		parse!("str[:len - 1]");
-	}
-
-	#[test]
-	fn string_escaping() {
-		parse!(r#""Hello, \"world\"!""#);
-		parse!(r#"'Hello \'world\'!'"#);
-		parse!(r#"'\\\\'"#);
-	}
-
-	#[test]
-	fn string_unescaping() {
-		parse!(r#""Hello\nWorld""#);
-	}
-
-	#[test]
-	fn string_verbantim() {
-		parse!(r#"@"Hello\n""World""""#);
-	}
-
-	#[test]
-	fn imports() {
-		parse!("import \"hello\"");
-		parse!("importstr \"garnish.txt\"");
-		parse!("importbin \"garnish.bin\"");
-	}
-
-	#[test]
-	fn empty_object() {
-		parse!("{}");
-	}
+mod tests {
+	use std::fs;
 
-	#[test]
-	fn basic_math() {
-		parse!("2+2*2");
-		parse!("2	+ 	  2	  *	2   	");
-		parse!("2+(2+2*2)");
-		parse!("2//comment\n+//comment\n3/*test*/*/*test*/4");
-	}
+	use insta::{assert_snapshot, glob};
+	use jrsonnet_ir::{IStr, Source};
 
-	#[test]
-	fn suffix() {
-		parse!("std.test");
-		parse!("std(2)");
-		parse!("std.test(2)");
-		parse!("a[b]");
-	}
+	use crate::{parse, ParserSettings};
 
 	#[test]
-	fn array_comp() {
-		parse!("[std.deepJoin(x) for x in arr]");
-	}
-
-	#[test]
-	fn reserved() {
-		parse!("null");
-		parse!("nulla");
-	}
-
-	#[test]
-	fn multiple_args_buf() {
-		parse!("a(b, null_fields)");
-	}
-
-	#[test]
-	fn infix_precedence() {
-		parse!("!a && !b");
-		parse!("!a / !b");
-	}
-
-	#[test]
-	fn double_negation() {
-		parse!("!!a");
-	}
-
-	#[test]
-	fn array_test_error() {
-		parse!("[a for a in b if c for e in f]");
-	}
-
-	#[test]
-	fn missing_newline_between_comment_and_eof() {
-		parse!(
-			"{a:1}
-
-			//+213"
-		);
-	}
-
-	#[test]
-	fn default_param_before_nondefault() {
-		parse!("local x(foo = 'foo', bar) = null; null");
-	}
-
-	#[test]
-	fn add_location_info_to_all_sub_expressions() {
-		parse!("{} { local x = 1, x: x } + {}");
+	fn snapshots() {
+		glob!("tests/*.jsonnet", |path| {
+			let input = fs::read_to_string(path).expect("read test file");
+			let v = parse(
+				&input,
+				&ParserSettings {
+					source: Source::new_virtual("<test>".into(), IStr::empty()),
+				},
+			)
+			.unwrap();
+			let v = format!("{v:#?}");
+			assert_snapshot!(v);
+		});
 	}
 }
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__add_location_info_to_all_sub_expressions.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__add_location_info_to_all_sub_expressions.snap
+++ /dev/null
@@ -1,57 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"{} { local x = 1, x: x } + {}\")"
----
-BinaryOp(
-    BinaryOp {
-        lhs: ObjExtend(
-            Obj(
-                MemberList(
-                    ObjMembers {
-                        locals: [],
-                        asserts: [],
-                        fields: [],
-                    },
-                ),
-            ) from virtual:<test>:0-2,
-            MemberList(
-                ObjMembers {
-                    locals: [
-                        Field {
-                            into: Full(
-                                "x",
-                            ),
-                            value: Num(
-                                1.0,
-                            ) from virtual:<test>:15-16,
-                        },
-                    ],
-                    asserts: [],
-                    fields: [
-                        FieldMember {
-                            name: Fixed(
-                                "x",
-                            ),
-                            plus: false,
-                            params: None,
-                            visibility: Normal,
-                            value: Var(
-                                "x",
-                            ) from virtual:<test>:21-22,
-                        },
-                    ],
-                },
-            ),
-        ) from virtual:<test>:0-24,
-        op: Add,
-        rhs: Obj(
-            MemberList(
-                ObjMembers {
-                    locals: [],
-                    asserts: [],
-                    fields: [],
-                },
-            ),
-        ) from virtual:<test>:27-29,
-    },
-) from virtual:<test>:0-29
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__array_comp.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__array_comp.snap
+++ /dev/null
@@ -1,41 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"[std.deepJoin(x) for x in arr]\")"
----
-ArrComp(
-    Apply(
-        Index {
-            indexable: Var(
-                "std",
-            ) from virtual:<test>:1-4,
-            parts: [
-                IndexPart {
-                    value: Str(
-                        "deepJoin",
-                    ) from virtual:<test>:5-13,
-                },
-            ],
-        } from virtual:<test>:1-13,
-        ArgsDesc {
-            unnamed: [
-                Var(
-                    "x",
-                ) from virtual:<test>:14-15,
-            ],
-            named: [],
-        },
-        false,
-    ) from virtual:<test>:1-16,
-    [
-        ForSpec(
-            ForSpecData(
-                Full(
-                    "x",
-                ),
-                Var(
-                    "arr",
-                ) from virtual:<test>:26-29,
-            ),
-        ),
-    ],
-) from virtual:<test>:0-30
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__array_test_error.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__array_test_error.snap
+++ /dev/null
@@ -1,38 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"[a for a in b if c for e in f]\")"
----
-ArrComp(
-    Var(
-        "a",
-    ) from virtual:<test>:1-2,
-    [
-        ForSpec(
-            ForSpecData(
-                Full(
-                    "a",
-                ),
-                Var(
-                    "b",
-                ) from virtual:<test>:12-13,
-            ),
-        ),
-        IfSpec(
-            IfSpecData(
-                Var(
-                    "c",
-                ) from virtual:<test>:17-18,
-            ),
-        ),
-        ForSpec(
-            ForSpecData(
-                Full(
-                    "e",
-                ),
-                Var(
-                    "f",
-                ) from virtual:<test>:28-29,
-            ),
-        ),
-    ],
-) from virtual:<test>:0-30
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__basic_math.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__basic_math.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"2+2*2\")"
----
-BinaryOp(
-    BinaryOp {
-        lhs: Num(
-            2.0,
-        ) from virtual:<test>:0-1,
-        op: Add,
-        rhs: BinaryOp(
-            BinaryOp {
-                lhs: Num(
-                    2.0,
-                ) from virtual:<test>:2-3,
-                op: Mul,
-                rhs: Num(
-                    2.0,
-                ) from virtual:<test>:4-5,
-            },
-        ) from virtual:<test>:2-5,
-    },
-) from virtual:<test>:0-5
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__default_param_before_nondefault.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__default_param_before_nondefault.snap
+++ /dev/null
@@ -1,54 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"local x(foo = 'foo', bar) = null; null\")"
----
-LocalExpr(
-    [
-        Function {
-            name: "x",
-            params: ExprParams {
-                exprs: [
-                    ExprParam {
-                        destruct: Full(
-                            "foo",
-                        ),
-                        default: Some(
-                            Str(
-                                "foo",
-                            ) from virtual:<test>:14-19,
-                        ),
-                    },
-                    ExprParam {
-                        destruct: Full(
-                            "bar",
-                        ),
-                        default: None,
-                    },
-                ],
-                signature: FunctionSignature(
-                    [
-                        ParamParse {
-                            name: Named(
-                                "foo",
-                            ),
-                            default: Exists,
-                        },
-                        ParamParse {
-                            name: Named(
-                                "bar",
-                            ),
-                            default: None,
-                        },
-                    ],
-                ),
-                binds_len: 2,
-            },
-            value: Literal(
-                Null,
-            ) from virtual:<test>:28-32,
-        },
-    ],
-    Literal(
-        Null,
-    ) from virtual:<test>:34-38,
-) from virtual:<test>:0-38
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__double_negation.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__double_negation.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"!!a\")"
----
-UnaryOp(
-    Not,
-    UnaryOp(
-        Not,
-        Var(
-            "a",
-        ) from virtual:<test>:2-3,
-    ) from virtual:<test>:1-3,
-) from virtual:<test>:0-3
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__empty_object.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__empty_object.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"{}\")"
----
-Obj(
-    MemberList(
-        ObjMembers {
-            locals: [],
-            asserts: [],
-            fields: [],
-        },
-    ),
-) from virtual:<test>:0-2
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__imports.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__imports.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"import \\\"hello\\\"\")"
----
-Import(
-    Normal,
-    Str(
-        "hello",
-    ) from virtual:<test>:7-14,
-) from virtual:<test>:0-14
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__infix_precedence.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__infix_precedence.snap
+++ /dev/null
@@ -1,21 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"!a && !b\")"
----
-BinaryOp(
-    BinaryOp {
-        lhs: UnaryOp(
-            Not,
-            Var(
-                "a",
-            ) from virtual:<test>:1-2,
-        ) from virtual:<test>:0-2,
-        op: And,
-        rhs: UnaryOp(
-            Not,
-            Var(
-                "b",
-            ) from virtual:<test>:7-8,
-        ) from virtual:<test>:6-8,
-    },
-) from virtual:<test>:0-8
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__missing_newline_between_comment_and_eof.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__missing_newline_between_comment_and_eof.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"{a:1}\n\n\t\t\t//+213\")"
----
-Obj(
-    MemberList(
-        ObjMembers {
-            locals: [],
-            asserts: [],
-            fields: [
-                FieldMember {
-                    name: Fixed(
-                        "a",
-                    ),
-                    plus: false,
-                    params: None,
-                    visibility: Normal,
-                    value: Num(
-                        1.0,
-                    ) from virtual:<test>:3-4,
-                },
-            ],
-        },
-    ),
-) from virtual:<test>:0-5
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__multiline_string.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__multiline_string.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"|||\\n    Hello world!\\n     a\\n|||\")"
----
-Str(
-    "Hello world!\n a\n",
-) from virtual:<test>:0-31
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__multiple_args_buf.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__multiple_args_buf.snap
+++ /dev/null
@@ -1,21 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"a(b, null_fields)\")"
----
-Apply(
-    Var(
-        "a",
-    ) from virtual:<test>:0-1,
-    ArgsDesc {
-        unnamed: [
-            Var(
-                "b",
-            ) from virtual:<test>:2-3,
-            Var(
-                "null_fields",
-            ) from virtual:<test>:5-16,
-        ],
-        named: [],
-    },
-    false,
-) from virtual:<test>:0-17
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__reserved.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__reserved.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"null\")"
----
-Literal(
-    Null,
-) from virtual:<test>:0-4
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__slice.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__slice.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"a[1:]\")"
----
-Slice(
-    Slice {
-        value: Var(
-            "a",
-        ) from virtual:<test>:0-1,
-        slice: SliceDesc {
-            start: Some(
-                Num(
-                    1.0,
-                ) from virtual:<test>:2-3,
-            ),
-            end: None,
-            step: None,
-        },
-    },
-) from virtual:<test>:0-5
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@array_comp.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@array_comp.jsonnet.snap
@@ -0,0 +1,82 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/array_comp.jsonnet
+---
+Arr(
+    [
+        ArrComp(
+            Apply(
+                Index {
+                    indexable: Var(
+                        "std" from virtual:<test>:3-6,
+                    ),
+                    parts: [
+                        IndexPart {
+                            span: virtual:<test>:7-15,
+                            value: Str(
+                                "deepJoin",
+                            ),
+                        },
+                    ],
+                },
+                ArgsDesc {
+                    unnamed: [
+                        Var(
+                            "x" from virtual:<test>:16-17,
+                        ),
+                    ],
+                    named: [],
+                } from virtual:<test>:15-18,
+                false,
+            ),
+            [
+                ForSpec(
+                    ForSpecData {
+                        destruct: Full(
+                            "x",
+                        ),
+                        over: Var(
+                            "arr" from virtual:<test>:28-31,
+                        ),
+                    },
+                ),
+            ],
+        ),
+        ArrComp(
+            Var(
+                "a" from virtual:<test>:35-36,
+            ),
+            [
+                ForSpec(
+                    ForSpecData {
+                        destruct: Full(
+                            "a",
+                        ),
+                        over: Var(
+                            "b" from virtual:<test>:46-47,
+                        ),
+                    },
+                ),
+                IfSpec(
+                    IfSpecData {
+                        span: virtual:<test>:48-50,
+                        cond: Var(
+                            "c" from virtual:<test>:51-52,
+                        ),
+                    },
+                ),
+                ForSpec(
+                    ForSpecData {
+                        destruct: Full(
+                            "e",
+                        ),
+                        over: Var(
+                            "f" from virtual:<test>:62-63,
+                        ),
+                    },
+                ),
+            ],
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@basic_math.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@basic_math.jsonnet.snap
@@ -0,0 +1,120 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/basic_math.jsonnet
+---
+Arr(
+    [
+        BinaryOp(
+            BinaryOp {
+                lhs: Num(
+                    2.0,
+                ),
+                op: Add,
+                rhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            2.0,
+                        ),
+                        op: Mul,
+                        rhs: Num(
+                            2.0,
+                        ),
+                    },
+                ),
+            },
+        ),
+        BinaryOp(
+            BinaryOp {
+                lhs: Num(
+                    2.0,
+                ),
+                op: Add,
+                rhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            2.0,
+                        ),
+                        op: Mul,
+                        rhs: Num(
+                            2.0,
+                        ),
+                    },
+                ),
+            },
+        ),
+        BinaryOp(
+            BinaryOp {
+                lhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            2.0,
+                        ),
+                        op: Add,
+                        rhs: Num(
+                            2.0,
+                        ),
+                    },
+                ),
+                op: Add,
+                rhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            2.0,
+                        ),
+                        op: Mul,
+                        rhs: Num(
+                            2.0,
+                        ),
+                    },
+                ),
+            },
+        ),
+        BinaryOp(
+            BinaryOp {
+                lhs: Num(
+                    2.0,
+                ),
+                op: Add,
+                rhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            2.0,
+                        ),
+                        op: Add,
+                        rhs: BinaryOp(
+                            BinaryOp {
+                                lhs: Num(
+                                    2.0,
+                                ),
+                                op: Mul,
+                                rhs: Num(
+                                    2.0,
+                                ),
+                            },
+                        ),
+                    },
+                ),
+            },
+        ),
+        BinaryOp(
+            BinaryOp {
+                lhs: Num(
+                    2.0,
+                ),
+                op: Add,
+                rhs: BinaryOp(
+                    BinaryOp {
+                        lhs: Num(
+                            3.0,
+                        ),
+                        op: Mul,
+                        rhs: Num(
+                            4.0,
+                        ),
+                    },
+                ),
+            },
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@comment_eof.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@comment_eof.jsonnet.snap
@@ -0,0 +1,26 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnet
+---
+Obj(
+    MemberList(
+        ObjMembers {
+            locals: [],
+            asserts: [],
+            fields: [
+                FieldMember {
+                    name: Fixed(
+                        "a",
+                    ) from virtual:<test>:1-2,
+                    plus: false,
+                    params: None,
+                    visibility: Normal,
+                    value: Num(
+                        1.0,
+                    ),
+                },
+            ],
+        },
+    ),
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@default_nondefault.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@default_nondefault.jsonnet.snap
@@ -0,0 +1,55 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnet
+---
+LocalExpr(
+    [
+        Function {
+            name: "x",
+            params: ExprParams {
+                exprs: [
+                    ExprParam {
+                        destruct: Full(
+                            "foo",
+                        ),
+                        default: Some(
+                            Str(
+                                "foo",
+                            ),
+                        ),
+                    },
+                    ExprParam {
+                        destruct: Full(
+                            "bar",
+                        ),
+                        default: None,
+                    },
+                ],
+                signature: FunctionSignature(
+                    [
+                        ParamParse {
+                            name: Named(
+                                "foo",
+                            ),
+                            default: Exists,
+                        },
+                        ParamParse {
+                            name: Named(
+                                "bar",
+                            ),
+                            default: None,
+                        },
+                    ],
+                ),
+                binds_len: 2,
+            },
+            value: Literal(
+                Null,
+            ),
+        },
+    ],
+    Literal(
+        Null,
+    ),
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@empty_object.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@empty_object.jsonnet.snap
@@ -0,0 +1,14 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/empty_object.jsonnet
+---
+Obj(
+    MemberList(
+        ObjMembers {
+            locals: [],
+            asserts: [],
+            fields: [],
+        },
+    ),
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@imports.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@imports.jsonnet.snap
@@ -0,0 +1,27 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/imports.jsonnet
+---
+Arr(
+    [
+        Import(
+            Normal from virtual:<test>:2-8,
+            Str(
+                "hello",
+            ),
+        ),
+        Import(
+            Str from virtual:<test>:18-27,
+            Str(
+                "garnish.txt",
+            ),
+        ),
+        Import(
+            Bin from virtual:<test>:43-52,
+            Str(
+                "garnish.bin",
+            ),
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@infix.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@infix.jsonnet.snap
@@ -0,0 +1,52 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/infix.jsonnet
+---
+Arr(
+    [
+        BinaryOp(
+            BinaryOp {
+                lhs: UnaryOp(
+                    Not,
+                    Var(
+                        "a" from virtual:<test>:3-4,
+                    ),
+                ),
+                op: And,
+                rhs: UnaryOp(
+                    Not,
+                    Var(
+                        "b" from virtual:<test>:9-10,
+                    ),
+                ),
+            },
+        ),
+        BinaryOp(
+            BinaryOp {
+                lhs: UnaryOp(
+                    Not,
+                    Var(
+                        "a" from virtual:<test>:13-14,
+                    ),
+                ),
+                op: Div,
+                rhs: UnaryOp(
+                    Not,
+                    Var(
+                        "b" from virtual:<test>:18-19,
+                    ),
+                ),
+            },
+        ),
+        UnaryOp(
+            Not,
+            UnaryOp(
+                Not,
+                Var(
+                    "a" from virtual:<test>:23-24,
+                ),
+            ),
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@multiline.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@multiline.jsonnet.snap
@@ -0,0 +1,21 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/multiline.jsonnet
+---
+Arr(
+    [
+        Str(
+            "Hello world!\na\n",
+        ),
+        Str(
+            "Hello world!\na\n",
+        ),
+        Str(
+            "Hello world!\n\ta\n",
+        ),
+        Str(
+            "Hello world!\n a\n",
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@reserved.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@reserved.jsonnet.snap
@@ -0,0 +1,32 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/reserved.jsonnet
+---
+Arr(
+    [
+        Literal(
+            Null,
+        ),
+        Var(
+            "nulla" from virtual:<test>:8-13,
+        ),
+        Apply(
+            Var(
+                "a" from virtual:<test>:15-16,
+            ),
+            ArgsDesc {
+                unnamed: [
+                    Var(
+                        "b" from virtual:<test>:17-18,
+                    ),
+                    Var(
+                        "null_fields" from virtual:<test>:20-31,
+                    ),
+                ],
+                named: [],
+            } from virtual:<test>:16-32,
+            false,
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@slice.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@slice.jsonnet.snap
@@ -0,0 +1,97 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/slice.jsonnet
+---
+Arr(
+    [
+        Slice(
+            Slice {
+                value: Var(
+                    "a" from virtual:<test>:2-3,
+                ),
+                slice: SliceDesc {
+                    start: Some(
+                        Num(
+                            1.0,
+                        ) from virtual:<test>:4-5,
+                    ),
+                    end: None,
+                    step: None,
+                },
+            },
+        ),
+        Slice(
+            Slice {
+                value: Var(
+                    "a" from virtual:<test>:9-10,
+                ),
+                slice: SliceDesc {
+                    start: Some(
+                        Num(
+                            1.0,
+                        ) from virtual:<test>:11-12,
+                    ),
+                    end: None,
+                    step: None,
+                },
+            },
+        ),
+        Slice(
+            Slice {
+                value: Var(
+                    "a" from virtual:<test>:17-18,
+                ),
+                slice: SliceDesc {
+                    start: None,
+                    end: Some(
+                        Num(
+                            1.0,
+                        ) from virtual:<test>:20-21,
+                    ),
+                    step: None,
+                },
+            },
+        ),
+        Slice(
+            Slice {
+                value: Var(
+                    "a" from virtual:<test>:25-26,
+                ),
+                slice: SliceDesc {
+                    start: None,
+                    end: None,
+                    step: Some(
+                        Num(
+                            1.0,
+                        ) from virtual:<test>:29-30,
+                    ),
+                },
+            },
+        ),
+        Slice(
+            Slice {
+                value: Var(
+                    "str" from virtual:<test>:33-36,
+                ),
+                slice: SliceDesc {
+                    start: None,
+                    end: Some(
+                        BinaryOp(
+                            BinaryOp {
+                                lhs: Var(
+                                    "len" from virtual:<test>:38-41,
+                                ),
+                                op: Sub,
+                                rhs: Num(
+                                    1.0,
+                                ),
+                            },
+                        ) from virtual:<test>:38-45,
+                    ),
+                    step: None,
+                },
+            },
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@string_escaping.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@string_escaping.jsonnet.snap
@@ -0,0 +1,24 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnet
+---
+Arr(
+    [
+        Str(
+            "Hello, \"world\"!",
+        ),
+        Str(
+            "Hello 'world'!",
+        ),
+        Str(
+            "\\\\",
+        ),
+        Str(
+            "Hello\nWorld",
+        ),
+        Str(
+            "Hello\\n\"World\"",
+        ),
+    ],
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@subexp.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@subexp.jsonnet.snap
@@ -0,0 +1,58 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/subexp.jsonnet
+---
+BinaryOp(
+    BinaryOp {
+        lhs: ObjExtend(
+            Obj(
+                MemberList(
+                    ObjMembers {
+                        locals: [],
+                        asserts: [],
+                        fields: [],
+                    },
+                ),
+            ),
+            MemberList(
+                ObjMembers {
+                    locals: [
+                        Field {
+                            into: Full(
+                                "x",
+                            ),
+                            value: Num(
+                                1.0,
+                            ),
+                        },
+                    ],
+                    asserts: [],
+                    fields: [
+                        FieldMember {
+                            name: Fixed(
+                                "x",
+                            ) from virtual:<test>:18-19,
+                            plus: false,
+                            params: None,
+                            visibility: Normal,
+                            value: Var(
+                                "x" from virtual:<test>:21-22,
+                            ),
+                        },
+                    ],
+                },
+            ),
+        ),
+        op: Add,
+        rhs: Obj(
+            MemberList(
+                ObjMembers {
+                    locals: [],
+                    asserts: [],
+                    fields: [],
+                },
+            ),
+        ),
+    },
+)
addedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@suffix.jsonnet.snapdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@suffix.jsonnet.snap
@@ -0,0 +1,73 @@
+---
+source: crates/jrsonnet-peg-parser/src/lib.rs
+expression: v
+input_file: crates/jrsonnet-peg-parser/src/tests/suffix.jsonnet
+---
+Arr(
+    [
+        Index {
+            indexable: Var(
+                "std" from virtual:<test>:2-5,
+            ),
+            parts: [
+                IndexPart {
+                    span: virtual:<test>:6-10,
+                    value: Str(
+                        "test",
+                    ),
+                },
+            ],
+        },
+        Apply(
+            Var(
+                "std" from virtual:<test>:12-15,
+            ),
+            ArgsDesc {
+                unnamed: [
+                    Num(
+                        2.0,
+                    ),
+                ],
+                named: [],
+            } from virtual:<test>:15-18,
+            false,
+        ),
+        Apply(
+            Index {
+                indexable: Var(
+                    "std" from virtual:<test>:20-23,
+                ),
+                parts: [
+                    IndexPart {
+                        span: virtual:<test>:24-28,
+                        value: Str(
+                            "test",
+                        ),
+                    },
+                ],
+            },
+            ArgsDesc {
+                unnamed: [
+                    Num(
+                        2.0,
+                    ),
+                ],
+                named: [],
+            } from virtual:<test>:28-31,
+            false,
+        ),
+        Index {
+            indexable: Var(
+                "a" from virtual:<test>:33-34,
+            ),
+            parts: [
+                IndexPart {
+                    span: virtual:<test>:34-37,
+                    value: Var(
+                        "b" from virtual:<test>:35-36,
+                    ),
+                },
+            ],
+        },
+    ],
+)
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_escaping.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_escaping.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(r#\"\"Hello, \\\"world\\\"!\"\"#)"
----
-Str(
-    "Hello, \"world\"!",
-) from virtual:<test>:0-19
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_unescaping.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_unescaping.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(r#\"\"Hello\\nWorld\"\"#)"
----
-Str(
-    "Hello\nWorld",
-) from virtual:<test>:0-14
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_verbantim.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__string_verbantim.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(r#\"@\"Hello\\n\"\"World\"\"\"\"#)"
----
-Str(
-    "Hello\\n\"World\"",
-) from virtual:<test>:0-19
deletedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__suffix.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__suffix.snap
+++ /dev/null
@@ -1,16 +0,0 @@
----
-source: crates/jrsonnet-peg-parser/src/lib.rs
-expression: "parsep(\"std.test\")"
----
-Index {
-    indexable: Var(
-        "std",
-    ) from virtual:<test>:0-3,
-    parts: [
-        IndexPart {
-            value: Str(
-                "test",
-            ) from virtual:<test>:4-8,
-        },
-    ],
-} from virtual:<test>:0-8
addedcrates/jrsonnet-peg-parser/src/tests/array_comp.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/array_comp.jsonnet
@@ -0,0 +1,4 @@
+[
+[std.deepJoin(x) for x in arr],
+[a for a in b if c for e in f],
+]
addedcrates/jrsonnet-peg-parser/src/tests/basic_math.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/basic_math.jsonnet
@@ -0,0 +1,9 @@
+[
+2+2*2,
+2	+ 	  2	  *	2   	,
+2+2+2*2,
+2+(2+2*2),
+2//comment
++//comment
+3/*test*/*/*test*/4,
+]
addedcrates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnet
@@ -0,0 +1,4 @@
+{a:1}
+
+//+213
+
addedcrates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnet
@@ -0,0 +1 @@
+local x(foo = 'foo', bar) = null; null
addedcrates/jrsonnet-peg-parser/src/tests/empty_object.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/empty_object.jsonnet
@@ -0,0 +1 @@
+{}
addedcrates/jrsonnet-peg-parser/src/tests/imports.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/imports.jsonnet
@@ -0,0 +1,5 @@
+[
+import "hello",
+importstr "garnish.txt",
+importbin "garnish.bin",
+]
addedcrates/jrsonnet-peg-parser/src/tests/infix.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/infix.jsonnet
@@ -0,0 +1,5 @@
+[
+!a && !b,
+!a / !b,
+!!a,
+]
addedcrates/jrsonnet-peg-parser/src/tests/multiline.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/multiline.jsonnet
@@ -0,0 +1,18 @@
+[
+|||
+    Hello world!
+    a
+|||,
+|||
+  Hello world!
+  a
+|||,
+|||
+		Hello world!
+			a
+|||,
+|||
+   Hello world!
+    a
+ |||,
+]
addedcrates/jrsonnet-peg-parser/src/tests/reserved.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/reserved.jsonnet
@@ -0,0 +1,5 @@
+[
+null,
+nulla,
+a(b, null_fields),
+]
addedcrates/jrsonnet-peg-parser/src/tests/slice.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/slice.jsonnet
@@ -0,0 +1,7 @@
+[
+a[1:],
+a[1::],
+a[:1:],
+a[::1],
+str[:len - 1],
+]
addedcrates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnet
@@ -0,0 +1,7 @@
+[
+"Hello, \"world\"!",
+'Hello \'world\'!',
+'\\\\',
+"Hello\nWorld",
+@"Hello\n""World""",
+]
addedcrates/jrsonnet-peg-parser/src/tests/subexp.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/subexp.jsonnet
@@ -0,0 +1 @@
+{} { local x = 1, x: x } + {}
addedcrates/jrsonnet-peg-parser/src/tests/suffix.jsonnetdiffbeforeafterboth
--- /dev/null
+++ b/crates/jrsonnet-peg-parser/src/tests/suffix.jsonnet
@@ -0,0 +1,6 @@
+[
+std.test,
+std(2),
+std.test(2),
+a[b],
+]
modifiedtests/cpp_test_suite_golden_override/error.01.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.01.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.01.jsonnet.golden
@@ -1,5 +1,5 @@
 runtime error: foo
-    error.01.jsonnet:17:29-41: error statement
-    error.01.jsonnet:18:29-40: function <bananas> call
-    error.01.jsonnet:19:28-39: function <oranges> call
-    error.01.jsonnet:20:1-11:  function <apples> call
+    error.01.jsonnet:17:29-35: error statement
+    error.01.jsonnet:18:36-40: function <bananas> call
+    error.01.jsonnet:19:35-39: function <oranges> call
+    error.01.jsonnet:20:7-11:  function <apples> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.02.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.02.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.02.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: Foo.
-    error.02.jsonnet:17:1-14: error statement
+    error.02.jsonnet:17:1-7: error statement
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.03.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.03.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.03.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: foo
-    error.03.jsonnet:17:21-33: error statement
-    error.03.jsonnet:18:8-10:  field <x> access
+    error.03.jsonnet:17:21-27: error statement
+    error.03.jsonnet:18:8-10:  field <x> access
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.04.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.04.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.04.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: foo
-    error.04.jsonnet:17:21-33: error statement
-    field <x> evaluation
+    error.04.jsonnet:17:21-27: error statement
+    field <x> evaluation
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.05.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.05.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.05.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: foo
-    error.05.jsonnet:17:21-33: error statement
+    error.05.jsonnet:17:21-27: error statement
     field <x> evaluation
-    field <y> manifestification
+    field <y> manifestification
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.06.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.06.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.06.jsonnet.golden
@@ -1,3 +1,3 @@
 attempted to divide by zero
     error.06.jsonnet:18:22-26: local <err> access
-    error.06.jsonnet:19:1-5:   function <f> call
\ No newline at end of file
+    error.06.jsonnet:19:2-5:   function <f> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.07.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.07.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.07.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: sarcasm
-    error.07.jsonnet:18:31-47: error statement
-    error.07.jsonnet:18:15-55: function <third> call
+    error.07.jsonnet:18:31-37: error statement
+    error.07.jsonnet:18:20-55: function <third> call
     error.07.jsonnet:19:1-7:   local <toxic> access
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.08.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.08.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.08.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: {"a": 1, "b": 2, "c": 3}
-    error.08.jsonnet:18:1-9: error statement
\ No newline at end of file
+    error.08.jsonnet:18:1-7: error statement
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.assert_equal_obj.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.assert_equal_obj.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.assert_equal_obj.jsonnet.golden
@@ -5,4 +5,4 @@
 B: {
   "b": 1
 }
-    error.assert_equal_obj.jsonnet:17:1-37: function <builtin_assert_equal> call
\ No newline at end of file
+    error.assert_equal_obj.jsonnet:17:16-37: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.assert_equal_str.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.assert_equal_str.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.assert_equal_str.jsonnet.golden
@@ -8,4 +8,4 @@
 four
 
 </B>
-    error.assert_equal_str.jsonnet:17:1-46: function <builtin_assert_equal> call
\ No newline at end of file
+    error.assert_equal_str.jsonnet:17:16-46: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.computed_field_scope.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.computed_field_scope.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.computed_field_scope.jsonnet.golden
@@ -1,3 +1,3 @@
 local is not defined: x
     error.computed_field_scope.jsonnet:17:21-23: local <x> access
-    error.computed_field_scope.jsonnet:17:21-23: evaluating field name
\ No newline at end of file
+    error.computed_field_scope.jsonnet:17:20-24: evaluating field name
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.decodeUTF8_float.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.decodeUTF8_float.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.decodeUTF8_float.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: cannot convert number with fractional part to u8
     argument <arr> evaluation
-    error.decodeUTF8_float.jsonnet:1:1-24: function <builtin_decode_utf8> call
\ No newline at end of file
+    error.decodeUTF8_float.jsonnet:1:15-24: function <builtin_decode_utf8> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.decodeUTF8_nan.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.decodeUTF8_nan.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.decodeUTF8_nan.jsonnet.golden
@@ -1,4 +1,4 @@
 type error: expected BoundedNumber<0, 255>, got string at self[0]
     array index 0
     argument <arr> evaluation
-    error.decodeUTF8_nan.jsonnet:1:1-25: function <builtin_decode_utf8> call
\ No newline at end of file
+    error.decodeUTF8_nan.jsonnet:1:15-25: function <builtin_decode_utf8> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.function_duplicate_arg.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.function_duplicate_arg.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.function_duplicate_arg.jsonnet.golden
@@ -1,2 +1,2 @@
 argument x is already bound
-    error.function_duplicate_arg.jsonnet:17:1-30: function <anonymous> call
\ No newline at end of file
+    error.function_duplicate_arg.jsonnet:17:21-30: function <anonymous> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.function_too_many_args.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.function_too_many_args.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.function_too_many_args.jsonnet.golden
@@ -1,3 +1,3 @@
 too many args, function has 2
 Function has the following signature: (a, b)
-    error.function_too_many_args.jsonnet:19:1-14: function <foo> call
\ No newline at end of file
+    error.function_too_many_args.jsonnet:19:4-14: function <foo> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.import_static-check-failure.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.import_static-check-failure.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.import_static-check-failure.jsonnet.golden
@@ -1,3 +1,3 @@
 local is not defined: x
-    static_check_failure.jsonnet:2:1-3:               local <x> access
-    error.import_static-check-failure.jsonnet:1:1-43: import "lib/static_check_failure.jsonnet"
\ No newline at end of file
+    static_check_failure.jsonnet:2:1-3:              local <x> access
+    error.import_static-check-failure.jsonnet:1:1-8: import "lib/static_check_failure.jsonnet"
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.import_syntax-error.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.import_syntax-error.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.import_syntax-error.jsonnet.golden
@@ -1,3 +1,3 @@
 syntax error: expected one of "\\\\", "\\u", "\\x", ['"'], ['\\'], [_], got "EOF"
     syntax_error.jsonnet:1:3
-    error.import_syntax-error.jsonnet:1:1-35: import "lib/syntax_error.jsonnet"
\ No newline at end of file
+    error.import_syntax-error.jsonnet:1:1-8: import "lib/syntax_error.jsonnet"
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.inside_equals_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.inside_equals_array.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.inside_equals_array.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: foobar
-    error.inside_equals_array.jsonnet:18:18-33: error statement
\ No newline at end of file
+    error.inside_equals_array.jsonnet:18:18-24: error statement
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.inside_equals_object.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.inside_equals_object.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.inside_equals_object.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: foobar
-    error.inside_equals_object.jsonnet:18:22-37: error statement
\ No newline at end of file
+    error.inside_equals_object.jsonnet:18:22-28: error statement
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.inside_tostring_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.inside_tostring_array.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.inside_tostring_array.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: foobar
-    error.inside_tostring_array.jsonnet:17:8-23: error statement
+    error.inside_tostring_array.jsonnet:17:8-14: error statement
     elem <2> evaluation
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.inside_tostring_object.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.inside_tostring_object.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.inside_tostring_object.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: foobar
-    error.inside_tostring_object.jsonnet:17:12-27: error statement
+    error.inside_tostring_object.jsonnet:17:12-18: error statement
     field <b> evaluation
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.invariant.option.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.invariant.option.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.invariant.option.jsonnet.golden
@@ -1,6 +1,6 @@
 type error: expected array, got string
     argument <a> evaluation
-    error.invariant.option.jsonnet:19:21-56: function <builtin_set_inter> call
+    error.invariant.option.jsonnet:19:33-56: function <builtin_set_inter> call
     argument <x> evaluation
-    error.invariant.option.jsonnet:19:10-57: function <builtin_length> call
+    error.invariant.option.jsonnet:19:20-57: function <builtin_length> call
     error.invariant.option.jsonnet:19:10-61: assertion condition
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.invariant.simple3.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.invariant.simple3.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.invariant.simple3.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: my error message
-    error.invariant.simple3.jsonnet:18:10-35: error statement
+    error.invariant.simple3.jsonnet:18:10-16: error statement
     error.invariant.simple3.jsonnet:18:10-35: assertion condition
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.manifest_toml_null_value.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.manifest_toml_null_value.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.manifest_toml_null_value.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: tried to manifest null
-    error.manifest_toml_null_value.jsonnet:17:1-55: function <builtin_manifest_toml_ex> call
\ No newline at end of file
+    error.manifest_toml_null_value.jsonnet:17:19-55: function <builtin_manifest_toml_ex> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.manifest_toml_wrong_type.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.manifest_toml_wrong_type.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.manifest_toml_wrong_type.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected object, got array
     argument <value> evaluation
-    error.manifest_toml_wrong_type.jsonnet:17:1-30: function <builtin_manifest_toml_ex> call
\ No newline at end of file
+    error.manifest_toml_wrong_type.jsonnet:17:19-30: function <builtin_manifest_toml_ex> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.parse_json.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.parse_json.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.parse_json.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: failed to parse json: expected value at line 1 column 1
-    error.parse_json.jsonnet:1:1-30: function <builtin_parse_json> call
\ No newline at end of file
+    error.parse_json.jsonnet:1:14-30: function <builtin_parse_json> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.recursive_function_nonterm.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.recursive_function_nonterm.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.recursive_function_nonterm.jsonnet.golden
@@ -1,201 +1,201 @@
 stack overflow, try to reduce recursion, or set --max-stack to bigger value
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:18:3-8: function <f> call
-    error.recursive_function_nonterm.jsonnet:20:1-7: function <f> call
\ No newline at end of file
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:18:4-8: function <f> call
+    error.recursive_function_nonterm.jsonnet:20:2-7: function <f> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.recursive_import.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.recursive_import.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.recursive_import.jsonnet.golden
@@ -1,2 +1,2 @@
 infinite recursion detected
-    error.recursive_import.jsonnet:17:15-55: import "error.recursive_import.jsonnet"
\ No newline at end of file
+    error.recursive_import.jsonnet:17:15-22: import "error.recursive_import.jsonnet"
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.sanity.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.sanity.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.sanity.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: assertion failed: A != B
 A: 1
 B: 2
-    error.sanity.jsonnet:17:1-23: function <builtin_assert_equal> call
\ No newline at end of file
+    error.sanity.jsonnet:17:16-23: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_join_types1.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_join_types1.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_join_types1.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: in std.join all items should be strings
-    error.std_join_types1.jsonnet:17:1-27: function <builtin_join> call
\ No newline at end of file
+    error.std_join_types1.jsonnet:17:9-27: function <builtin_join> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_join_types2.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_join_types2.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_join_types2.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: in std.join all items should be arrays
-    error.std_join_types2.jsonnet:17:1-32: function <builtin_join> call
\ No newline at end of file
+    error.std_join_types2.jsonnet:17:9-32: function <builtin_join> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_makeArray_negative.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_makeArray_negative.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_makeArray_negative.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: number out of bounds: -10 not in 0..2147483647
     argument <sz> evaluation
-    error.std_makeArray_negative.jsonnet:17:1-38: function <builtin_make_array> call
\ No newline at end of file
+    error.std_makeArray_negative.jsonnet:17:14-38: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_maxArray.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_maxArray.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_maxArray.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: expected non-empty array
-    error.std_maxArray.jsonnet:1:1-18: function <builtin_max_array> call
\ No newline at end of file
+    error.std_maxArray.jsonnet:1:13-18: function <builtin_max_array> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_minArray.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_minArray.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_minArray.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: expected non-empty array
-    error.std_minArray.jsonnet:1:1-18: function <builtin_min_array> call
\ No newline at end of file
+    error.std_minArray.jsonnet:1:13-18: function <builtin_min_array> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.std_parseJson.nodigitsep.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.std_parseJson.nodigitsep.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.std_parseJson.nodigitsep.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: failed to parse json: trailing characters at line 1 column 4
-    error.std_parseJson.nodigitsep.jsonnet:1:1-26: function <builtin_parse_json> call
\ No newline at end of file
+    error.std_parseJson.nodigitsep.jsonnet:1:14-26: function <builtin_parse_json> call
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.trace_three_param.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.trace_three_param.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.trace_three_param.jsonnet.golden
@@ -1,5 +1,5 @@
 too many args, function has 2
 Function has the following signature: (str, rest = <default>)
-    error.trace_three_param.jsonnet:17:11-33: function <builtin_trace> call
+    error.trace_three_param.jsonnet:17:20-33: function <builtin_trace> call
     error.trace_three_param.jsonnet:19:6-8:   local <v> access
     field <a> evaluation
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.trace_zero_param.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.trace_zero_param.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.trace_zero_param.jsonnet.golden
@@ -1,5 +1,5 @@
 function argument is not passed: str
 Function has the following signature: (str, rest = <default>)
-    error.trace_zero_param.jsonnet:17:11-23: function <builtin_trace> call
+    error.trace_zero_param.jsonnet:17:20-23: function <builtin_trace> call
     error.trace_zero_param.jsonnet:19:6-8:   local <v> access
     field <a> evaluation
\ No newline at end of file
modifiedtests/cpp_test_suite_golden_override/error.wrong_type.jsonnet.goldendiffbeforeafterboth
--- a/tests/cpp_test_suite_golden_override/error.wrong_type.jsonnet.golden
+++ b/tests/cpp_test_suite_golden_override/error.wrong_type.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected char, got number
     argument <str> evaluation
-    error.wrong_type.jsonnet:1:1-19: function <builtin_codepoint> call
\ No newline at end of file
+    error.wrong_type.jsonnet:1:14-19: function <builtin_codepoint> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/arrcomp_if6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/arrcomp_if6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/arrcomp_if6.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: x
-    arrcomp_if6.jsonnet:1:20-30: error statement
\ No newline at end of file
+    arrcomp_if6.jsonnet:1:20-26: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/assert_equal4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/assert_equal4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/assert_equal4.jsonnet.golden
@@ -5,4 +5,4 @@
 B: {
   "x": 2
 }
-    assert_equal4.jsonnet:1:1-33: function <builtin_assert_equal> call
\ No newline at end of file
+    assert_equal4.jsonnet:1:16-33: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/assert_equal5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/assert_equal5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/assert_equal5.jsonnet.golden
@@ -7,4 +7,4 @@
 
 
 </B>
-    assert_equal5.jsonnet:1:1-30: function <builtin_assert_equal> call
\ No newline at end of file
+    assert_equal5.jsonnet:1:16-30: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/assert_equal6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/assert_equal6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/assert_equal6.jsonnet.golden
@@ -5,4 +5,4 @@
 B: <B>
 
 </B>
-    assert_equal6.jsonnet:1:1-35: function <builtin_assert_equal> call
\ No newline at end of file
+    assert_equal6.jsonnet:1:16-35: function <builtin_assert_equal> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/bad_function_call.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/bad_function_call.jsonnet.golden
+++ b/tests/go_testdata_golden_override/bad_function_call.jsonnet.golden
@@ -1,3 +1,3 @@
 function argument is not passed: x
 Function has the following signature: (x)
-    bad_function_call.jsonnet:1:1-19: function <anonymous> call
\ No newline at end of file
+    bad_function_call.jsonnet:1:16-19: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/bad_function_call2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/bad_function_call2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/bad_function_call2.jsonnet.golden
@@ -1,3 +1,3 @@
 too many args, function has 1
 Function has the following signature: (x)
-    bad_function_call2.jsonnet:1:1-23: function <anonymous> call
\ No newline at end of file
+    bad_function_call2.jsonnet:1:16-23: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/bad_function_call_and_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/bad_function_call_and_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/bad_function_call_and_error.jsonnet.golden
@@ -1,3 +1,3 @@
 too many args, function has 1
 Function has the following signature: (x)
-    bad_function_call_and_error.jsonnet:1:1-39: function <anonymous> call
\ No newline at end of file
+    bad_function_call_and_error.jsonnet:1:16-39: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/bitwise_and4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/bitwise_and4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/bitwise_and4.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: x
-    bitwise_and4.jsonnet:1:5-15: error statement
\ No newline at end of file
+    bitwise_and4.jsonnet:1:5-11: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/bitwise_xor7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/bitwise_xor7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/bitwise_xor7.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: x
-    bitwise_xor7.jsonnet:1:5-15: error statement
\ No newline at end of file
+    bitwise_xor7.jsonnet:1:5-11: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64DecodeBytes_high_codepoint.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64DecodeBytes_high_codepoint.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64DecodeBytes_high_codepoint.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: invalid base64: Invalid symbol 196, offset 0.
-    builtinBase64DecodeBytes_high_codepoint.jsonnet:1:1-30: function <builtin_base64_decode_bytes> call
\ No newline at end of file
+    builtinBase64DecodeBytes_high_codepoint.jsonnet:1:22-30: function <builtin_base64_decode_bytes> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64DecodeBytes_invalid_base64_data.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64DecodeBytes_invalid_base64_data.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64DecodeBytes_invalid_base64_data.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: invalid base64: Invalid input length: 5
-    builtinBase64DecodeBytes_invalid_base64_data.jsonnet:1:1-32: function <builtin_base64_decode_bytes> call
\ No newline at end of file
+    builtinBase64DecodeBytes_invalid_base64_data.jsonnet:1:22-32: function <builtin_base64_decode_bytes> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64DecodeBytes_wrong_type.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64DecodeBytes_wrong_type.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64DecodeBytes_wrong_type.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <str> evaluation
-    builtinBase64DecodeBytes_wrong_type.jsonnet:1:1-26: function <builtin_base64_decode_bytes> call
\ No newline at end of file
+    builtinBase64DecodeBytes_wrong_type.jsonnet:1:22-26: function <builtin_base64_decode_bytes> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64Decode_high_codepoint.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64Decode_high_codepoint.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64Decode_high_codepoint.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: invalid base64: Invalid symbol 196, offset 0.
-    builtinBase64Decode_high_codepoint.jsonnet:1:1-25: function <builtin_base64_decode> call
\ No newline at end of file
+    builtinBase64Decode_high_codepoint.jsonnet:1:17-25: function <builtin_base64_decode> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64Decode_invalid_base64_data.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64Decode_invalid_base64_data.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64Decode_invalid_base64_data.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: invalid base64: Invalid input length: 5
-    builtinBase64Decode_invalid_base64_data.jsonnet:1:1-27: function <builtin_base64_decode> call
\ No newline at end of file
+    builtinBase64Decode_invalid_base64_data.jsonnet:1:17-27: function <builtin_base64_decode> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64Decode_wrong_type.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64Decode_wrong_type.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64Decode_wrong_type.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <str> evaluation
-    builtinBase64Decode_wrong_type.jsonnet:1:1-21: function <builtin_base64_decode> call
\ No newline at end of file
+    builtinBase64Decode_wrong_type.jsonnet:1:17-21: function <builtin_base64_decode> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64_invalid_byte_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array.jsonnet.golden
@@ -2,4 +2,4 @@
   - expected string, got array
   - expected BoundedNumber<0, 255>, got string at self[1]
     argument <input> evaluation
-    builtinBase64_invalid_byte_array.jsonnet:1:1-24: function <builtin_base64> call
\ No newline at end of file
+    builtinBase64_invalid_byte_array.jsonnet:1:11-24: function <builtin_base64> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64_invalid_byte_array1.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array1.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array1.jsonnet.golden
@@ -2,4 +2,4 @@
   - expected string, got array
   - number out of bounds: -1 not in 0..255 at self[1]
     argument <input> evaluation
-    builtinBase64_invalid_byte_array1.jsonnet:1:1-21: function <builtin_base64> call
\ No newline at end of file
+    builtinBase64_invalid_byte_array1.jsonnet:1:11-21: function <builtin_base64> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64_invalid_byte_array2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64_invalid_byte_array2.jsonnet.golden
@@ -2,4 +2,4 @@
   - expected string, got array
   - number out of bounds: 256 not in 0..255 at self[1]
     argument <input> evaluation
-    builtinBase64_invalid_byte_array2.jsonnet:1:1-22: function <builtin_base64> call
\ No newline at end of file
+    builtinBase64_invalid_byte_array2.jsonnet:1:11-22: function <builtin_base64> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinBase64_non_string_non_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinBase64_non_string_non_array.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinBase64_non_string_non_array.jsonnet.golden
@@ -2,4 +2,4 @@
   - expected string, got number
   - expected Array<BoundedNumber<0, 255>>, got number
     argument <input> evaluation
-    builtinBase64_non_string_non_array.jsonnet:1:1-15: function <builtin_base64> call
\ No newline at end of file
+    builtinBase64_non_string_non_array.jsonnet:1:11-15: function <builtin_base64> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinChar3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinChar3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinChar3.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: number out of bounds: -1 not in 0..4294967295
     argument <n> evaluation
-    builtinChar3.jsonnet:1:1-14: function <builtin_char> call
\ No newline at end of file
+    builtinChar3.jsonnet:1:9-14: function <builtin_char> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinChar5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinChar5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinChar5.jsonnet.golden
@@ -1,2 +1,2 @@
 invalid unicode codepoint: 1114112
-    builtinChar5.jsonnet:2:1-19: function <builtin_char> call
\ No newline at end of file
+    builtinChar5.jsonnet:2:9-19: function <builtin_char> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinChar7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinChar7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinChar7.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected BoundedNumber<0, 4294967295>, got string
     argument <n> evaluation
-    builtinChar7.jsonnet:1:1-17: function <builtin_char> call
\ No newline at end of file
+    builtinChar7.jsonnet:1:9-17: function <builtin_char> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinIsEmpty2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinIsEmpty2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinIsEmpty2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <str> evaluation
-    builtinIsEmpty2.jsonnet:1:1-17: function <builtin_is_empty> call
\ No newline at end of file
+    builtinIsEmpty2.jsonnet:1:12-17: function <builtin_is_empty> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinObjectFieldsEx_bad.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinObjectFieldsEx_bad.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinObjectFieldsEx_bad.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected object, got number
     argument <obj> evaluation
-    builtinObjectFieldsEx_bad.jsonnet:1:1-30: function <builtin_object_fields_ex> call
\ No newline at end of file
+    builtinObjectFieldsEx_bad.jsonnet:1:19-30: function <builtin_object_fields_ex> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinObjectFieldsEx_bad2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinObjectFieldsEx_bad2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinObjectFieldsEx_bad2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected boolean, got string
     argument <hidden> evaluation
-    builtinObjectFieldsEx_bad2.jsonnet:1:1-31: function <builtin_object_fields_ex> call
\ No newline at end of file
+    builtinObjectFieldsEx_bad2.jsonnet:1:19-31: function <builtin_object_fields_ex> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinObjectHasExBadBoolean.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinObjectHasExBadBoolean.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinObjectHasExBadBoolean.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected boolean, got string
     argument <hidden> evaluation
-    builtinObjectHasExBadBoolean.jsonnet:1:1-35: function <builtin_object_has_ex> call
\ No newline at end of file
+    builtinObjectHasExBadBoolean.jsonnet:1:16-35: function <builtin_object_has_ex> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinObjectHasExBadField.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinObjectHasExBadField.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinObjectHasExBadField.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <fname> evaluation
-    builtinObjectHasExBadField.jsonnet:1:1-32: function <builtin_object_has_ex> call
\ No newline at end of file
+    builtinObjectHasExBadField.jsonnet:1:16-32: function <builtin_object_has_ex> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinObjectHasExBadObject.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinObjectHasExBadObject.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinObjectHasExBadObject.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected object, got number
     argument <obj> evaluation
-    builtinObjectHasExBadObject.jsonnet:1:1-33: function <builtin_object_has_ex> call
\ No newline at end of file
+    builtinObjectHasExBadObject.jsonnet:1:16-33: function <builtin_object_has_ex> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinReverse_not_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinReverse_not_array.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinReverse_not_array.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected array, got boolean
     argument <arr> evaluation
-    builtinReverse_not_array.jsonnet:1:1-20: function <builtin_reverse> call
\ No newline at end of file
+    builtinReverse_not_array.jsonnet:1:12-20: function <builtin_reverse> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSplitLimitR5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSplitLimitR5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSplitLimitR5.jsonnet.golden
@@ -2,4 +2,4 @@
   - number out of bounds: -2 not in 0..9007199254740991
   - number out of bounds: -2 not in -1..-1
     argument <maxsplits> evaluation
-    builtinSplitLimitR5.jsonnet:1:1-45: function <builtin_splitlimitr> call
\ No newline at end of file
+    builtinSplitLimitR5.jsonnet:1:16-45: function <builtin_splitlimitr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_first_param_not_string.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_first_param_not_string.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_first_param_not_string.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <str> evaluation
-    builtinSubStr_first_param_not_string.jsonnet:1:1-21: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_first_param_not_string.jsonnet:1:11-21: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_second_parameter_not_integer.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_second_parameter_not_integer.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_second_parameter_not_integer.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: cannot convert number with fractional part to usize
     argument <from> evaluation
-    builtinSubStr_second_parameter_not_integer.jsonnet:1:1-29: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_second_parameter_not_integer.jsonnet:1:11-29: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_second_parameter_not_number.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_second_parameter_not_number.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_second_parameter_not_number.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected BoundedNumber<0, 9007199254740991>, got string
     argument <from> evaluation
-    builtinSubStr_second_parameter_not_number.jsonnet:1:1-31: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_second_parameter_not_number.jsonnet:1:11-31: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_third_parameter_less_then_zero.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: number out of bounds: -1 not in 0..9007199254740991
     argument <len> evaluation
-    builtinSubStr_third_parameter_less_then_zero.jsonnet:1:1-28: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_third_parameter_less_then_zero.jsonnet:1:11-28: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_third_parameter_not_integer.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_third_parameter_not_integer.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_third_parameter_not_integer.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: cannot convert number with fractional part to usize
     argument <len> evaluation
-    builtinSubStr_third_parameter_not_integer.jsonnet:1:1-29: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_third_parameter_not_integer.jsonnet:1:11-29: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinSubStr_third_parameter_not_number.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinSubStr_third_parameter_not_number.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinSubStr_third_parameter_not_number.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected BoundedNumber<0, 9007199254740991>, got string
     argument <len> evaluation
-    builtinSubStr_third_parameter_not_number.jsonnet:1:1-31: function <builtin_substr> call
\ No newline at end of file
+    builtinSubStr_third_parameter_not_number.jsonnet:1:11-31: function <builtin_substr> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinTrim4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinTrim4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinTrim4.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <str> evaluation
-    builtinTrim4.jsonnet:1:1-14: function <builtin_trim> call
\ No newline at end of file
+    builtinTrim4.jsonnet:1:9-14: function <builtin_trim> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinXnor2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinXnor2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinXnor2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected boolean, got string
     argument <x> evaluation
-    builtinXnor2.jsonnet:1:1-25: function <builtin_xnor> call
\ No newline at end of file
+    builtinXnor2.jsonnet:1:9-25: function <builtin_xnor> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtinXor2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtinXor2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtinXor2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected boolean, got string
     argument <x> evaluation
-    builtinXor2.jsonnet:1:1-24: function <builtin_xor> call
\ No newline at end of file
+    builtinXor2.jsonnet:1:8-24: function <builtin_xor> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_exp3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_exp3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_exp3.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    builtin_exp3.jsonnet:1:1-15: function <builtin_exp> call
\ No newline at end of file
+    builtin_exp3.jsonnet:1:8-15: function <builtin_exp> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_exp5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_exp5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_exp5.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    builtin_exp5.jsonnet:1:1-32: function <builtin_exp> call
\ No newline at end of file
+    builtin_exp5.jsonnet:1:8-32: function <builtin_exp> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_log5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_log5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_log5.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    builtin_log5.jsonnet:1:1-12: function <builtin_log> call
\ No newline at end of file
+    builtin_log5.jsonnet:1:8-12: function <builtin_log> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_log7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_log7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_log7.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    builtin_log7.jsonnet:1:1-13: function <builtin_log> call
\ No newline at end of file
+    builtin_log7.jsonnet:1:8-13: function <builtin_log> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_log8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_log8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_log8.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    builtin_log8.jsonnet:1:1-25: function <builtin_log> call
\ No newline at end of file
+    builtin_log8.jsonnet:1:8-25: function <builtin_log> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_manifestTomlEx_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_manifestTomlEx_array.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_manifestTomlEx_array.jsonnet.golden
@@ -1,4 +1,4 @@
 type error: expected object, got array
     argument <value> evaluation
-    builtin_manifestTomlEx_array.jsonnet:11:10-42: function <builtin_manifest_toml_ex> call
+    builtin_manifestTomlEx_array.jsonnet:11:28-42: function <builtin_manifest_toml_ex> call
     field <array> evaluation
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_manifestTomlEx_null.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_manifestTomlEx_null.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_manifestTomlEx_null.jsonnet.golden
@@ -1,4 +1,4 @@
 type error: expected object, got null
     argument <value> evaluation
-    builtin_manifestTomlEx_null.jsonnet:2:11-43: function <builtin_manifest_toml_ex> call
+    builtin_manifestTomlEx_null.jsonnet:2:29-43: function <builtin_manifest_toml_ex> call
     field <null> evaluation
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_member_object_invalid.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_member_object_invalid.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_member_object_invalid.jsonnet.golden
@@ -2,4 +2,4 @@
   - expected array, got object
   - expected string, got object
     argument <arr> evaluation
-    builtin_member_object_invalid.jsonnet:1:1-32: function <builtin_member> call
\ No newline at end of file
+    builtin_member_object_invalid.jsonnet:1:11-32: function <builtin_member> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_parseInt_invalid.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_parseInt_invalid.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_parseInt_invalid.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: "hello" is not a base 10 integer
-    builtin_parseInt_invalid.jsonnet:1:1-23: function <builtin_parse_int> call
\ No newline at end of file
+    builtin_parseInt_invalid.jsonnet:1:13-23: function <builtin_parse_int> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_parseInt_invalid_decimal.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_parseInt_invalid_decimal.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_parseInt_invalid_decimal.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: "123.12" is not a base 10 integer
-    builtin_parseInt_invalid_decimal.jsonnet:1:1-24: function <builtin_parse_int> call
\ No newline at end of file
+    builtin_parseInt_invalid_decimal.jsonnet:1:13-24: function <builtin_parse_int> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_parseInt_invalid_hexadecimal.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_parseInt_invalid_hexadecimal.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_parseInt_invalid_hexadecimal.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: "7B316" is not a base 10 integer
-    builtin_parseInt_invalid_hexadecimal.jsonnet:1:1-23: function <builtin_parse_int> call
\ No newline at end of file
+    builtin_parseInt_invalid_hexadecimal.jsonnet:1:13-23: function <builtin_parse_int> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_sqrt2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_sqrt2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_sqrt2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected BoundedNumber<0, open>, got string
     argument <x> evaluation
-    builtin_sqrt2.jsonnet:1:1-20: function <builtin_sqrt> call
\ No newline at end of file
+    builtin_sqrt2.jsonnet:1:9-20: function <builtin_sqrt> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/builtin_stripChars_invalid.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/builtin_stripChars_invalid.jsonnet.golden
+++ b/tests/go_testdata_golden_override/builtin_stripChars_invalid.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got object
     argument <str> evaluation
-    builtin_stripChars_invalid.jsonnet:1:1-4133: function <builtin_strip_chars> call
\ No newline at end of file
+    builtin_stripChars_invalid.jsonnet:1:15-4133: function <builtin_strip_chars> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/double_thunk.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/double_thunk.jsonnet.golden
+++ b/tests/go_testdata_golden_override/double_thunk.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: xxx
-    double_thunk.jsonnet:1:21-33: error statement
+    double_thunk.jsonnet:1:21-27: error statement
     double_thunk.jsonnet:1:34-36: local <y> access
     double_thunk.jsonnet:1:37-39: local <x> access
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: 42
-    error.jsonnet:1:1-12: error statement
\ No newline at end of file
+    error.jsonnet:1:1-7: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_from_array.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_from_array.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_from_array.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: xxx
-    error_from_array.jsonnet:1:2-14: error statement
\ No newline at end of file
+    error_from_array.jsonnet:1:2-8: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_from_func.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_from_func.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_from_func.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: xxx
-    error_from_func.jsonnet:1:25-33: error statement
-    error_from_func.jsonnet:1:34-45: function <foo> call
\ No newline at end of file
+    error_from_func.jsonnet:1:25-31: error statement
+    error_from_func.jsonnet:1:37-45: function <foo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_function_fail.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_function_fail.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_function_fail.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: tried to manifest function
-    error_function_fail.jsonnet:1:1-24: error statement
\ No newline at end of file
+    error_function_fail.jsonnet:1:1-7: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_in_method.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_in_method.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_in_method.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: xxx
-    error_in_method.jsonnet:1:23-31: error statement
-    error_in_method.jsonnet:1:34-49: function <foo> call
\ No newline at end of file
+    error_in_method.jsonnet:1:23-29: error statement
+    error_in_method.jsonnet:1:41-49: function <foo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_in_object_local.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_in_object_local.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_in_object_local.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: xxx
-    error_in_object_local.jsonnet:1:20-30: error statement
-    error_in_object_local.jsonnet:1:36-47: function <foo> call
+    error_in_object_local.jsonnet:1:20-26: error statement
+    error_in_object_local.jsonnet:1:39-47: function <foo> call
     field <baz> evaluation
\ No newline at end of file
modifiedtests/go_testdata_golden_override/error_object.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/error_object.jsonnet.golden
+++ b/tests/go_testdata_golden_override/error_object.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: {"blah": 42}
-    error_object.jsonnet:1:1-22: error statement
\ No newline at end of file
+    error_object.jsonnet:1:1-7: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/extvar_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/extvar_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/extvar_error.jsonnet.golden
@@ -1,2 +1,2 @@
 external variable is not defined: errorVar
-    extvar_error.jsonnet:1:1-24: function <builtin_ext_var> call
\ No newline at end of file
+    extvar_error.jsonnet:1:11-24: function <builtin_ext_var> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/extvar_hermetic.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/extvar_hermetic.jsonnet.golden
+++ b/tests/go_testdata_golden_override/extvar_hermetic.jsonnet.golden
@@ -1,2 +1,2 @@
 external variable is not defined: UndeclaredX
-    extvar_hermetic.jsonnet:1:15-41: function <builtin_ext_var> call
\ No newline at end of file
+    extvar_hermetic.jsonnet:1:25-41: function <builtin_ext_var> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/extvar_not_a_string.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/extvar_not_a_string.jsonnet.golden
+++ b/tests/go_testdata_golden_override/extvar_not_a_string.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <x> evaluation
-    extvar_not_a_string.jsonnet:1:1-16: function <builtin_ext_var> call
\ No newline at end of file
+    extvar_not_a_string.jsonnet:1:11-16: function <builtin_ext_var> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/extvar_static_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/extvar_static_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/extvar_static_error.jsonnet.golden
@@ -1,2 +1,2 @@
 external variable is not defined: staticErrorVar
-    extvar_static_error.jsonnet:1:1-30: function <builtin_ext_var> call
\ No newline at end of file
+    extvar_static_error.jsonnet:1:11-30: function <builtin_ext_var> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/extvar_unknown.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/extvar_unknown.jsonnet.golden
+++ b/tests/go_testdata_golden_override/extvar_unknown.jsonnet.golden
@@ -1,2 +1,2 @@
 external variable is not defined: UNKNOWN
-    extvar_unknown.jsonnet:1:1-23: function <builtin_ext_var> call
\ No newline at end of file
+    extvar_unknown.jsonnet:1:11-23: function <builtin_ext_var> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/fieldname_not_string.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/fieldname_not_string.jsonnet.golden
+++ b/tests/go_testdata_golden_override/fieldname_not_string.jsonnet.golden
@@ -1,2 +1,2 @@
 type error: expected string, got number
-    fieldname_not_string.jsonnet:1:4-9: evaluating field name
\ No newline at end of file
+    fieldname_not_string.jsonnet:1:3-10: evaluating field name
\ No newline at end of file
modifiedtests/go_testdata_golden_override/import_syntax_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/import_syntax_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/import_syntax_error.jsonnet.golden
@@ -1,3 +1,3 @@
 syntax error: expected one of "(", "[", "{", <identifier>, <number>, <string>, <unary op>, ['"'], ['\''], got "EOF"
     syntax_error.jsonnet:1:5
-    import_syntax_error.jsonnet:1:1-31: import "syntax_error.jsonnet"
\ No newline at end of file
+    import_syntax_error.jsonnet:1:1-8: import "syntax_error.jsonnet"
\ No newline at end of file
modifiedtests/go_testdata_golden_override/lazy_operator2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/lazy_operator2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/lazy_operator2.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: should happen
-    lazy_operator2.jsonnet:1:9-31: error statement
\ No newline at end of file
+    lazy_operator2.jsonnet:1:9-15: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_assert.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_assert.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_assert.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, got "f"
-    object_comp_assert.jsonnet:1:32
\ No newline at end of file
+syntax error: expected one of "(", ".", "?", "[", "{", <binary op>, got "}"
+    object_comp_assert.jsonnet:1:46
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_bad_field.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_bad_field.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_bad_field.jsonnet.golden
@@ -1,2 +1,3 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, got "f"
-    object_comp_bad_field.jsonnet:1:9
\ No newline at end of file
+{
+    "x": 42
+}
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_bad_field2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_bad_field2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_bad_field2.jsonnet.golden
@@ -1,2 +1,3 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, got "f"
-    object_comp_bad_field2.jsonnet:1:11
\ No newline at end of file
+{
+    "x": 42
+}
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_duplicate.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_duplicate.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_duplicate.jsonnet.golden
@@ -1,2 +1,2 @@
 duplicate field name: x
-    object_comp_duplicate.jsonnet:1:8-10: field <x> initializtion
\ No newline at end of file
+    object_comp_duplicate.jsonnet:1:3-7: field <x> initializtion
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_err_elem.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_err_elem.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_err_elem.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: xxx
-    object_comp_err_elem.jsonnet:1:11-23: error statement
+    object_comp_err_elem.jsonnet:1:11-17: error statement
     field <x> evaluation
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_err_index.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_err_index.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_err_index.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: xxx
-    object_comp_err_index.jsonnet:1:4-16: error statement
-    object_comp_err_index.jsonnet:1:4-16: evaluating field name
\ No newline at end of file
+    object_comp_err_index.jsonnet:1:4-10: error statement
+    object_comp_err_index.jsonnet:1:3-17: evaluating field name
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_illegal.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_illegal.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_illegal.jsonnet.golden
@@ -1,2 +1,2 @@
-syntax error: expected one of "(", ".", "?", "[", "{", "}", <binary op>, got "f"
-    object_comp_illegal.jsonnet:1:15
\ No newline at end of file
+syntax error: expected one of "(", ".", "?", "[", "{", <binary op>, got "}"
+    object_comp_illegal.jsonnet:1:34
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_comp_int_index.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_comp_int_index.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_comp_int_index.jsonnet.golden
@@ -1,2 +1,2 @@
 type error: expected string, got number
-    object_comp_int_index.jsonnet:1:4-6: evaluating field name
\ No newline at end of file
+    object_comp_int_index.jsonnet:1:3-7: evaluating field name
\ No newline at end of file
modifiedtests/go_testdata_golden_override/object_invariant13.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/object_invariant13.jsonnet.golden
+++ b/tests/go_testdata_golden_override/object_invariant13.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: x
-    object_invariant13.jsonnet:1:10-20: error statement
+    object_invariant13.jsonnet:1:10-16: error statement
     object_invariant13.jsonnet:1:10-20: assertion condition
\ No newline at end of file
modifiedtests/go_testdata_golden_override/optional_args11.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/optional_args11.jsonnet.golden
+++ b/tests/go_testdata_golden_override/optional_args11.jsonnet.golden
@@ -1,2 +1,2 @@
 argument x is already bound
-    optional_args11.jsonnet:1:1-31: function <anonymous> call
\ No newline at end of file
+    optional_args11.jsonnet:1:20-31: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/optional_args13.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/optional_args13.jsonnet.golden
+++ b/tests/go_testdata_golden_override/optional_args13.jsonnet.golden
@@ -1,3 +1,3 @@
 function argument is not passed: y
 Function has the following signature: (x, y)
-    optional_args13.jsonnet:1:1-27: function <anonymous> call
\ No newline at end of file
+    optional_args13.jsonnet:1:20-27: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/optional_args8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/optional_args8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/optional_args8.jsonnet.golden
@@ -1,2 +1,2 @@
 parameter y is not defined
-    optional_args8.jsonnet:2:1-11: function <foo> call
\ No newline at end of file
+    optional_args8.jsonnet:2:4-11: function <foo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/optional_args9.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/optional_args9.jsonnet.golden
+++ b/tests/go_testdata_golden_override/optional_args9.jsonnet.golden
@@ -1,2 +1,2 @@
 argument x is already bound
-    optional_args9.jsonnet:1:1-27: function <anonymous> call
\ No newline at end of file
+    optional_args9.jsonnet:1:16-27: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/or4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/or4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/or4.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: xxx
-    or4.jsonnet:1:10-22: error statement
\ No newline at end of file
+    or4.jsonnet:1:10-16: error statement
\ No newline at end of file
modifiedtests/go_testdata_golden_override/pow4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/pow4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/pow4.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    pow4.jsonnet:1:1-18: function <builtin_pow> call
\ No newline at end of file
+    pow4.jsonnet:1:8-18: function <builtin_pow> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/pow7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/pow7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/pow7.jsonnet.golden
@@ -1,2 +1,2 @@
 convert num value: non-finite
-    pow7.jsonnet:2:1-24: function <builtin_pow> call
\ No newline at end of file
+    pow7.jsonnet:2:8-24: function <builtin_pow> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/pow8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/pow8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/pow8.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected number, got string
     argument <x> evaluation
-    pow8.jsonnet:1:1-20: function <builtin_pow> call
\ No newline at end of file
+    pow8.jsonnet:1:8-20: function <builtin_pow> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/pow9.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/pow9.jsonnet.golden
+++ b/tests/go_testdata_golden_override/pow9.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected number, got string
     argument <n> evaluation
-    pow9.jsonnet:1:1-20: function <builtin_pow> call
\ No newline at end of file
+    pow9.jsonnet:1:8-20: function <builtin_pow> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/recursive_thunk.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/recursive_thunk.jsonnet.golden
+++ b/tests/go_testdata_golden_override/recursive_thunk.jsonnet.golden
@@ -1,10 +1,10 @@
 runtime error: xxx
-    recursive_thunk.jsonnet:1:35-47: error statement
-    recursive_thunk.jsonnet:2:16-39: function <bar> call
-    recursive_thunk.jsonnet:2:20-31: function <foo> call
+    recursive_thunk.jsonnet:1:35-41: error statement
+    recursive_thunk.jsonnet:2:19-39: function <bar> call
+    recursive_thunk.jsonnet:2:23-31: function <foo> call
     recursive_thunk.jsonnet:1:52-55: local <th> access
-    recursive_thunk.jsonnet:2:16-39: function <bar> call
-    recursive_thunk.jsonnet:2:20-31: function <foo> call
+    recursive_thunk.jsonnet:2:19-39: function <bar> call
+    recursive_thunk.jsonnet:2:23-31: function <foo> call
     recursive_thunk.jsonnet:1:52-55: local <th> access
-    recursive_thunk.jsonnet:2:16-39: function <bar> call
-    recursive_thunk.jsonnet:3:1-8:   function <foo> call
\ No newline at end of file
+    recursive_thunk.jsonnet:2:19-39: function <bar> call
+    recursive_thunk.jsonnet:3:4-8:   function <foo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.codepoint3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.codepoint3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.codepoint3.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected char, got string
     argument <str> evaluation
-    std.codepoint3.jsonnet:1:1-21: function <builtin_codepoint> call
\ No newline at end of file
+    std.codepoint3.jsonnet:1:14-21: function <builtin_codepoint> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.codepoint6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.codepoint6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.codepoint6.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected char, got string
     argument <str> evaluation
-    std.codepoint6.jsonnet:1:1-19: function <builtin_codepoint> call
\ No newline at end of file
+    std.codepoint6.jsonnet:1:14-19: function <builtin_codepoint> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.codepoint8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.codepoint8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.codepoint8.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected char, got number
     argument <str> evaluation
-    std.codepoint8.jsonnet:1:1-19: function <builtin_codepoint> call
\ No newline at end of file
+    std.codepoint8.jsonnet:1:14-19: function <builtin_codepoint> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter2.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: x
-    std.filter2.jsonnet:1:12-22: error statement
+    std.filter2.jsonnet:1:12-18: error statement
     argument <func> evaluation
-    std.filter2.jsonnet:1:1-27:  function <builtin_filter> call
\ No newline at end of file
+    std.filter2.jsonnet:1:11-27: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter4.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected function, got number
     argument <func> evaluation
-    std.filter4.jsonnet:1:1-20: function <builtin_filter> call
\ No newline at end of file
+    std.filter4.jsonnet:1:11-20: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter5.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected array, got number
     argument <arr> evaluation
-    std.filter5.jsonnet:1:1-32: function <builtin_filter> call
\ No newline at end of file
+    std.filter5.jsonnet:1:11-32: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter6.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected function, got number
     argument <func> evaluation
-    std.filter6.jsonnet:1:1-22: function <builtin_filter> call
\ No newline at end of file
+    std.filter6.jsonnet:1:11-22: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter8.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected function, got array
     argument <func> evaluation
-    std.filter8.jsonnet:1:1-37: function <builtin_filter> call
\ No newline at end of file
+    std.filter8.jsonnet:1:11-37: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.filter_swapped_args.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.filter_swapped_args.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.filter_swapped_args.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected function, got array
     argument <func> evaluation
-    std.filter_swapped_args.jsonnet:1:1-39: function <builtin_filter> call
\ No newline at end of file
+    std.filter_swapped_args.jsonnet:1:11-39: function <builtin_filter> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.flatmap5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.flatmap5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.flatmap5.jsonnet.golden
@@ -1,5 +1,5 @@
 runtime error: a
-    std.flatmap5.jsonnet:1:21-29: error statement
-    std.flatmap5.jsonnet:2:10-49: function <builtin_flatmap> call
+    std.flatmap5.jsonnet:1:21-27: error statement
+    std.flatmap5.jsonnet:2:21-49: function <builtin_flatmap> call
     argument <x> evaluation
-    std.flatmap5.jsonnet:2:1-50:  function <builtin_type> call
\ No newline at end of file
+    std.flatmap5.jsonnet:2:9-50:  function <builtin_type> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.join7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.join7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.join7.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: in std.join all items should be strings
-    std.join7.jsonnet:1:1-28: function <builtin_join> call
\ No newline at end of file
+    std.join7.jsonnet:1:9-28: function <builtin_join> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.join8.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.join8.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.join8.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: in std.join all items should be arrays
-    std.join8.jsonnet:1:1-34: function <builtin_join> call
\ No newline at end of file
+    std.join8.jsonnet:1:9-34: function <builtin_join> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.makeArrayNamed3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.makeArrayNamed3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.makeArrayNamed3.jsonnet.golden
@@ -1,2 +1,2 @@
 parameter blahblah is not defined
-    std.makeArrayNamed3.jsonnet:1:1-55: function <builtin_make_array> call
\ No newline at end of file
+    std.makeArrayNamed3.jsonnet:1:14-55: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.makeArray_bad.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.makeArray_bad.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.makeArray_bad.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected BoundedNumber<0, 2147483647>, got string
     argument <sz> evaluation
-    std.makeArray_bad.jsonnet:1:1-37: function <builtin_make_array> call
\ No newline at end of file
+    std.makeArray_bad.jsonnet:1:14-37: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.makeArray_bad2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.makeArray_bad2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.makeArray_bad2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected function, got string
     argument <func> evaluation
-    std.makeArray_bad2.jsonnet:1:1-26: function <builtin_make_array> call
\ No newline at end of file
+    std.makeArray_bad2.jsonnet:1:14-26: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.makeArray_noninteger.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.makeArray_noninteger.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.makeArray_noninteger.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: cannot convert number with fractional part to i32
     argument <sz> evaluation
-    std.makeArray_noninteger.jsonnet:1:1-35: function <builtin_make_array> call
\ No newline at end of file
+    std.makeArray_noninteger.jsonnet:1:14-35: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.makeArray_noninteger_big.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.makeArray_noninteger_big.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.makeArray_noninteger_big.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: number out of bounds: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 not in 0..2147483647
     argument <sz> evaluation
-    std.makeArray_noninteger_big.jsonnet:1:1-37: function <builtin_make_array> call
\ No newline at end of file
+    std.makeArray_noninteger_big.jsonnet:1:14-37: function <builtin_make_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.manifestYamlDoc_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.manifestYamlDoc_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.manifestYamlDoc_error.jsonnet.golden
@@ -1,5 +1,5 @@
 runtime error: foo
-    std.manifestYamlDoc_error.jsonnet:1:31-43: error statement
+    std.manifestYamlDoc_error.jsonnet:1:31-37: error statement
     field <y> evaluation
     field <x> manifestification
-    std.manifestYamlDoc_error.jsonnet:1:1-48:  function <builtin_manifest_yaml_doc> call
\ No newline at end of file
+    std.manifestYamlDoc_error.jsonnet:1:20-48: function <builtin_manifest_yaml_doc> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.maxArrayOnEmpty.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.maxArrayOnEmpty.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.maxArrayOnEmpty.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: expected non-empty array
-    std.maxArrayOnEmpty.jsonnet:1:1-18: function <builtin_max_array> call
\ No newline at end of file
+    std.maxArrayOnEmpty.jsonnet:1:13-18: function <builtin_max_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.md5_6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.md5_6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.md5_6.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected string, got number
     argument <s> evaluation
-    std.md5_6.jsonnet:1:1-13: function <builtin_md5> call
\ No newline at end of file
+    std.md5_6.jsonnet:1:8-13: function <builtin_md5> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.minArrayOnEmpty.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.minArrayOnEmpty.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.minArrayOnEmpty.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: expected non-empty array
-    std.minArrayOnEmpty.jsonnet:1:1-18: function <builtin_min_array> call
\ No newline at end of file
+    std.minArrayOnEmpty.jsonnet:1:13-18: function <builtin_min_array> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.modulo2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.modulo2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.modulo2.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected number, got string
     argument <x> evaluation
-    std.modulo2.jsonnet:1:1-23: function <builtin_modulo> call
\ No newline at end of file
+    std.modulo2.jsonnet:1:11-23: function <builtin_modulo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.modulo3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.modulo3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.modulo3.jsonnet.golden
@@ -1,3 +1,3 @@
 type error: expected number, got string
     argument <x> evaluation
-    std.modulo3.jsonnet:1:1-23: function <builtin_modulo> call
\ No newline at end of file
+    std.modulo3.jsonnet:1:11-23: function <builtin_modulo> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.primitiveEquals10.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.primitiveEquals10.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.primitiveEquals10.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: x
-    std.primitiveEquals10.jsonnet:1:21-31: error statement
+    std.primitiveEquals10.jsonnet:1:21-27: error statement
     argument <x> evaluation
-    std.primitiveEquals10.jsonnet:1:1-36:  function <builtin_primitive_equals> call
\ No newline at end of file
+    std.primitiveEquals10.jsonnet:1:20-36: function <builtin_primitive_equals> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.primitiveEquals13.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.primitiveEquals13.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.primitiveEquals13.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: primitiveEquals operates on primitive types, got array
-    std.primitiveEquals13.jsonnet:1:1-29: function <builtin_primitive_equals> call
\ No newline at end of file
+    std.primitiveEquals13.jsonnet:1:20-29: function <builtin_primitive_equals> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.primitiveEquals6.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.primitiveEquals6.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.primitiveEquals6.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: primitiveEquals operates on primitive types, got object
-    std.primitiveEquals6.jsonnet:1:1-29: function <builtin_primitive_equals> call
\ No newline at end of file
+    std.primitiveEquals6.jsonnet:1:20-29: function <builtin_primitive_equals> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.primitiveEquals7.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.primitiveEquals7.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.primitiveEquals7.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: cannot test equality of functions
-    std.primitiveEquals7.jsonnet:1:1-51: function <builtin_primitive_equals> call
\ No newline at end of file
+    std.primitiveEquals7.jsonnet:1:20-51: function <builtin_primitive_equals> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.primitiveEquals9.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.primitiveEquals9.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.primitiveEquals9.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: x
-    std.primitiveEquals9.jsonnet:1:25-35: error statement
+    std.primitiveEquals9.jsonnet:1:25-31: error statement
     argument <y> evaluation
-    std.primitiveEquals9.jsonnet:1:1-36:  function <builtin_primitive_equals> call
\ No newline at end of file
+    std.primitiveEquals9.jsonnet:1:20-36: function <builtin_primitive_equals> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.sort3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.sort3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.sort3.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: foo
-    std.sort3.jsonnet:1:16-28: error statement
-    std.sort3.jsonnet:1:1-30:  function <builtin_sort> call
\ No newline at end of file
+    std.sort3.jsonnet:1:16-22: error statement
+    std.sort3.jsonnet:1:9-30:  function <builtin_sort> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.sort4.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.sort4.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.sort4.jsonnet.golden
@@ -1,2 +1,2 @@
 binary operation array < number is not implemented
-    std.sort4.jsonnet:1:1-30: function <builtin_sort> call
\ No newline at end of file
+    std.sort4.jsonnet:1:9-30: function <builtin_sort> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/std.toString5.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/std.toString5.jsonnet.golden
+++ b/tests/go_testdata_golden_override/std.toString5.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: x
-    std.toString5.jsonnet:1:14-24: error statement
+    std.toString5.jsonnet:1:14-20: error statement
     argument <a> evaluation
-    std.toString5.jsonnet:1:1-25:  function <builtin_to_string> call
\ No newline at end of file
+    std.toString5.jsonnet:1:13-25: function <builtin_to_string> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/strReplace3.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/strReplace3.jsonnet.golden
+++ b/tests/go_testdata_golden_override/strReplace3.jsonnet.golden
@@ -1,2 +1,2 @@
 runtime error: 'from' string must not be zero length
-    strReplace3.jsonnet:1:1-36: function <builtin_str_replace> call
\ No newline at end of file
+    strReplace3.jsonnet:1:15-36: function <builtin_str_replace> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/tailstrict2.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/tailstrict2.jsonnet.golden
+++ b/tests/go_testdata_golden_override/tailstrict2.jsonnet.golden
@@ -1,3 +1,3 @@
 runtime error: xxx
-    tailstrict2.jsonnet:1:13-21: error statement
-    tailstrict2.jsonnet:2:14-19: function <e> call
\ No newline at end of file
+    tailstrict2.jsonnet:1:13-19: error statement
+    tailstrict2.jsonnet:2:15-19: function <e> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/too_many_arguments.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/too_many_arguments.jsonnet.golden
+++ b/tests/go_testdata_golden_override/too_many_arguments.jsonnet.golden
@@ -1,3 +1,3 @@
 too many args, function has 3
 Function has the following signature: (x, y, z)
-    too_many_arguments.jsonnet:1:1-36: function <anonymous> call
\ No newline at end of file
+    too_many_arguments.jsonnet:1:23-36: function <anonymous> call
\ No newline at end of file
modifiedtests/go_testdata_golden_override/type_error.jsonnet.goldendiffbeforeafterboth
--- a/tests/go_testdata_golden_override/type_error.jsonnet.golden
+++ b/tests/go_testdata_golden_override/type_error.jsonnet.golden
@@ -1,4 +1,4 @@
 runtime error: xxx
-    type_error.jsonnet:1:10-22: error statement
+    type_error.jsonnet:1:10-16: error statement
     argument <x> evaluation
-    type_error.jsonnet:1:1-23:  function <builtin_type> call
\ No newline at end of file
+    type_error.jsonnet:1:9-23:  function <builtin_type> call
\ No newline at end of file
modifiedtests/tests/snapshots/golden__golden@issue187.rev.jsonnet.snapdiffbeforeafterboth
--- a/tests/tests/snapshots/golden__golden@issue187.rev.jsonnet.snap
+++ b/tests/tests/snapshots/golden__golden@issue187.rev.jsonnet.snap
@@ -4,4 +4,4 @@
 input_file: tests/golden/issue187.rev.jsonnet
 ---
 runtime error: bad utf8
-    issue187.rev.jsonnet:1:1-92: function <builtin_decode_utf8> call
+    issue187.rev.jsonnet:1:15-92: function <builtin_decode_utf8> call
modifiedtests/tests/snapshots/golden__golden@issue23.jsonnet.snapdiffbeforeafterboth
--- a/tests/tests/snapshots/golden__golden@issue23.jsonnet.snap
+++ b/tests/tests/snapshots/golden__golden@issue23.jsonnet.snap
@@ -4,4 +4,4 @@
 input_file: tests/golden/issue23.jsonnet
 ---
 infinite recursion detected
-    issue23.jsonnet:1:1-26: import "issue23.jsonnet"
+    issue23.jsonnet:1:1-8: import "issue23.jsonnet"
modifiedtests/tests/snapshots/golden__golden@issue40.jsonnet.snapdiffbeforeafterboth
--- a/tests/tests/snapshots/golden__golden@issue40.jsonnet.snap
+++ b/tests/tests/snapshots/golden__golden@issue40.jsonnet.snap
@@ -5,4 +5,4 @@
 ---
 assert failed: is number
     issue40.jsonnet:6:10-31: assertion failure
-    issue40.jsonnet:9:1-32:  function <builtin_manifest_json_ex> call
+    issue40.jsonnet:9:19-32: function <builtin_manifest_json_ex> call
modifiedtests/tests/snapshots/golden__golden@test_assertThrow.jsonnet.snapdiffbeforeafterboth
--- a/tests/tests/snapshots/golden__golden@test_assertThrow.jsonnet.snap
+++ b/tests/tests/snapshots/golden__golden@test_assertThrow.jsonnet.snap
@@ -4,4 +4,4 @@
 input_file: tests/golden/test_assertThrow.jsonnet
 ---
 runtime error: expected argument to throw on evaluation, but it returned instead
-    test_assertThrow.jsonnet:2:1-26: function <assert_throw> call
+    test_assertThrow.jsonnet:2:17-26: function <assert_throw> call