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
--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__basic_test.snap
@@ -1,35 +1,40 @@
 ---
 source: crates/jrsonnet-ir-parser/src/lib.rs
+assertion_line: 1082
 expression: "format!(\"{v:#?}\")"
 ---
 AssertExpr(
     AssertExpr {
         assert: AssertStmt {
             assertion: Index {
-                indexable: Literal(
-                    virtual:<test>:7-11,
-                    True,
+                indexable: Trivial(
+                    Bool(
+                        true,
+                    ),
                 ),
                 parts: [
                     IndexPart {
                         span: virtual:<test>:12-17,
-                        value: Literal(
-                            virtual:<test>:12-17,
-                            False,
+                        value: Trivial(
+                            Bool(
+                                false,
+                            ),
                         ),
                     },
                 ],
             } from virtual:<test>:7-18,
             message: Some(
-                Literal(
-                    virtual:<test>:21-26,
-                    False,
+                Trivial(
+                    Bool(
+                        false,
+                    ),
                 ),
             ),
         },
-        rest: Literal(
-            virtual:<test>:29-33,
-            True,
+        rest: Trivial(
+            Bool(
+                true,
+            ),
         ),
     },
 )
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
before · crates/jrsonnet-ir/src/visit.rs
1use jrsonnet_interner::IStr;23#[cfg(feature = "exp-object-iteration")]4use crate::ForObjSpecData;5use crate::{6	ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, Expr, ExprParam,7	ExprParams, FieldMember, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, IndexPart,8	ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,9};1011pub trait Visitor: Sized {12	fn visit_expr(&mut self, e: &Expr) {13		visit_expr(self, e)14	}15	fn visit_import(&mut self, _as_expression: bool, _value: IStr) {}16}1718#[cfg(feature = "exp-destruct")]19pub fn visit_destruct_rest<V: Visitor>(_v: &mut V, destruct: &crate::DestructRest) {20	match destruct {21		crate::DestructRest::Keep(_name) => {}22		crate::DestructRest::Drop => {}23	}24}2526#[allow(unused_variables, reason = "used with exp-destruct")]27pub fn visit_destruct<V: Visitor>(v: &mut V, destruct: &Destruct) {28	match destruct {29		Destruct::Full(_istr) => {}30		#[cfg(feature = "exp-destruct")]31		Destruct::Skip => {}32		#[cfg(feature = "exp-destruct")]33		Destruct::Array { start, rest, end } => {34			for s in start {35				visit_destruct(v, s);36			}37			if let Some(rest) = rest {38				visit_destruct_rest(v, rest);39			}40			for s in end {41				visit_destruct(v, s);42			}43		}44		#[cfg(feature = "exp-destruct")]45		Destruct::Object { fields, rest } => {46			for (_name, into, default) in fields {47				if let Some(into) = into {48					visit_destruct(v, into);49				}50				if let Some(default) = default {51					v.visit_expr(default);52				}53				if let Some(rest) = rest {54					visit_destruct_rest(v, rest);55				}56			}57		}58	}59}6061pub fn visit_if_spec<V: Visitor>(v: &mut V, cond: &IfSpecData) {62	let IfSpecData { span: _, cond } = cond;63	v.visit_expr(cond);64}6566pub fn visit_comp_spec<V: Visitor>(v: &mut V, c: &CompSpec) {67	match c {68		CompSpec::IfSpec(cond) => visit_if_spec(v, cond),69		CompSpec::ForSpec(for_spec_data) => {70			let ForSpecData { destruct, over } = for_spec_data;71			visit_destruct(v, destruct);72			v.visit_expr(over);73		}74		#[cfg(feature = "exp-object-iteration")]75		CompSpec::ForObjSpec(for_obj_spec_data) => {76			let ForObjSpecData {77				key: _,78				visibility: _,79				value,80				over,81			} = for_obj_spec_data;82			visit_destruct(v, value);83			v.visit_expr(over);84		}85	}86}87pub fn visit_params<V: Visitor>(v: &mut V, par: &ExprParams) {88	let ExprParams {89		exprs,90		signature: _,91		binds_len: _,92	} = par;93	for par in &**exprs {94		let ExprParam { destruct, default } = &par;95		visit_destruct(v, destruct);96		if let Some(default) = default {97			v.visit_expr(default);98		}99	}100}101102pub fn visit_bind_spec<V: Visitor>(v: &mut V, bind: &BindSpec) {103	match bind {104		BindSpec::Field { into, value } => {105			visit_destruct(v, into);106			v.visit_expr(value);107		}108		BindSpec::Function {109			name: _,110			params,111			value,112		} => {113			visit_params(v, params);114			v.visit_expr(value);115		}116	}117}118119pub fn visit_field_member<V: Visitor>(v: &mut V, mem: &FieldMember) {120	let FieldMember {121		name,122		plus: _,123		params,124		visibility: _,125		value,126	} = mem;127	match &**name {128		FieldName::Fixed(_istr) => {}129		FieldName::Dyn(expr) => v.visit_expr(expr),130	}131	if let Some(params) = params {132		visit_params(v, params);133	}134	v.visit_expr(value);135}136137pub fn visit_obj_body<V: Visitor>(v: &mut V, obj_body: &ObjBody) {138	match obj_body {139		ObjBody::MemberList(obj_members) => {140			let ObjMembers {141				locals,142				asserts,143				fields,144			} = obj_members;145			for local in &**locals {146				visit_bind_spec(v, local);147			}148			for assert in &**asserts {149				visit_assert_stmt(v, assert);150			}151			for field in fields {152				visit_field_member(v, field);153			}154		}155		ObjBody::ObjComp(obj_comp) => {156			let ObjComp {157				locals,158				field,159				compspecs,160			} = obj_comp;161			for local in &**locals {162				visit_bind_spec(v, local);163			}164			visit_field_member(v, field);165			for compspec in compspecs {166				visit_comp_spec(v, compspec);167			}168		}169	}170}171172pub fn visit_assert_stmt<V: Visitor>(v: &mut V, ass: &AssertStmt) {173	let AssertStmt { assertion, message } = ass;174	v.visit_expr(assertion);175	if let Some(message) = message {176		v.visit_expr(message);177	}178}179pub fn visit_expr<V: Visitor>(v: &mut V, e: &Expr) {180	match e {181		Expr::Literal(_span, _literal_type) => {}182		Expr::Str(_istr) => {}183		Expr::Num(_num) => {}184		Expr::Var(_spanned) => {}185		Expr::Arr(exprs) => {186			for e in &**exprs {187				v.visit_expr(e);188			}189		}190		Expr::ArrComp(expr, comp_specs) => {191			v.visit_expr(expr);192			for ele in comp_specs {193				visit_comp_spec(v, ele);194			}195		}196		Expr::Obj(obj_body) => visit_obj_body(v, obj_body),197		Expr::ObjExtend(expr, obj_body) => {198			v.visit_expr(expr);199			visit_obj_body(v, obj_body);200		}201		Expr::UnaryOp(_unary_op_type, expr) => {202			v.visit_expr(expr);203		}204		Expr::BinaryOp(binary_op) => {205			let BinaryOp { lhs, op: _, rhs } = &**binary_op;206			v.visit_expr(lhs);207			v.visit_expr(rhs);208		}209		Expr::AssertExpr(assert_expr) => {210			let AssertExpr { assert, rest } = &**assert_expr;211			visit_assert_stmt(v, assert);212			v.visit_expr(rest);213		}214		Expr::LocalExpr(bind_specs, expr) => {215			for local in bind_specs {216				visit_bind_spec(v, local);217			}218			v.visit_expr(expr);219		}220		Expr::Import(kind, expr) => {221			v.visit_expr(expr);222223			if let Expr::Str(expr) = &**expr {224				v.visit_import(matches!(**kind, ImportKind::Normal), expr.clone());225			}226		}227		Expr::ErrorStmt(_span, expr) => {228			v.visit_expr(expr);229		}230		Expr::Apply(expr, spanned, _) => {231			v.visit_expr(expr);232			let ArgsDesc {233				unnamed,234				names: _,235				values,236			} = &**spanned;237			for unnamed in unnamed {238				v.visit_expr(unnamed);239			}240			for named in values {241				v.visit_expr(named);242			}243		}244		Expr::Index { indexable, parts } => {245			v.visit_expr(indexable);246247			for part in parts {248				let IndexPart {249					span: _,250					value,251					#[cfg(feature = "exp-null-coaelse")]252						null_coaelse: _,253				} = part;254				v.visit_expr(value);255			}256		}257		Expr::Function(_span, expr_params, expr) => {258			visit_params(v, expr_params);259			v.visit_expr(expr);260		}261		Expr::IfElse(if_else) => {262			let IfElse {263				cond,264				cond_then,265				cond_else,266			} = &**if_else;267			visit_if_spec(v, cond);268			v.visit_expr(cond_then);269			if let Some(cond_else) = cond_else {270				v.visit_expr(cond_else);271			}272		}273		Expr::Slice(slice) => {274			let Slice { value, slice } = &**slice;275			v.visit_expr(value);276			let SliceDesc { start, end, step } = slice;277278			if let Some(start) = start {279				v.visit_expr(start);280			}281			if let Some(end) = end {282				v.visit_expr(end);283			}284			if let Some(step) = step {285				v.visit_expr(step);286			}287		}288	}289}
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: [],