From b89fdd32bd3ab8387a777f76a25d21269b211cf2 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 08 May 2026 03:07:31 +0000 Subject: [PATCH] refactor: split literals and trivials --- --- 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 { 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 { - 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 { 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)] --- 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, + ), ), }, ), --- 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::7-11, - True, + indexable: Trivial( + Bool( + true, + ), ), parts: [ IndexPart { span: virtual::12-17, - value: Literal( - virtual::12-17, - False, + value: Trivial( + Bool( + false, + ), ), }, ], } from virtual::7-18, message: Some( - Literal( - virtual::21-26, - False, + Trivial( + Bool( + false, + ), ), ), }, - rest: Literal( - virtual::29-33, - True, + rest: Trivial( + Bool( + true, + ), ), }, ) --- 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::0-5, - Str( - "bad", + Trivial( + Str( + "bad", + ), ), ) --- 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::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::26-34, --- 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::0-2, - cond: Literal( - virtual::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, + ), ), ), }, --- 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::1-7, - Str( - "a", + Trivial( + Str( + "a", + ), ), ), Import( Str from virtual::13-22, - Str( - "b", + Trivial( + Str( + "b", + ), ), ), Import( Bin from virtual::28-37, - Str( - "c", + Trivial( + Str( + "c", + ), ), ), ], --- 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::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::12-17, - value: Str( - "field", + value: Trivial( + Str( + "field", + ), ), }, IndexPart { span: virtual::18-19, - value: Num( - 0.0, + value: Trivial( + Num( + 0.0, + ), ), }, ], --- 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::1-5, + Trivial( Null, ), - Literal( - virtual::7-11, - True, + Trivial( + Bool( + true, + ), ), - Literal( - virtual::13-18, - False, + Trivial( + Bool( + false, + ), ), - Literal( + Identity( virtual::20-24, This, ), - Literal( + Identity( virtual::26-31, Super, ), - Literal( + Identity( virtual::33-34, Dollar, ), --- 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, + ), ), }, ], --- 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, + ), ), }, ], --- 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::7-15, - value: Str( - "deepJoin", + value: Trivial( + Str( + "deepJoin", + ), ), }, ], --- 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, + ), ), }, ), --- 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, + ), ), }, ], --- 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::8-11, ), default: Some( - Str( - "foo", + Trivial( + Str( + "foo", + ), ), ), }, @@ -44,14 +47,12 @@ ), binds_len: 2, }, - value: Literal( - virtual::28-32, + value: Trivial( Null, ), }, ], - Literal( - virtual::34-38, + Trivial( Null, ), ) --- 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::2-8, - Str( - "hello", + Trivial( + Str( + "hello", + ), ), ), Import( Str from virtual::18-27, - Str( - "garnish.txt", + Trivial( + Str( + "garnish.txt", + ), ), ), Import( Bin from virtual::43-52, - Str( - "garnish.bin", + Trivial( + Str( + "garnish.bin", + ), ), ), ], --- 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", + ), ), ], ) --- 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::2-6, + Trivial( Null, ), Var( --- 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::4-5, ), end: None, @@ -28,8 +31,10 @@ ), slice: SliceDesc { start: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::11-12, ), end: None, @@ -45,8 +50,10 @@ slice: SliceDesc { start: None, end: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::20-21, ), step: None, @@ -62,8 +69,10 @@ start: None, end: None, step: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::29-30, ), }, @@ -83,8 +92,10 @@ "len" from virtual::38-41, ), op: Sub, - rhs: Num( - 1.0, + rhs: Trivial( + Num( + 1.0, + ), ), }, ) from virtual::38-45, --- 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\"", + ), ), ], ) --- 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::11-12, ), - value: Num( - 1.0, + value: Trivial( + Num( + 1.0, + ), ), }, ], --- 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::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::24-28, - value: Str( - "test", + value: Trivial( + Str( + "test", + ), ), }, ], }, ArgsDesc { unnamed: [ - Num( - 2.0, + Trivial( + Num( + 2.0, + ), ), ], names: [], --- 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::3-4, ), end: None, @@ -27,8 +30,10 @@ ), slice: SliceDesc { start: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::10-11, ), end: None, @@ -44,8 +49,10 @@ slice: SliceDesc { start: None, end: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::19-20, ), step: None, @@ -61,8 +68,10 @@ start: None, end: None, step: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::28-29, ), }, --- 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", + ), ), ], ) --- 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, + ), ), ], ) --- 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), --- 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: &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()); } } --- 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(x: rule, s: &ParserSettings) -> Spanned = 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(, s) { Expr::Var(n) } pub rule id_loc(s: &ParserSettings) -> Spanned - = 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 { let len = str.len(); Spanned::new( - Expr::Str(str), + Expr::Trivial(TrivialVal::Str(str)), Span(settings.source.clone(), 0, codeidx(len)), ) } --- 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::7-15, - value: Str( - "deepJoin", + value: Trivial( + Str( + "deepJoin", + ), ), }, ], --- 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, + ), ), }, ), --- 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, + ), ), }, ], --- 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::8-11, ), default: Some( - Str( - "foo", + Trivial( + Str( + "foo", + ), ), ), }, @@ -44,14 +47,12 @@ ), binds_len: 2, }, - value: Literal( - virtual::28-32, + value: Trivial( Null, ), }, ], - Literal( - virtual::34-38, + Trivial( Null, ), ) --- 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::2-8, - Str( - "hello", + Trivial( + Str( + "hello", + ), ), ), Import( Str from virtual::18-27, - Str( - "garnish.txt", + Trivial( + Str( + "garnish.txt", + ), ), ), Import( Bin from virtual::43-52, - Str( - "garnish.bin", + Trivial( + Str( + "garnish.bin", + ), ), ), ], --- 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", + ), ), ], ) --- 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::2-6, + Trivial( Null, ), Var( --- 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::4-5, ), end: None, @@ -28,8 +31,10 @@ ), slice: SliceDesc { start: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::11-12, ), end: None, @@ -45,8 +50,10 @@ slice: SliceDesc { start: None, end: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::20-21, ), step: None, @@ -62,8 +69,10 @@ start: None, end: None, step: Some( - Num( - 1.0, + Trivial( + Num( + 1.0, + ), ) from virtual::29-30, ), }, @@ -83,8 +92,10 @@ "len" from virtual::38-41, ), op: Sub, - rhs: Num( - 1.0, + rhs: Trivial( + Num( + 1.0, + ), ), }, ) from virtual::38-45, --- 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\"", + ), ), ], ) --- 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::11-12, ), - value: Num( - 1.0, + value: Trivial( + Num( + 1.0, + ), ), }, ], --- 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::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::24-28, - value: Str( - "test", + value: Trivial( + Str( + "test", + ), ), }, ], }, ArgsDesc { unnamed: [ - Num( - 2.0, + Trivial( + Num( + 2.0, + ), ), ], names: [], -- gitstuff