difftreelog
refactor split literals and trivials
in: master
39 files changed
crates/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)]
crates/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,
+ ),
),
},
),
crates/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,
+ ),
),
},
)
crates/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",
+ ),
),
)
crates/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,
crates/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,
+ ),
),
),
},
crates/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",
+ ),
),
),
],
crates/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,
+ ),
),
},
],
crates/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,
),
crates/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,
+ ),
),
},
],
crates/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,
+ ),
),
},
],
crates/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",
+ ),
),
},
],
crates/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,
+ ),
),
},
),
crates/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,
+ ),
),
},
],
crates/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,
),
)
crates/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",
+ ),
),
),
],
crates/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",
+ ),
),
],
)
crates/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(
crates/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,
crates/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\"",
+ ),
),
],
)
crates/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,
+ ),
),
},
],
crates/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: [],
crates/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,
),
},
crates/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",
+ ),
),
],
)
crates/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,
+ ),
),
],
)
crates/jrsonnet-ir/src/expr.rsdiffbeforeafterboth1use std::{2 fmt::{self, Debug, Display},3 ops::{Deref, RangeInclusive},4};56use jrsonnet_gcmodule::Acyclic;7use jrsonnet_interner::IStr;89use crate::{10 NumValue,11 function::{FunctionSignature, ParamDefault, ParamName, ParamParse},12 source::Source,13};1415#[derive(Debug, PartialEq, Acyclic)]16pub enum FieldName {17 /// {fixed: 2}18 Fixed(IStr),19 /// {["dyn"+"amic"]: 3}20 Dyn(Expr),21}2223#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]24#[repr(u8)]25pub enum Visibility {26 /// :27 Normal,28 /// ::29 Hidden,30 /// :::31 Unhide,32}3334impl Visibility {35 pub fn is_visible(&self) -> bool {36 matches!(self, Self::Normal | Self::Unhide)37 }38}3940#[derive(Debug, PartialEq, Acyclic)]41pub struct AssertStmt {42 pub assertion: Spanned<Expr>,43 pub message: Option<Expr>,44}4546#[derive(Debug, PartialEq, Acyclic)]47pub struct FieldMember {48 pub name: Spanned<FieldName>,49 pub plus: bool,50 pub params: Option<ExprParams>,51 pub visibility: Visibility,52 pub value: Expr,53}5455#[derive(Debug, PartialEq, Acyclic)]56pub enum Member {57 Field(FieldMember),58 BindStmt(BindSpec),59 AssertStmt(AssertStmt),60}6162#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]63pub enum UnaryOpType {64 Plus,65 Minus,66 BitNot,67 Not,68}6970impl Display for UnaryOpType {71 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {72 use UnaryOpType::*;73 write!(74 f,75 "{}",76 match self {77 Plus => "+",78 Minus => "-",79 BitNot => "~",80 Not => "!",81 }82 )83 }84}8586#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]87pub enum BinaryOpType {88 Mul,89 Div,9091 /// Implemented as intrinsic, put here for completeness92 Mod,9394 Add,95 Sub,9697 Lhs,98 Rhs,99100 Lt,101 Gt,102 Lte,103 Gte,104105 BitAnd,106 BitOr,107 BitXor,108109 Eq,110 Neq,111112 And,113 Or,114 #[cfg(feature = "exp-null-coaelse")]115 NullCoaelse,116117 // Equialent to std.objectHasEx(a, b, true)118 In,119}120121impl Display for BinaryOpType {122 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {123 use BinaryOpType::*;124 write!(125 f,126 "{}",127 match self {128 Mul => "*",129 Div => "/",130 Mod => "%",131 Add => "+",132 Sub => "-",133 Lhs => "<<",134 Rhs => ">>",135 Lt => "<",136 Gt => ">",137 Lte => "<=",138 Gte => ">=",139 BitAnd => "&",140 BitOr => "|",141 BitXor => "^",142 Eq => "==",143 Neq => "!=",144 And => "&&",145 Or => "||",146 In => "in",147 #[cfg(feature = "exp-null-coaelse")]148 NullCoaelse => "??",149 }150 )151 }152}153154/// name, default value155#[derive(Debug, PartialEq, Acyclic)]156pub struct ExprParam {157 pub destruct: Destruct,158 pub default: Option<Expr>,159}160161/// Defined function parameters162#[derive(Debug, PartialEq, Acyclic)]163pub struct ExprParams {164 pub exprs: Vec<ExprParam>,165 pub signature: FunctionSignature,166 pub(crate) binds_len: usize,167}168impl ExprParams {169 pub fn len(&self) -> usize {170 self.exprs.len()171 }172 pub fn is_empty(&self) -> bool {173 self.exprs.is_empty()174 }175176 pub fn binds_len(&self) -> usize {177 self.binds_len178 }179 pub fn new(exprs: Vec<ExprParam>) -> Self {180 Self {181 signature: FunctionSignature::new(182 exprs183 .iter()184 .map(|p| {185 ParamParse::new(186 p.destruct.name(),187 ParamDefault::exists(p.default.is_some()),188 )189 })190 .collect(),191 ),192 binds_len: exprs.iter().map(|v| v.destruct.binds_len()).sum(),193 exprs,194 }195 }196}197198#[derive(Debug, PartialEq, Acyclic)]199pub struct ArgsDesc {200 pub unnamed: Vec<Expr>,201 pub names: Vec<IStr>,202 pub values: Vec<Expr>,203}204impl ArgsDesc {205 pub fn new(unnamed: Vec<Expr>, names: Vec<IStr>, values: Vec<Expr>) -> Self {206 Self {207 unnamed,208 names,209 values,210 }211 }212}213214#[derive(Debug, PartialEq, Eq, Acyclic)]215pub enum DestructRest {216 /// ...rest217 Keep(IStr),218 /// ...219 Drop,220}221222#[derive(Debug, PartialEq, Acyclic)]223pub enum Destruct {224 Full(Spanned<IStr>),225 #[cfg(feature = "exp-destruct")]226 Skip,227 #[cfg(feature = "exp-destruct")]228 Array {229 start: Vec<Destruct>,230 rest: Option<DestructRest>,231 end: Vec<Destruct>,232 },233 #[cfg(feature = "exp-destruct")]234 Object {235 #[allow(clippy::type_complexity)]236 fields: Vec<(IStr, Option<Destruct>, Option<Spanned<Expr>>)>,237 rest: Option<DestructRest>,238 },239}240impl Destruct {241 /// Name of destructure, used for function parameter names242 pub fn name(&self) -> ParamName {243 match self {244 Self::Full(name) => ParamName::Named(name.value.clone()),245 #[cfg(feature = "exp-destruct")]246 _ => ParamName::Unnamed,247 }248 }249 pub fn binds_len(&self) -> usize {250 #[cfg(feature = "exp-destruct")]251 fn cap_rest(rest: &Option<DestructRest>) -> usize {252 match rest {253 Some(DestructRest::Keep(_)) => 1,254 Some(DestructRest::Drop) => 0,255 None => 0,256 }257 }258 match self {259 Self::Full(_) => 1,260 #[cfg(feature = "exp-destruct")]261 Self::Skip => 0,262 #[cfg(feature = "exp-destruct")]263 Self::Array { start, rest, end } => {264 start.iter().map(Destruct::binds_len).sum::<usize>()265 + end.iter().map(Destruct::binds_len).sum::<usize>()266 + cap_rest(rest)267 }268 #[cfg(feature = "exp-destruct")]269 Self::Object { fields, rest } => {270 let mut out = 0;271 for (_, into, _) in fields {272 match into {273 Some(v) => out += v.binds_len(),274 // Field is destructured to default name275 None => out += 1,276 }277 }278 out + cap_rest(rest)279 }280 }281 }282}283284#[derive(Debug, PartialEq, Acyclic)]285pub enum BindSpec {286 Field {287 into: Destruct,288 value: Expr,289 },290 Function {291 name: Spanned<IStr>,292 params: ExprParams,293 value: Expr,294 },295}296impl BindSpec {297 pub fn binds_len(&self) -> usize {298 match self {299 BindSpec::Field { into, .. } => into.binds_len(),300 BindSpec::Function { .. } => 1,301 }302 }303}304305#[derive(Debug, PartialEq, Acyclic)]306pub struct IfSpecData {307 pub span: Span,308 pub cond: Expr,309}310311#[derive(Debug, PartialEq, Acyclic)]312pub struct ForSpecData {313 pub destruct: Destruct,314 pub over: Expr,315}316317#[cfg(feature = "exp-object-iteration")]318#[derive(Debug, PartialEq, Acyclic)]319pub struct ForObjSpecData {320 pub key: IStr,321 pub visibility: Visibility,322 pub value: Destruct,323 pub over: Expr,324}325326#[derive(Debug, PartialEq, Acyclic)]327pub enum CompSpec {328 IfSpec(IfSpecData),329 ForSpec(ForSpecData),330 #[cfg(feature = "exp-object-iteration")]331 ForObjSpec(ForObjSpecData),332}333334#[derive(Debug, PartialEq, Acyclic)]335pub struct ObjComp {336 pub locals: Vec<BindSpec>,337 pub field: Box<FieldMember>,338 pub compspecs: Vec<CompSpec>,339}340341#[derive(Debug, PartialEq, Acyclic)]342pub struct ObjMembers {343 pub locals: Vec<BindSpec>,344 pub asserts: Vec<AssertStmt>,345 pub fields: Vec<FieldMember>,346}347348#[derive(Debug, PartialEq, Acyclic)]349pub enum ObjBody {350 MemberList(ObjMembers),351 ObjComp(ObjComp),352}353354#[derive(Debug, PartialEq, Eq, Clone, Copy, Acyclic)]355pub enum LiteralType {356 This,357 Super,358 Dollar,359 Null,360 True,361 False,362}363364#[derive(Debug, PartialEq, Acyclic)]365pub struct SliceDesc {366 pub start: Option<Spanned<Expr>>,367 pub end: Option<Spanned<Expr>>,368 pub step: Option<Spanned<Expr>>,369}370371#[derive(Debug, PartialEq, Acyclic)]372pub struct AssertExpr {373 pub assert: AssertStmt,374 pub rest: Expr,375}376377#[derive(Debug, PartialEq, Acyclic)]378pub struct BinaryOp {379 pub lhs: Expr,380 pub op: BinaryOpType,381 pub rhs: Expr,382}383384#[derive(Debug, PartialEq, Acyclic, Clone, Copy)]385pub enum ImportKind {386 Normal,387 Str,388 Bin,389}390391#[derive(Debug, PartialEq, Acyclic)]392pub struct IfElse {393 pub cond: IfSpecData,394 pub cond_then: Expr,395 pub cond_else: Option<Expr>,396}397398#[derive(Debug, PartialEq, Acyclic)]399pub struct Slice {400 pub value: Expr,401 pub slice: SliceDesc,402}403404/// Syntax base405#[derive(Debug, PartialEq, Acyclic)]406pub enum Expr {407 Literal(Span, LiteralType),408409 /// String value: "hello"410 Str(IStr),411 /// Number: 1, 2.0, 2e+20412 Num(NumValue),413 /// Variable name: test414 Var(Spanned<IStr>),415416 /// Array of expressions: [1, 2, "Hello"]417 Arr(Vec<Expr>),418 /// Array comprehension:419 /// ```jsonnet420 /// ingredients: [421 /// { kind: kind, qty: 4 / 3 }422 /// for kind in [423 /// 'Honey Syrup',424 /// 'Lemon Juice',425 /// 'Farmers Gin',426 /// ]427 /// ],428 /// ```429 ArrComp(Box<Expr>, Vec<CompSpec>),430431 /// Object: {a: 2}432 Obj(ObjBody),433 /// Object extension: var1 {b: 2}434 ObjExtend(Box<Expr>, ObjBody),435436 /// -2437 UnaryOp(UnaryOpType, Box<Expr>),438 /// 2 - 2439 BinaryOp(Box<BinaryOp>),440 /// assert 2 == 2 : "Math is broken"441 AssertExpr(Box<AssertExpr>),442 /// local a = 2; { b: a }443 LocalExpr(Vec<BindSpec>, Box<Expr>),444445 /// import* "hello"446 Import(Spanned<ImportKind>, Box<Expr>),447 /// error "I'm broken"448 ErrorStmt(Span, Box<Expr>),449 /// a(b, c)450 Apply(Box<Expr>, Spanned<ArgsDesc>, bool),451 /// a[b], a.b, a?.b452 Index {453 indexable: Box<Expr>,454 parts: Vec<IndexPart>,455 },456 /// function(x) x457 Function(Span, ExprParams, Box<Expr>),458 /// if true == false then 1 else 2459 IfElse(Box<IfElse>),460 Slice(Box<Slice>),461}462463#[derive(Debug, PartialEq, Acyclic)]464pub struct IndexPart {465 pub span: Span,466 pub value: Expr,467 #[cfg(feature = "exp-null-coaelse")]468 pub null_coaelse: bool,469}470471/// file, begin offset, end offset472#[derive(Clone, PartialEq, Eq, Acyclic)]473#[repr(C)]474pub struct Span(pub Source, pub u32, pub u32);475impl Span {476 pub fn belongs_to(&self, other: &Span) -> bool {477 other.0 == self.0 && other.1 <= self.1 && other.2 >= self.2478 }479 pub fn range(&self) -> RangeInclusive<usize> {480 let start = self.1;481 let mut end = self.2;482 if end > start {483 // Because it is originally exclusive484 end -= 1;485 }486 start as usize..=end as usize487 }488}489490#[cfg(target_pointer_width = "64")]491static_assertions::assert_eq_size!(Span, (usize, usize));492493impl Debug for Span {494 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {495 write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2)496 }497}498499#[derive(Clone, PartialEq, Acyclic)]500pub struct Spanned<T: Acyclic> {501 pub value: T,502 pub span: Span,503}504impl<T: Acyclic> Deref for Spanned<T> {505 type Target = T;506 fn deref(&self) -> &Self::Target {507 &self.value508 }509}510impl<T: Acyclic> Spanned<T> {511 #[inline]512 pub fn new(value: T, span: Span) -> Self {513 Self { value, span }514 }515 pub fn map<U: Acyclic>(self, v: impl FnOnce(T) -> U) -> Spanned<U> {516 Spanned {517 span: self.span,518 value: v(self.value),519 }520 }521 pub fn as_ref<'a>(&'a self) -> Spanned<&'a T>522 where523 &'a T: Acyclic,524 {525 Spanned {526 span: self.span.clone(),527 value: &self.value,528 }529 }530}531532impl<T: Debug + Acyclic> Debug for Spanned<T> {533 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {534 let expr = &**self;535 if f.alternate() {536 write!(f, "{:#?}", expr)?;537 } else {538 write!(f, "{:?}", expr)?;539 }540 write!(f, " from {:?}", self.span)?;541 Ok(())542 }543}1use std::{2 fmt::{self, Debug, Display},3 ops::{Deref, RangeInclusive},4};56use jrsonnet_gcmodule::Acyclic;7use jrsonnet_interner::IStr;89use crate::{10 NumValue,11 function::{FunctionSignature, ParamDefault, ParamName, ParamParse},12 source::Source,13};1415#[derive(Debug, PartialEq, Acyclic)]16pub enum FieldName {17 /// {fixed: 2}18 Fixed(IStr),19 /// {["dyn"+"amic"]: 3}20 Dyn(Expr),21}2223#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]24#[repr(u8)]25pub enum Visibility {26 /// :27 Normal,28 /// ::29 Hidden,30 /// :::31 Unhide,32}3334#[derive(Debug, Clone, PartialEq, Acyclic)]35pub enum TrivialVal {36 Null,37 Bool(bool),38 Num(NumValue),39 Str(IStr),40}4142impl Visibility {43 pub fn is_visible(&self) -> bool {44 matches!(self, Self::Normal | Self::Unhide)45 }46}4748#[derive(Debug, PartialEq, Acyclic)]49pub struct AssertStmt {50 pub assertion: Spanned<Expr>,51 pub message: Option<Expr>,52}5354#[derive(Debug, PartialEq, Acyclic)]55pub struct FieldMember {56 pub name: Spanned<FieldName>,57 pub plus: bool,58 pub params: Option<ExprParams>,59 pub visibility: Visibility,60 pub value: Expr,61}6263#[derive(Debug, PartialEq, Acyclic)]64pub enum Member {65 Field(FieldMember),66 BindStmt(BindSpec),67 AssertStmt(AssertStmt),68}6970#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]71pub enum UnaryOpType {72 Plus,73 Minus,74 BitNot,75 Not,76}7778impl Display for UnaryOpType {79 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {80 use UnaryOpType::*;81 write!(82 f,83 "{}",84 match self {85 Plus => "+",86 Minus => "-",87 BitNot => "~",88 Not => "!",89 }90 )91 }92}9394#[derive(Debug, Clone, Copy, PartialEq, Eq, Acyclic)]95pub enum BinaryOpType {96 Mul,97 Div,9899 /// Implemented as intrinsic, put here for completeness100 Mod,101102 Add,103 Sub,104105 Lhs,106 Rhs,107108 Lt,109 Gt,110 Lte,111 Gte,112113 BitAnd,114 BitOr,115 BitXor,116117 Eq,118 Neq,119120 And,121 Or,122 #[cfg(feature = "exp-null-coaelse")]123 NullCoaelse,124125 // Equialent to std.objectHasEx(a, b, true)126 In,127}128129impl Display for BinaryOpType {130 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {131 use BinaryOpType::*;132 write!(133 f,134 "{}",135 match self {136 Mul => "*",137 Div => "/",138 Mod => "%",139 Add => "+",140 Sub => "-",141 Lhs => "<<",142 Rhs => ">>",143 Lt => "<",144 Gt => ">",145 Lte => "<=",146 Gte => ">=",147 BitAnd => "&",148 BitOr => "|",149 BitXor => "^",150 Eq => "==",151 Neq => "!=",152 And => "&&",153 Or => "||",154 In => "in",155 #[cfg(feature = "exp-null-coaelse")]156 NullCoaelse => "??",157 }158 )159 }160}161162/// name, default value163#[derive(Debug, PartialEq, Acyclic)]164pub struct ExprParam {165 pub destruct: Destruct,166 pub default: Option<Expr>,167}168169/// Defined function parameters170#[derive(Debug, PartialEq, Acyclic)]171pub struct ExprParams {172 pub exprs: Vec<ExprParam>,173 pub signature: FunctionSignature,174 pub(crate) binds_len: usize,175}176impl ExprParams {177 pub fn len(&self) -> usize {178 self.exprs.len()179 }180 pub fn is_empty(&self) -> bool {181 self.exprs.is_empty()182 }183184 pub fn binds_len(&self) -> usize {185 self.binds_len186 }187 pub fn new(exprs: Vec<ExprParam>) -> Self {188 Self {189 signature: FunctionSignature::new(190 exprs191 .iter()192 .map(|p| {193 ParamParse::new(194 p.destruct.name(),195 ParamDefault::exists(p.default.is_some()),196 )197 })198 .collect(),199 ),200 binds_len: exprs.iter().map(|v| v.destruct.binds_len()).sum(),201 exprs,202 }203 }204}205206#[derive(Debug, PartialEq, Acyclic)]207pub struct ArgsDesc {208 pub unnamed: Vec<Expr>,209 pub names: Vec<IStr>,210 pub values: Vec<Expr>,211}212impl ArgsDesc {213 pub fn new(unnamed: Vec<Expr>, names: Vec<IStr>, values: Vec<Expr>) -> Self {214 Self {215 unnamed,216 names,217 values,218 }219 }220}221222#[derive(Debug, PartialEq, Eq, Acyclic)]223pub enum DestructRest {224 /// ...rest225 Keep(IStr),226 /// ...227 Drop,228}229230#[derive(Debug, PartialEq, Acyclic)]231pub enum Destruct {232 Full(Spanned<IStr>),233 #[cfg(feature = "exp-destruct")]234 Skip,235 #[cfg(feature = "exp-destruct")]236 Array {237 start: Vec<Destruct>,238 rest: Option<DestructRest>,239 end: Vec<Destruct>,240 },241 #[cfg(feature = "exp-destruct")]242 Object {243 #[allow(clippy::type_complexity)]244 fields: Vec<(IStr, Option<Destruct>, Option<Spanned<Expr>>)>,245 rest: Option<DestructRest>,246 },247}248impl Destruct {249 /// Name of destructure, used for function parameter names250 pub fn name(&self) -> ParamName {251 match self {252 Self::Full(name) => ParamName::Named(name.value.clone()),253 #[cfg(feature = "exp-destruct")]254 _ => ParamName::Unnamed,255 }256 }257 pub fn binds_len(&self) -> usize {258 #[cfg(feature = "exp-destruct")]259 fn cap_rest(rest: &Option<DestructRest>) -> usize {260 match rest {261 Some(DestructRest::Keep(_)) => 1,262 Some(DestructRest::Drop) => 0,263 None => 0,264 }265 }266 match self {267 Self::Full(_) => 1,268 #[cfg(feature = "exp-destruct")]269 Self::Skip => 0,270 #[cfg(feature = "exp-destruct")]271 Self::Array { start, rest, end } => {272 start.iter().map(Destruct::binds_len).sum::<usize>()273 + end.iter().map(Destruct::binds_len).sum::<usize>()274 + cap_rest(rest)275 }276 #[cfg(feature = "exp-destruct")]277 Self::Object { fields, rest } => {278 let mut out = 0;279 for (_, into, _) in fields {280 match into {281 Some(v) => out += v.binds_len(),282 // Field is destructured to default name283 None => out += 1,284 }285 }286 out + cap_rest(rest)287 }288 }289 }290}291292#[derive(Debug, PartialEq, Acyclic)]293pub enum BindSpec {294 Field {295 into: Destruct,296 value: Expr,297 },298 Function {299 name: Spanned<IStr>,300 params: ExprParams,301 value: Expr,302 },303}304impl BindSpec {305 pub fn binds_len(&self) -> usize {306 match self {307 BindSpec::Field { into, .. } => into.binds_len(),308 BindSpec::Function { .. } => 1,309 }310 }311}312313#[derive(Debug, PartialEq, Acyclic)]314pub struct IfSpecData {315 pub span: Span,316 pub cond: Expr,317}318319#[derive(Debug, PartialEq, Acyclic)]320pub struct ForSpecData {321 pub destruct: Destruct,322 pub over: Expr,323}324325#[cfg(feature = "exp-object-iteration")]326#[derive(Debug, PartialEq, Acyclic)]327pub struct ForObjSpecData {328 pub key: IStr,329 pub visibility: Visibility,330 pub value: Destruct,331 pub over: Expr,332}333334#[derive(Debug, PartialEq, Acyclic)]335pub enum CompSpec {336 IfSpec(IfSpecData),337 ForSpec(ForSpecData),338 #[cfg(feature = "exp-object-iteration")]339 ForObjSpec(ForObjSpecData),340}341342#[derive(Debug, PartialEq, Acyclic)]343pub struct ObjComp {344 pub locals: Vec<BindSpec>,345 pub field: Box<FieldMember>,346 pub compspecs: Vec<CompSpec>,347}348349#[derive(Debug, PartialEq, Acyclic)]350pub struct ObjMembers {351 pub locals: Vec<BindSpec>,352 pub asserts: Vec<AssertStmt>,353 pub fields: Vec<FieldMember>,354}355356#[derive(Debug, PartialEq, Acyclic)]357pub enum ObjBody {358 MemberList(ObjMembers),359 ObjComp(ObjComp),360}361362/// Object identity reference: `self`, `super`, or `$`.#[derive(Debug, PartialEq, Eq, Clone, Copy, Acyclic)]363#[derive(Debug, PartialEq, Acyclic)]364pub enum IdentityKind {365 This,366 Super,367 Dollar,368}369370#[derive(Debug, PartialEq, Acyclic)]371pub struct SliceDesc {372 pub start: Option<Spanned<Expr>>,373 pub end: Option<Spanned<Expr>>,374 pub step: Option<Spanned<Expr>>,375}376377#[derive(Debug, PartialEq, Acyclic)]378pub struct AssertExpr {379 pub assert: AssertStmt,380 pub rest: Expr,381}382383#[derive(Debug, PartialEq, Acyclic)]384pub struct BinaryOp {385 pub lhs: Expr,386 pub op: BinaryOpType,387 pub rhs: Expr,388}389390#[derive(Debug, PartialEq, Acyclic, Clone, Copy)]391pub enum ImportKind {392 Normal,393 Str,394 Bin,395}396397#[derive(Debug, PartialEq, Acyclic)]398pub struct IfElse {399 pub cond: IfSpecData,400 pub cond_then: Expr,401 pub cond_else: Option<Expr>,402}403404#[derive(Debug, PartialEq, Acyclic)]405pub struct Slice {406 pub value: Expr,407 pub slice: SliceDesc,408}409410/// Syntax base411#[derive(Debug, PartialEq, Acyclic)]412pub enum Expr {413 /// Object-identity reference: `self`, `super`, `$`.414 Identity(Span, IdentityKind),415416 /// Trivial value literal417 Trivial(TrivialVal),418419 /// Variable name: test420 Var(Spanned<IStr>),421422 /// Array of expressions: [1, 2, "Hello"]423 Arr(Vec<Expr>),424 /// Array comprehension:425 /// ```jsonnet426 /// ingredients: [427 /// { kind: kind, qty: 4 / 3 }428 /// for kind in [429 /// 'Honey Syrup',430 /// 'Lemon Juice',431 /// 'Farmers Gin',432 /// ]433 /// ],434 /// ```435 ArrComp(Box<Expr>, Vec<CompSpec>),436437 /// Object: {a: 2}438 Obj(ObjBody),439 /// Object extension: var1 {b: 2}440 ObjExtend(Box<Expr>, ObjBody),441442 /// -2443 UnaryOp(UnaryOpType, Box<Expr>),444 /// 2 - 2445 BinaryOp(Box<BinaryOp>),446 /// assert 2 == 2 : "Math is broken"447 AssertExpr(Box<AssertExpr>),448 /// local a = 2; { b: a }449 LocalExpr(Vec<BindSpec>, Box<Expr>),450451 /// import* "hello"452 Import(Spanned<ImportKind>, Box<Expr>),453 /// error "I'm broken"454 ErrorStmt(Span, Box<Expr>),455 /// a(b, c)456 Apply(Box<Expr>, Spanned<ArgsDesc>, bool),457 /// a[b], a.b, a?.b458 Index {459 indexable: Box<Expr>,460 parts: Vec<IndexPart>,461 },462 /// function(x) x463 Function(Span, ExprParams, Box<Expr>),464 /// if true == false then 1 else 2465 IfElse(Box<IfElse>),466 Slice(Box<Slice>),467}468469#[derive(Debug, PartialEq, Acyclic)]470pub struct IndexPart {471 pub span: Span,472 pub value: Expr,473 #[cfg(feature = "exp-null-coaelse")]474 pub null_coaelse: bool,475}476477/// file, begin offset, end offset478#[derive(Clone, PartialEq, Eq, Acyclic)]479#[repr(C)]480pub struct Span(pub Source, pub u32, pub u32);481impl Span {482 pub fn belongs_to(&self, other: &Span) -> bool {483 other.0 == self.0 && other.1 <= self.1 && other.2 >= self.2484 }485 pub fn range(&self) -> RangeInclusive<usize> {486 let start = self.1;487 let mut end = self.2;488 if end > start {489 // Because it is originally exclusive490 end -= 1;491 }492 start as usize..=end as usize493 }494}495496#[cfg(target_pointer_width = "64")]497static_assertions::assert_eq_size!(Span, (usize, usize));498499impl Debug for Span {500 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {501 write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2)502 }503}504505#[derive(Clone, PartialEq, Acyclic)]506pub struct Spanned<T: Acyclic> {507 pub value: T,508 pub span: Span,509}510impl<T: Acyclic> Deref for Spanned<T> {511 type Target = T;512 fn deref(&self) -> &Self::Target {513 &self.value514 }515}516impl<T: Acyclic> Spanned<T> {517 #[inline]518 pub fn new(value: T, span: Span) -> Self {519 Self { value, span }520 }521 pub fn map<U: Acyclic>(self, v: impl FnOnce(T) -> U) -> Spanned<U> {522 Spanned {523 span: self.span,524 value: v(self.value),525 }526 }527 pub fn as_ref<'a>(&'a self) -> Spanned<&'a T>528 where529 &'a T: Acyclic,530 {531 Spanned {532 span: self.span.clone(),533 value: &self.value,534 }535 }536}537538impl<T: Debug + Acyclic> Debug for Spanned<T> {539 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {540 let expr = &**self;541 if f.alternate() {542 write!(f, "{:#?}", expr)?;543 } else {544 write!(f, "{:?}", expr)?;545 }546 write!(f, " from {:?}", self.span)?;547 Ok(())548 }549}crates/jrsonnet-ir/src/visit.rsdiffbeforeafterboth--- a/crates/jrsonnet-ir/src/visit.rs
+++ b/crates/jrsonnet-ir/src/visit.rs
@@ -5,7 +5,7 @@
use crate::{
ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, Expr, ExprParam,
ExprParams, FieldMember, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, IndexPart,
- ObjBody, ObjComp, ObjMembers, Slice, SliceDesc,
+ ObjBody, ObjComp, ObjMembers, Slice, SliceDesc, TrivialVal,
};
pub trait Visitor: Sized {
@@ -178,9 +178,8 @@
}
pub fn visit_expr<V: Visitor>(v: &mut V, e: &Expr) {
match e {
- Expr::Literal(_span, _literal_type) => {}
- Expr::Str(_istr) => {}
- Expr::Num(_num) => {}
+ Expr::Identity(_span, _identity_kind) => {}
+ Expr::Trivial(_) => {}
Expr::Var(_spanned) => {}
Expr::Arr(exprs) => {
for e in &**exprs {
@@ -220,7 +219,7 @@
Expr::Import(kind, expr) => {
v.visit_expr(expr);
- if let Expr::Str(expr) = &**expr {
+ if let Expr::Trivial(TrivialVal::Str(expr)) = &**expr {
v.visit_import(matches!(**kind, ImportKind::Normal), expr.clone());
}
}
crates/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)),
)
}
crates/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",
+ ),
),
},
],
crates/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,
+ ),
),
},
),
crates/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,
+ ),
),
},
],
crates/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,
),
)
crates/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",
+ ),
),
),
],
crates/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",
+ ),
),
],
)
crates/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(
crates/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,
crates/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\"",
+ ),
),
],
)
crates/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,
+ ),
),
},
],
crates/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: [],