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