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

difftreelog

refactor split literals and trivials

nyvtyzzzYaroslav Bolyukin2026-05-08parent: #d543e94.patch.diff
in: master

39 files changed

modifiedcrates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/lib.rs
+++ b/crates/jrsonnet-ir-parser/src/lib.rs
@@ -1,9 +1,9 @@
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::{
 	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,
-	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse, IfSpecData,
-	ImportKind, IndexPart, LiteralType, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
-	SliceDesc, Source, Span, Spanned, UnaryOpType, Visibility, unescape,
+	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,
+	IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
+	SliceDesc, Source, Span, Spanned, TrivialVal, UnaryOpType, Visibility, unescape,
 };
 use jrsonnet_lexer::{Lexeme, Lexer, Span as LexSpan, SyntaxKind, T, collect_lexed_str_block};
 
@@ -247,19 +247,6 @@
 	Ok(IStr::from(text))
 }
 
-fn literal(p: &mut Parser<'_>) -> Option<(Span, 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,
-	};
-	Some((p.eat_any_spanned(), t))
-}
-
 fn assert_stmt(p: &mut Parser<'_>) -> Result<AssertStmt> {
 	p.eat(T![assert])?;
 	let assertion = spanned(p, expr)?;
@@ -688,18 +675,30 @@
 
 #[allow(clippy::too_many_lines)]
 fn expr_basic(p: &mut Parser<'_>) -> Result<Expr> {
-	if let Some((span, lit)) = literal(p) {
-		return Ok(Expr::Literal(span, lit));
-	}
+	match p.peek() {
+		T![self] => Ok(Expr::Identity(p.eat_any_spanned(), IdentityKind::This)),
+		T![super] => Ok(Expr::Identity(p.eat_any_spanned(), IdentityKind::Super)),
+		T!['$'] => Ok(Expr::Identity(p.eat_any_spanned(), IdentityKind::Dollar)),
+		T![null] => {
+			p.eat_any();
+			Ok(Expr::Trivial(TrivialVal::Null))
+		}
+		T![true] => {
+			p.eat_any();
+			Ok(Expr::Trivial(TrivialVal::Bool(true)))
+		}
+		T![false] => {
+			p.eat_any();
+			Ok(Expr::Trivial(TrivialVal::Bool(false)))
+		}
 
-	match p.peek() {
 		SyntaxKind::STRING_DOUBLE
 		| SyntaxKind::STRING_SINGLE
 		| SyntaxKind::STRING_DOUBLE_VERBATIM
 		| SyntaxKind::STRING_SINGLE_VERBATIM
-		| SyntaxKind::STRING_BLOCK => Ok(Expr::Str(parse_string_content(p)?)),
+		| SyntaxKind::STRING_BLOCK => Ok(Expr::Trivial(TrivialVal::Str(parse_string_content(p)?))),
 
-		SyntaxKind::FLOAT => Ok(Expr::Num(parse_number(p)?)),
+		SyntaxKind::FLOAT => Ok(Expr::Trivial(TrivialVal::Num(parse_number(p)?))),
 
 		T!['('] => {
 			p.eat(T!['('])?;
@@ -832,7 +831,7 @@
 	if parts.is_empty() {
 		return;
 	}
-	let old = std::mem::replace(e, Expr::Str(IStr::empty()));
+	let old = std::mem::replace(e, Expr::Trivial(TrivialVal::Null));
 	*e = Expr::Index {
 		indexable: Box::new(old),
 		parts: std::mem::take(parts),
@@ -863,7 +862,7 @@
 					});
 				} else {
 					// ?.field
-					let id_spanned = spanned(p, |p| Ok(Expr::Str(ident(p)?)))?;
+					let id_spanned = spanned(p, |p| Ok(Expr::Trivial(TrivialVal::Str(ident(p)?))))?;
 					parts.push(IndexPart {
 						span: id_spanned.span,
 						value: id_spanned.value,
@@ -878,7 +877,7 @@
 
 		if p.at(T![.]) {
 			p.eat(T![.])?;
-			let id_spanned = spanned(p, |p| Ok(Expr::Str(ident(p)?)))?;
+			let id_spanned = spanned(p, |p| Ok(Expr::Trivial(TrivialVal::Str(ident(p)?))))?;
 			parts.push(IndexPart {
 				span: id_spanned.span,
 				value: id_spanned.value,
@@ -1058,7 +1057,10 @@
 pub fn string_to_expr(s: IStr, settings: &ParserSettings) -> Spanned<Expr> {
 	let len = u32::try_from(s.len()).expect("code size is limited by 4gb");
 
-	Spanned::new(Expr::Str(s), Span(settings.source.clone(), 0, len))
+	Spanned::new(
+		Expr::Trivial(TrivialVal::Str(s)),
+		Span(settings.source.clone(), 0, len),
+	)
 }
 
 #[cfg(test)]
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_math.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_math.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_math.snap
@@ -1,21 +1,28 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1094
 expression: "format!(\"{v:#?}\")"
 ---
 BinaryOp(
     BinaryOp {
-        lhs: Num(
-            2.0,
+        lhs: Trivial(
+            Num(
+                2.0,
+            ),
         ),
         op: Add,
         rhs: BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Mul,
-                rhs: Num(
-                    2.0,
+                rhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
             },
         ),
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snapdiffbeforeafterboth
before · crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
1---2source: crates/jrsonnet-ir-parser/src/lib.rs3expression: "format!(\"{v:#?}\")"4---5AssertExpr(6    AssertExpr {7        assert: AssertStmt {8            assertion: Index {9                indexable: Literal(10                    virtual:<test>:7-11,11                    True,12                ),13                parts: [14                    IndexPart {15                        span: virtual:<test>:12-17,16                        value: Literal(17                            virtual:<test>:12-17,18                            False,19                        ),20                    },21                ],22            } from virtual:<test>:7-18,23            message: Some(24                Literal(25                    virtual:<test>:21-26,26                    False,27                ),28            ),29        },30        rest: Literal(31            virtual:<test>:29-33,32            True,33        ),34    },35)
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__error_expr.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__error_expr.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__error_expr.snap
@@ -1,10 +1,13 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1161
 expression: "format!(\"{v:#?}\")"
 ---
 ErrorStmt(
     virtual:<test>:0-5,
-    Str(
-        "bad",
+    Trivial(
+        Str(
+            "bad",
+        ),
     ),
 )
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__function_and_call.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__function_and_call.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__function_and_call.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1118
 expression: "format!(\"{v:#?}\")"
 ---
 LocalExpr(
@@ -19,8 +20,10 @@
                             "y" from virtual:<test>:11-12,
                         ),
                         default: Some(
-                            Num(
-                                1.0,
+                            Trivial(
+                                Num(
+                                    1.0,
+                                ),
                             ),
                         ),
                     },
@@ -62,16 +65,20 @@
         ),
         ArgsDesc {
             unnamed: [
-                Num(
-                    2.0,
+                Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
             ],
             names: [
                 "y",
             ],
             values: [
-                Num(
-                    3.0,
+                Trivial(
+                    Num(
+                        3.0,
+                    ),
                 ),
             ],
         } from virtual:<test>:26-34,
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__if_then_else.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__if_then_else.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__if_then_else.snap
@@ -1,22 +1,28 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1124
 expression: "format!(\"{v:#?}\")"
 ---
 IfElse(
     IfElse {
         cond: IfSpecData {
             span: virtual:<test>:0-2,
-            cond: Literal(
-                virtual:<test>:3-7,
-                True,
+            cond: Trivial(
+                Bool(
+                    true,
+                ),
             ),
         },
-        cond_then: Num(
-            1.0,
+        cond_then: Trivial(
+            Num(
+                1.0,
+            ),
         ),
         cond_else: Some(
-            Num(
-                2.0,
+            Trivial(
+                Num(
+                    2.0,
+                ),
             ),
         ),
     },
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__imports.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__imports.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__imports.snap
@@ -1,25 +1,32 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1130
 expression: "format!(\"{v:#?}\")"
 ---
 Arr(
     [
         Import(
             Normal from virtual:<test>:1-7,
-            Str(
-                "a",
+            Trivial(
+                Str(
+                    "a",
+                ),
             ),
         ),
         Import(
             Str from virtual:<test>:13-22,
-            Str(
-                "b",
+            Trivial(
+                Str(
+                    "b",
+                ),
             ),
         ),
         Import(
             Bin from virtual:<test>:28-37,
-            Str(
-                "c",
+            Trivial(
+                Str(
+                    "c",
+                ),
             ),
         ),
     ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__index_and_suffix.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__index_and_suffix.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__index_and_suffix.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1143
 expression: "format!(\"{v:#?}\")"
 ---
 Index {
@@ -11,16 +12,20 @@
             parts: [
                 IndexPart {
                     span: virtual:<test>:4-8,
-                    value: Str(
-                        "test",
+                    value: Trivial(
+                        Str(
+                            "test",
+                        ),
                     ),
                 },
             ],
         },
         ArgsDesc {
             unnamed: [
-                Num(
-                    2.0,
+                Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
             ],
             names: [],
@@ -31,14 +36,18 @@
     parts: [
         IndexPart {
             span: virtual:<test>:12-17,
-            value: Str(
-                "field",
+            value: Trivial(
+                Str(
+                    "field",
+                ),
             ),
         },
         IndexPart {
             span: virtual:<test>:18-19,
-            value: Num(
-                0.0,
+            value: Trivial(
+                Num(
+                    0.0,
+                ),
             ),
         },
     ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__literals.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__literals.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__literals.snap
@@ -1,30 +1,32 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1088
 expression: "format!(\"{v:#?}\")"
 ---
 Arr(
     [
-        Literal(
-            virtual:<test>:1-5,
+        Trivial(
             Null,
         ),
-        Literal(
-            virtual:<test>:7-11,
-            True,
+        Trivial(
+            Bool(
+                true,
+            ),
         ),
-        Literal(
-            virtual:<test>:13-18,
-            False,
+        Trivial(
+            Bool(
+                false,
+            ),
         ),
-        Literal(
+        Identity(
             virtual:<test>:20-24,
             This,
         ),
-        Literal(
+        Identity(
             virtual:<test>:26-31,
             Super,
         ),
-        Literal(
+        Identity(
             virtual:<test>:33-34,
             Dollar,
         ),
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__obj_extend.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__obj_extend.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__obj_extend.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1149
 expression: "format!(\"{v:#?}\")"
 ---
 ObjExtend(
@@ -24,8 +25,10 @@
                     plus: false,
                     params: None,
                     visibility: Normal,
-                    value: Num(
-                        1.0,
+                    value: Trivial(
+                        Num(
+                            1.0,
+                        ),
                     ),
                 },
             ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__object.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__object.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__object.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1112
 expression: "format!(\"{v:#?}\")"
 ---
 Obj(
@@ -15,8 +16,10 @@
                     plus: false,
                     params: None,
                     visibility: Normal,
-                    value: Num(
-                        1.0,
+                    value: Trivial(
+                        Num(
+                            1.0,
+                        ),
                     ),
                 },
                 FieldMember {
@@ -26,8 +29,10 @@
                     plus: false,
                     params: None,
                     visibility: Hidden,
-                    value: Num(
-                        2.0,
+                    value: Trivial(
+                        Num(
+                            2.0,
+                        ),
                     ),
                 },
                 FieldMember {
@@ -37,8 +42,10 @@
                     plus: false,
                     params: None,
                     visibility: Unhide,
-                    value: Num(
-                        3.0,
+                    value: Trivial(
+                        Num(
+                            3.0,
+                        ),
                     ),
                 },
             ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@array_comp.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@array_comp.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@array_comp.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/array_comp.jsonnet
 ---
@@ -14,8 +15,10 @@
                     parts: [
                         IndexPart {
                             span: virtual:<test>:7-15,
-                            value: Str(
-                                "deepJoin",
+                            value: Trivial(
+                                Str(
+                                    "deepJoin",
+                                ),
                             ),
                         },
                     ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@basic_math.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@basic_math.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@basic_math.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/basic_math.jsonnet
 ---
@@ -7,18 +8,24 @@
     [
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -26,18 +33,24 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -47,24 +60,32 @@
             BinaryOp {
                 lhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Add,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -72,24 +93,32 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Add,
                         rhs: BinaryOp(
                             BinaryOp {
-                                lhs: Num(
-                                    2.0,
+                                lhs: Trivial(
+                                    Num(
+                                        2.0,
+                                    ),
                                 ),
                                 op: Mul,
-                                rhs: Num(
-                                    2.0,
+                                rhs: Trivial(
+                                    Num(
+                                        2.0,
+                                    ),
                                 ),
                             },
                         ),
@@ -99,18 +128,24 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            3.0,
+                        lhs: Trivial(
+                            Num(
+                                3.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            4.0,
+                        rhs: Trivial(
+                            Num(
+                                4.0,
+                            ),
                         ),
                     },
                 ),
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@comment_eof.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@comment_eof.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@comment_eof.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnet
 ---
@@ -16,8 +17,10 @@
                     plus: false,
                     params: None,
                     visibility: Normal,
-                    value: Num(
-                        1.0,
+                    value: Trivial(
+                        Num(
+                            1.0,
+                        ),
                     ),
                 },
             ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@default_nondefault.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@default_nondefault.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@default_nondefault.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnet
 ---
@@ -14,8 +15,10 @@
                             "foo" from virtual:<test>:8-11,
                         ),
                         default: Some(
-                            Str(
-                                "foo",
+                            Trivial(
+                                Str(
+                                    "foo",
+                                ),
                             ),
                         ),
                     },
@@ -44,14 +47,12 @@
                 ),
                 binds_len: 2,
             },
-            value: Literal(
-                virtual:<test>:28-32,
+            value: Trivial(
                 Null,
             ),
         },
     ],
-    Literal(
-        virtual:<test>:34-38,
+    Trivial(
         Null,
     ),
 )
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@imports.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@imports.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@imports.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/imports.jsonnet
 ---
@@ -7,20 +8,26 @@
     [
         Import(
             Normal from virtual:<test>:2-8,
-            Str(
-                "hello",
+            Trivial(
+                Str(
+                    "hello",
+                ),
             ),
         ),
         Import(
             Str from virtual:<test>:18-27,
-            Str(
-                "garnish.txt",
+            Trivial(
+                Str(
+                    "garnish.txt",
+                ),
             ),
         ),
         Import(
             Bin from virtual:<test>:43-52,
-            Str(
-                "garnish.bin",
+            Trivial(
+                Str(
+                    "garnish.bin",
+                ),
             ),
         ),
     ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@multiline.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@multiline.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@multiline.jsonnet.snap
@@ -1,21 +1,30 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/multiline.jsonnet
 ---
 Arr(
     [
-        Str(
-            "Hello world!\na\n",
+        Trivial(
+            Str(
+                "Hello world!\na\n",
+            ),
         ),
-        Str(
-            "Hello world!\na\n",
+        Trivial(
+            Str(
+                "Hello world!\na\n",
+            ),
         ),
-        Str(
-            "Hello world!\n\ta\n",
+        Trivial(
+            Str(
+                "Hello world!\n\ta\n",
+            ),
         ),
-        Str(
-            "Hello world!\n a\n",
+        Trivial(
+            Str(
+                "Hello world!\n a\n",
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@reserved.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@reserved.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@reserved.jsonnet.snap
@@ -1,12 +1,12 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/reserved.jsonnet
 ---
 Arr(
     [
-        Literal(
-            virtual:<test>:2-6,
+        Trivial(
             Null,
         ),
         Var(
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@slice.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@slice.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@slice.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/slice.jsonnet
 ---
@@ -12,8 +13,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:4-5,
                     ),
                     end: None,
@@ -28,8 +31,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:11-12,
                     ),
                     end: None,
@@ -45,8 +50,10 @@
                 slice: SliceDesc {
                     start: None,
                     end: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:20-21,
                     ),
                     step: None,
@@ -62,8 +69,10 @@
                     start: None,
                     end: None,
                     step: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:29-30,
                     ),
                 },
@@ -83,8 +92,10 @@
                                     "len" from virtual:<test>:38-41,
                                 ),
                                 op: Sub,
-                                rhs: Num(
-                                    1.0,
+                                rhs: Trivial(
+                                    Num(
+                                        1.0,
+                                    ),
                                 ),
                             },
                         ) from virtual:<test>:38-45,
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@string_escaping.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@string_escaping.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@string_escaping.jsonnet.snap
@@ -1,24 +1,35 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnet
 ---
 Arr(
     [
-        Str(
-            "Hello, \"world\"!",
+        Trivial(
+            Str(
+                "Hello, \"world\"!",
+            ),
         ),
-        Str(
-            "Hello 'world'!",
+        Trivial(
+            Str(
+                "Hello 'world'!",
+            ),
         ),
-        Str(
-            "\\\\",
+        Trivial(
+            Str(
+                "\\\\",
+            ),
         ),
-        Str(
-            "Hello\nWorld",
+        Trivial(
+            Str(
+                "Hello\nWorld",
+            ),
         ),
-        Str(
-            "Hello\\n\"World\"",
+        Trivial(
+            Str(
+                "Hello\\n\"World\"",
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@subexp.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@subexp.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@subexp.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/subexp.jsonnet
 ---
@@ -22,8 +23,10 @@
                             into: Full(
                                 "x" from virtual:<test>:11-12,
                             ),
-                            value: Num(
-                                1.0,
+                            value: Trivial(
+                                Num(
+                                    1.0,
+                                ),
                             ),
                         },
                     ],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@suffix.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@suffix.jsonnet.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__peg_snapshots@suffix.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1184
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/suffix.jsonnet
 ---
@@ -12,8 +13,10 @@
             parts: [
                 IndexPart {
                     span: virtual:<test>:6-10,
-                    value: Str(
-                        "test",
+                    value: Trivial(
+                        Str(
+                            "test",
+                        ),
                     ),
                 },
             ],
@@ -24,8 +27,10 @@
             ),
             ArgsDesc {
                 unnamed: [
-                    Num(
-                        2.0,
+                    Trivial(
+                        Num(
+                            2.0,
+                        ),
                     ),
                 ],
                 names: [],
@@ -41,16 +46,20 @@
                 parts: [
                     IndexPart {
                         span: virtual:<test>:24-28,
-                        value: Str(
-                            "test",
+                        value: Trivial(
+                            Str(
+                                "test",
+                            ),
                         ),
                     },
                 ],
             },
             ArgsDesc {
                 unnamed: [
-                    Num(
-                        2.0,
+                    Trivial(
+                        Num(
+                            2.0,
+                        ),
                     ),
                 ],
                 names: [],
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__slice.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__slice.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__slice.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1167
 expression: "format!(\"{v:#?}\")"
 ---
 Arr(
@@ -11,8 +12,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:3-4,
                     ),
                     end: None,
@@ -27,8 +30,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:10-11,
                     ),
                     end: None,
@@ -44,8 +49,10 @@
                 slice: SliceDesc {
                     start: None,
                     end: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:19-20,
                     ),
                     step: None,
@@ -61,8 +68,10 @@
                     start: None,
                     end: None,
                     step: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:28-29,
                     ),
                 },
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__strings.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__strings.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__strings.snap
@@ -1,20 +1,29 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1106
 expression: "format!(\"{v:#?}\")"
 ---
 Arr(
     [
-        Str(
-            "hello",
+        Trivial(
+            Str(
+                "hello",
+            ),
         ),
-        Str(
-            "world",
+        Trivial(
+            Str(
+                "world",
+            ),
         ),
-        Str(
-            "raw\"str",
+        Trivial(
+            Str(
+                "raw\"str",
+            ),
         ),
-        Str(
-            "raw'str",
+        Trivial(
+            Str(
+                "raw'str",
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__underscore_numbers.snapdiffbeforeafterboth
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__underscore_numbers.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__underscore_numbers.snap
@@ -1,17 +1,24 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1100
 expression: "format!(\"{v:#?}\")"
 ---
 Arr(
     [
-        Num(
-            1000.0,
+        Trivial(
+            Num(
+                1000.0,
+            ),
         ),
-        Num(
-            1000.0001,
+        Trivial(
+            Num(
+                1000.0001,
+            ),
         ),
-        Num(
-            100000000000.0,
+        Trivial(
+            Num(
+                100000000000.0,
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-ir/src/expr.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/expr.rs
+++ b/crates/jrsonnet-ir/src/expr.rs
@@ -31,6 +31,14 @@
 	Unhide,
 }
 
+#[derive(Debug, Clone, PartialEq, Acyclic)]
+pub enum TrivialVal {
+	Null,
+	Bool(bool),
+	Num(NumValue),
+	Str(IStr),
+}
+
 impl Visibility {
 	pub fn is_visible(&self) -> bool {
 		matches!(self, Self::Normal | Self::Unhide)
@@ -351,14 +359,12 @@
 	ObjComp(ObjComp),
 }
 
-#[derive(Debug, PartialEq, Eq, Clone, Copy, Acyclic)]
-pub enum LiteralType {
+/// Object identity reference: `self`, `super`, or `$`.#[derive(Debug, PartialEq, Eq, Clone, Copy, Acyclic)]
+#[derive(Debug, PartialEq, Acyclic)]
+pub enum IdentityKind {
 	This,
 	Super,
 	Dollar,
-	Null,
-	True,
-	False,
 }
 
 #[derive(Debug, PartialEq, Acyclic)]
@@ -404,12 +410,12 @@
 /// Syntax base
 #[derive(Debug, PartialEq, Acyclic)]
 pub enum Expr {
-	Literal(Span, LiteralType),
+	/// Object-identity reference: `self`, `super`, `$`.
+	Identity(Span, IdentityKind),
+
+	/// Trivial value literal
+	Trivial(TrivialVal),
 
-	/// String value: "hello"
-	Str(IStr),
-	/// Number: 1, 2.0, 2e+20
-	Num(NumValue),
 	/// Variable name: test
 	Var(Spanned<IStr>),
 
modifiedcrates/jrsonnet-ir/src/visit.rsdiffbeforeafterboth
--- a/crates/jrsonnet-ir/src/visit.rs
+++ b/crates/jrsonnet-ir/src/visit.rs
@@ -5,7 +5,7 @@
 use crate::{
 	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, Expr, ExprParam,
 	ExprParams, FieldMember, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, IndexPart,
-	ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,
+	ObjBody, ObjComp, ObjMembers, Slice, SliceDesc, TrivialVal,
 };
 
 pub trait Visitor: Sized {
@@ -178,9 +178,8 @@
 }
 pub fn visit_expr<V: Visitor>(v: &mut V, e: &Expr) {
 	match e {
-		Expr::Literal(_span, _literal_type) => {}
-		Expr::Str(_istr) => {}
-		Expr::Num(_num) => {}
+		Expr::Identity(_span, _identity_kind) => {}
+		Expr::Trivial(_) => {}
 		Expr::Var(_spanned) => {}
 		Expr::Arr(exprs) => {
 			for e in &**exprs {
@@ -220,7 +219,7 @@
 		Expr::Import(kind, expr) => {
 			v.visit_expr(expr);
 
-			if let Expr::Str(expr) = &**expr {
+			if let Expr::Trivial(TrivialVal::Str(expr)) = &**expr {
 				v.visit_import(matches!(**kind, ImportKind::Normal), expr.clone());
 			}
 		}
modifiedcrates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/lib.rs
+++ b/crates/jrsonnet-peg-parser/src/lib.rs
@@ -1,9 +1,9 @@
 use jrsonnet_gcmodule::Acyclic;
 use jrsonnet_ir::{
 	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, DestructRest, Expr,
-	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse, IfSpecData,
-	ImportKind, IndexPart, LiteralType, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
-	SliceDesc, Source, Span, Spanned, Visibility, unescape,
+	ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,
+	IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
+	SliceDesc, Source, Span, Spanned, TrivialVal, Visibility, unescape,
 };
 use peg::parser;
 
@@ -263,7 +263,7 @@
 		pub rule local_expr(s: &ParserSettings) -> Expr
 			= keyword("local") _ binds:bind(s) ** comma() (_ ",")? _ ";" _ expr:expr(s) { Expr::LocalExpr(binds, Box::new(expr)) }
 		pub rule string_expr(s: &ParserSettings) -> Expr
-			= s:string() {Expr::Str(s.into())}
+			= s:string() {Expr::Trivial(TrivialVal::Str(s.into()))}
 		pub rule obj_expr(s: &ParserSettings) -> Expr
 			= "{" _ body:objinside(s) _ "}" {Expr::Obj(body)}
 		pub rule array_expr(s: &ParserSettings) -> Expr
@@ -273,7 +273,7 @@
 				Expr::ArrComp(Box::new(expr), specs)
 			}
 		pub rule number_expr(s: &ParserSettings) -> Expr
-			= n:number() {? NumValue::new(n).map_or_else(|| Err("!!!numbers are finite"), |n| Ok(Expr::Num(n)))}
+			= n:number() {? NumValue::new(n).map_or_else(|| Err("!!!numbers are finite"), |n| Ok(Expr::Trivial(TrivialVal::Num(n))))}
 
 		rule spanned<T: Acyclic>(x: rule<T>, s: &ParserSettings) -> Spanned<T>
 			= a:position!() n:x() b:position!() { Spanned::new(n, Span(s.source.clone(), codeidx(a), codeidx(b))) }
@@ -281,7 +281,7 @@
 		pub rule var_expr(s: &ParserSettings) -> Expr
 			= n:spanned(<id()>, s) { Expr::Var(n) }
 		pub rule id_loc(s: &ParserSettings) -> Spanned<Expr>
-			= a:position!() n:id() b:position!() { Spanned::new(Expr::Str(n), Span(s.source.clone(), codeidx(a), codeidx(b))) }
+			= a:position!() n:id() b:position!() { Spanned::new(Expr::Trivial(TrivialVal::Str(n)), Span(s.source.clone(), codeidx(a), codeidx(b))) }
 		pub rule if_then_else_expr(s: &ParserSettings) -> Expr
 			= cond:ifspec(s) _ keyword("then") _ cond_then:expr(s) cond_else:(_ keyword("else") _ e:expr(s) {e})? {Expr::IfElse(Box::new(IfElse{
 				cond,
@@ -290,14 +290,14 @@
 			}))}
 
 		pub rule literal(s: &ParserSettings) -> Expr
-			= a:position!() v:(
-				keyword("null") {LiteralType::Null}
-				/ keyword("true") {LiteralType::True}
-				/ keyword("false") {LiteralType::False}
-				/ keyword("self") {LiteralType::This}
-				/ keyword("$") {LiteralType::Dollar}
-				/ keyword("super") {LiteralType::Super}
-			) b:position!() {Expr::Literal(Span(s.source.clone(), codeidx(a), codeidx(b)), v)}
+			= keyword("null") { Expr::Trivial(TrivialVal::Null) }
+			/ keyword("true") { Expr::Trivial(TrivialVal::Bool(true)) }
+			/ keyword("false") { Expr::Trivial(TrivialVal::Bool(false)) }
+			/ a:position!() v:(
+				keyword("self") {IdentityKind::This}
+				/ keyword("$") {IdentityKind::Dollar}
+				/ keyword("super") {IdentityKind::Super}
+			) b:position!() { Expr::Identity(Span(s.source.clone(), codeidx(a), codeidx(b)), v) }
 
 		rule import_kind() -> ImportKind
 			= keyword("importstr") { ImportKind::Str }
@@ -429,7 +429,7 @@
 pub fn string_to_expr(str: IStr, settings: &ParserSettings) -> Spanned<Expr> {
 	let len = str.len();
 	Spanned::new(
-		Expr::Str(str),
+		Expr::Trivial(TrivialVal::Str(str)),
 		Span(settings.source.clone(), 0, codeidx(len)),
 	)
 }
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@array_comp.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@array_comp.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@array_comp.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/array_comp.jsonnet
 ---
@@ -14,8 +15,10 @@
                     parts: [
                         IndexPart {
                             span: virtual:<test>:7-15,
-                            value: Str(
-                                "deepJoin",
+                            value: Trivial(
+                                Str(
+                                    "deepJoin",
+                                ),
                             ),
                         },
                     ],
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@basic_math.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@basic_math.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@basic_math.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/basic_math.jsonnet
 ---
@@ -7,18 +8,24 @@
     [
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -26,18 +33,24 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -47,24 +60,32 @@
             BinaryOp {
                 lhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Add,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            2.0,
+                        rhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                     },
                 ),
@@ -72,24 +93,32 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            2.0,
+                        lhs: Trivial(
+                            Num(
+                                2.0,
+                            ),
                         ),
                         op: Add,
                         rhs: BinaryOp(
                             BinaryOp {
-                                lhs: Num(
-                                    2.0,
+                                lhs: Trivial(
+                                    Num(
+                                        2.0,
+                                    ),
                                 ),
                                 op: Mul,
-                                rhs: Num(
-                                    2.0,
+                                rhs: Trivial(
+                                    Num(
+                                        2.0,
+                                    ),
                                 ),
                             },
                         ),
@@ -99,18 +128,24 @@
         ),
         BinaryOp(
             BinaryOp {
-                lhs: Num(
-                    2.0,
+                lhs: Trivial(
+                    Num(
+                        2.0,
+                    ),
                 ),
                 op: Add,
                 rhs: BinaryOp(
                     BinaryOp {
-                        lhs: Num(
-                            3.0,
+                        lhs: Trivial(
+                            Num(
+                                3.0,
+                            ),
                         ),
                         op: Mul,
-                        rhs: Num(
-                            4.0,
+                        rhs: Trivial(
+                            Num(
+                                4.0,
+                            ),
                         ),
                     },
                 ),
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@comment_eof.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@comment_eof.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@comment_eof.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/comment_eof.jsonnet
 ---
@@ -16,8 +17,10 @@
                     plus: false,
                     params: None,
                     visibility: Normal,
-                    value: Num(
-                        1.0,
+                    value: Trivial(
+                        Num(
+                            1.0,
+                        ),
                     ),
                 },
             ],
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@default_nondefault.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@default_nondefault.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@default_nondefault.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/default_nondefault.jsonnet
 ---
@@ -14,8 +15,10 @@
                             "foo" from virtual:<test>:8-11,
                         ),
                         default: Some(
-                            Str(
-                                "foo",
+                            Trivial(
+                                Str(
+                                    "foo",
+                                ),
                             ),
                         ),
                     },
@@ -44,14 +47,12 @@
                 ),
                 binds_len: 2,
             },
-            value: Literal(
-                virtual:<test>:28-32,
+            value: Trivial(
                 Null,
             ),
         },
     ],
-    Literal(
-        virtual:<test>:34-38,
+    Trivial(
         Null,
     ),
 )
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@imports.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@imports.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@imports.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/imports.jsonnet
 ---
@@ -7,20 +8,26 @@
     [
         Import(
             Normal from virtual:<test>:2-8,
-            Str(
-                "hello",
+            Trivial(
+                Str(
+                    "hello",
+                ),
             ),
         ),
         Import(
             Str from virtual:<test>:18-27,
-            Str(
-                "garnish.txt",
+            Trivial(
+                Str(
+                    "garnish.txt",
+                ),
             ),
         ),
         Import(
             Bin from virtual:<test>:43-52,
-            Str(
-                "garnish.bin",
+            Trivial(
+                Str(
+                    "garnish.bin",
+                ),
             ),
         ),
     ],
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@multiline.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@multiline.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@multiline.jsonnet.snap
@@ -1,21 +1,30 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/multiline.jsonnet
 ---
 Arr(
     [
-        Str(
-            "Hello world!\na\n",
+        Trivial(
+            Str(
+                "Hello world!\na\n",
+            ),
         ),
-        Str(
-            "Hello world!\na\n",
+        Trivial(
+            Str(
+                "Hello world!\na\n",
+            ),
         ),
-        Str(
-            "Hello world!\n\ta\n",
+        Trivial(
+            Str(
+                "Hello world!\n\ta\n",
+            ),
         ),
-        Str(
-            "Hello world!\n a\n",
+        Trivial(
+            Str(
+                "Hello world!\n a\n",
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@reserved.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@reserved.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@reserved.jsonnet.snap
@@ -1,12 +1,12 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/reserved.jsonnet
 ---
 Arr(
     [
-        Literal(
-            virtual:<test>:2-6,
+        Trivial(
             Null,
         ),
         Var(
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@slice.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@slice.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@slice.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/slice.jsonnet
 ---
@@ -12,8 +13,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:4-5,
                     ),
                     end: None,
@@ -28,8 +31,10 @@
                 ),
                 slice: SliceDesc {
                     start: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:11-12,
                     ),
                     end: None,
@@ -45,8 +50,10 @@
                 slice: SliceDesc {
                     start: None,
                     end: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:20-21,
                     ),
                     step: None,
@@ -62,8 +69,10 @@
                     start: None,
                     end: None,
                     step: Some(
-                        Num(
-                            1.0,
+                        Trivial(
+                            Num(
+                                1.0,
+                            ),
                         ) from virtual:<test>:29-30,
                     ),
                 },
@@ -83,8 +92,10 @@
                                     "len" from virtual:<test>:38-41,
                                 ),
                                 op: Sub,
-                                rhs: Num(
-                                    1.0,
+                                rhs: Trivial(
+                                    Num(
+                                        1.0,
+                                    ),
                                 ),
                             },
                         ) from virtual:<test>:38-45,
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@string_escaping.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@string_escaping.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@string_escaping.jsonnet.snap
@@ -1,24 +1,35 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/string_escaping.jsonnet
 ---
 Arr(
     [
-        Str(
-            "Hello, \"world\"!",
+        Trivial(
+            Str(
+                "Hello, \"world\"!",
+            ),
         ),
-        Str(
-            "Hello 'world'!",
+        Trivial(
+            Str(
+                "Hello 'world'!",
+            ),
         ),
-        Str(
-            "\\\\",
+        Trivial(
+            Str(
+                "\\\\",
+            ),
         ),
-        Str(
-            "Hello\nWorld",
+        Trivial(
+            Str(
+                "Hello\nWorld",
+            ),
         ),
-        Str(
-            "Hello\\n\"World\"",
+        Trivial(
+            Str(
+                "Hello\\n\"World\"",
+            ),
         ),
     ],
 )
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@subexp.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@subexp.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@subexp.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/subexp.jsonnet
 ---
@@ -22,8 +23,10 @@
                             into: Full(
                                 "x" from virtual:<test>:11-12,
                             ),
-                            value: Num(
-                                1.0,
+                            value: Trivial(
+                                Num(
+                                    1.0,
+                                ),
                             ),
                         },
                     ],
modifiedcrates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@suffix.jsonnet.snapdiffbeforeafterboth
--- a/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@suffix.jsonnet.snap
+++ b/crates/jrsonnet-peg-parser/src/snapshots/jrsonnet_peg_parser__tests__snapshots@suffix.jsonnet.snap
@@ -1,5 +1,6 @@
 ---
 source: crates/jrsonnet-peg-parser/src/lib.rs
+assertion_line: 459
 expression: v
 input_file: crates/jrsonnet-peg-parser/src/tests/suffix.jsonnet
 ---
@@ -12,8 +13,10 @@
             parts: [
                 IndexPart {
                     span: virtual:<test>:6-10,
-                    value: Str(
-                        "test",
+                    value: Trivial(
+                        Str(
+                            "test",
+                        ),
                     ),
                 },
             ],
@@ -24,8 +27,10 @@
             ),
             ArgsDesc {
                 unnamed: [
-                    Num(
-                        2.0,
+                    Trivial(
+                        Num(
+                            2.0,
+                        ),
                     ),
                 ],
                 names: [],
@@ -41,16 +46,20 @@
                 parts: [
                     IndexPart {
                         span: virtual:<test>:24-28,
-                        value: Str(
-                            "test",
+                        value: Trivial(
+                            Str(
+                                "test",
+                            ),
                         ),
                     },
                 ],
             },
             ArgsDesc {
                 unnamed: [
-                    Num(
-                        2.0,
+                    Trivial(
+                        Num(
+                            2.0,
+                        ),
                     ),
                 ],
                 names: [],