difftreelog
refactor(ir) flatten
in: master
11 files changed
crates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth1use std::rc::Rc;23use jrsonnet_gcmodule::Acyclic;1use jrsonnet_gcmodule::Acyclic;4use jrsonnet_ir::{2use jrsonnet_ir::{5 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,3 unescape, ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec,6 ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse, IfSpecData,4 Destruct, Expr, ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IfElse,7 ImportKind, IndexPart, LiteralType, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,5 IfSpecData, ImportKind, IndexPart, LiteralType, Member, NumValue, ObjBody, ObjComp, ObjMembers,8 SliceDesc, Source, Span, Spanned, UnaryOpType, Visibility, unescape,6 Slice, SliceDesc, Source, Span, Spanned, UnaryOpType, Visibility,9};7};10use jrsonnet_lexer::{Lexeme, Lexer, Span as LexSpan, SyntaxKind, T, collect_lexed_str_block};8use jrsonnet_lexer::{collect_lexed_str_block, Lexeme, Lexer, Span as LexSpan, SyntaxKind, T};11912pub struct ParserSettings {10pub struct ParserSettings {13 pub source: Source,11 pub source: Source,16#[derive(Debug, Clone)]14#[derive(Debug, Clone)]17pub struct ParseError {15pub struct ParseError {18 pub message: String,16 pub message: String,19 pub location: LexSpan,17 pub location: Span,20}18}211922impl std::fmt::Display for ParseError {20impl std::fmt::Display for ParseError {128 if self.offset == self.lexemes.len() {126 if self.offset == self.lexemes.len() {129 let pos = self.lexemes.last().map_or(0, |v| v.range.1);127 let pos = self.lexemes.last().map_or(0, |v| v.range.1);130 return ParseError {128 return ParseError {131 location: LexSpan(pos, pos),129 location: Span(self.source.clone(), pos, pos),132 message,130 message,133 };131 };134 }132 }133 let LexSpan(start, end) = self.lexemes[self.offset].range;135 ParseError {134 ParseError {136 location: self.lexemes[self.offset].range,135 location: Span(self.source.clone(), start, end),137 message,136 message,138 }137 }139 }138 }293292294fn destruct(p: &mut Parser<'_>) -> Result<Destruct> {293fn destruct(p: &mut Parser<'_>) -> Result<Destruct> {295 if p.at(SyntaxKind::IDENT) {294 if p.at(SyntaxKind::IDENT) {296 return Ok(Destruct::Full(ident(p)?));295 return Ok(Destruct::Full(spanned(p, ident)?));297 }296 }298 #[cfg(not(feature = "exp-destruct"))]297 #[cfg(not(feature = "exp-destruct"))]299 return Err(p.error(format!("expected identifier, got {}", p.current_desc())));298 return Err(p.error(format!("expected identifier, got {}", p.current_desc())));407 loop {406 loop {408 let d = destruct(p)?;407 let d = destruct(p)?;409 let default = if p.try_eat(T![=]) {408 let default = if p.try_eat(T![=]) {410 Some(Rc::new(expr(p)?))409 Some(expr(p)?)411 } else {410 } else {412 None411 None413 };412 };441 if is_named {440 if is_named {442 let name: IStr = ident(p)?;441 let name: IStr = ident(p)?;443 p.eat(T![=])?;442 p.eat(T![=])?;444 let value = Rc::new(expr(p)?);445443446 names.push(name);444 names.push(name);447 values.push(value);445 values.push(expr(p)?);448 named_started = true;446 named_started = true;449 } else {447 } else {450 if named_started {448 if named_started {451 return Err(p.error("positional argument after named argument".into()));449 return Err(p.error("positional argument after named argument".into()));452 }450 }453 unnamed.push(Rc::new(expr(p)?));451 unnamed.push(expr(p)?);454 }452 }455 if !p.try_eat(T![,]) {453 if !p.try_eat(T![,]) {456 break;454 break;472 return Ok(BindSpec::Field { into: d, value });470 return Ok(BindSpec::Field { into: d, value });473 }471 }474 }472 }475 let name = ident(p)?;473 let name_spanned = spanned(p, ident)?;476 if p.try_eat(T!['(']) {474 if p.try_eat(T!['(']) {477 let ps = params(p)?;475 let ps = params(p)?;478 p.eat(T![')'])?;476 p.eat(T![')'])?;479 p.eat(T![=])?;477 p.eat(T![=])?;480 let value = Rc::new(expr(p)?);481 Ok(BindSpec::Function {478 Ok(BindSpec::Function {482 name,479 name: name_spanned.value,483 params: ps,480 params: ps,484 value,481 value: expr(p)?,485 })482 })486 } else {483 } else {487 p.eat(T![=])?;484 p.eat(T![=])?;488 let value = Rc::new(expr(p)?);489 Ok(BindSpec::Field {485 Ok(BindSpec::Field {490 into: Destruct::Full(name),486 into: Destruct::Full(name_spanned),491 value,487 value: expr(p)?,492 })488 })493 }489 }494}490}529 let ps = params(p)?;525 let ps = params(p)?;530 p.eat(T![')'])?;526 p.eat(T![')'])?;531 let vis = visibility(p)?;527 let vis = visibility(p)?;532 let value = Rc::new(expr(p)?);533 Ok(FieldMember {528 Ok(FieldMember {534 name,529 name,535 plus: false,530 plus: false,536 params: Some(ps),531 params: Some(ps),537 visibility: vis,532 visibility: vis,538 value,533 value: expr(p)?,539 })534 })540 } else {535 } else {541 let plus = p.try_eat(T![+]);536 let plus = p.try_eat(T![+]);542 let vis = visibility(p)?;537 let vis = visibility(p)?;543 let value = Rc::new(expr(p)?);544 Ok(FieldMember {538 Ok(FieldMember {545 name,539 name,546 plus,540 plus,547 params: None,541 params: None,548 visibility: vis,542 visibility: vis,549 value,543 value: expr(p)?,550 })544 })551 }545 }552}546}589fn objinside(p: &mut Parser<'_>) -> Result<ObjBody> {583fn objinside(p: &mut Parser<'_>) -> Result<ObjBody> {590 if p.at(T!['}']) {584 if p.at(T!['}']) {591 return Ok(ObjBody::MemberList(ObjMembers {585 return Ok(ObjBody::MemberList(ObjMembers {592 locals: Rc::new(Vec::new()),586 locals: Vec::new(),593 asserts: Rc::new(Vec::new()),587 asserts: Vec::new(),594 fields: Vec::new(),588 fields: Vec::new(),595 }));589 }));596 }590 }627 }621 }628 }622 }629 Ok(ObjBody::ObjComp(ObjComp {623 Ok(ObjBody::ObjComp(ObjComp {630 locals: Rc::new(locals),624 locals,631 field: Rc::new(625 field: Box::new(632 field_member.ok_or_else(|| p.error("missing object comprehension field".into()))?,626 field_member.ok_or_else(|| p.error("missing object comprehension field".into()))?,633 ),627 ),634 compspecs: specs,628 compspecs: specs,645 }639 }646 }640 }647 Ok(ObjBody::MemberList(ObjMembers {641 Ok(ObjBody::MemberList(ObjMembers {648 locals: Rc::new(locals),642 locals,649 asserts: Rc::new(asserts),643 asserts,650 fields,644 fields,651 }))645 }))652 }646 }678 p.eat(T!['['])?;672 p.eat(T!['['])?;679 if p.at(T![']']) {673 if p.at(T![']']) {680 p.eat(T![']'])?;674 p.eat(T![']'])?;681 return Ok(Expr::Arr(Rc::new(Vec::new())));675 return Ok(Expr::Arr(Vec::new()));682 }676 }683 let first = expr(p)?;677 let first = expr(p)?;684 if p.at(T![for]) {678 if p.at(T![for]) {685 let specs = compspecs(p)?;679 let specs = compspecs(p)?;686 p.eat(T![']'])?;680 p.eat(T![']'])?;687 Ok(Expr::ArrComp(Rc::new(first), specs))681 Ok(Expr::ArrComp(Box::new(first), specs))688 } else if p.at(T![,]) && {682 } else if p.at(T![,]) && {689 let next = p.offset + 1;683 let next = p.offset + 1;690 next < p.lexemes.len() && p.lexemes[next].kind == T![for]684 next < p.lexemes.len() && p.lexemes[next].kind == T![for]691 } {685 } {692 p.eat(T![,])?;686 p.eat(T![,])?;693 let specs = compspecs(p)?;687 let specs = compspecs(p)?;694 p.eat(T![']'])?;688 p.eat(T![']'])?;695 Ok(Expr::ArrComp(Rc::new(first), specs))689 Ok(Expr::ArrComp(Box::new(first), specs))696 } else {690 } else {697 let mut elems = vec![first];691 let mut elems = vec![first];698 while p.try_eat(T![,]) {692 while p.try_eat(T![,]) {702 elems.push(expr(p)?);696 elems.push(expr(p)?);703 }697 }704 p.eat(T![']'])?;698 p.eat(T![']'])?;705 Ok(Expr::Arr(Rc::new(elems)))699 Ok(Expr::Arr(elems))706 }700 }707 }701 }708702735 let ps = params(p)?;729 let ps = params(p)?;736 p.eat(T![')'])?;730 p.eat(T![')'])?;737 let body = expr(p)?;731 let body = expr(p)?;738 Ok(Expr::Function(ps, Rc::new(body)))732 Ok(Expr::Function(ps, Box::new(body)))739 }733 }740734741 T![assert] => {735 T![assert] => {742 let a = assert_stmt(p)?;736 let a = assert_stmt(p)?;743 p.eat(T![;])?;737 p.eat(T![;])?;744 let rest = expr(p)?;738 let rest = expr(p)?;745 Ok(Expr::AssertExpr(Rc::new(AssertExpr { assert: a, rest })))739 Ok(Expr::AssertExpr(Box::new(AssertExpr { assert: a, rest })))746 }740 }747741748 T![error] => {742 T![error] => {891 p.eat(T!['{'])?;885 p.eat(T!['{'])?;892 let body = objinside(p)?;886 let body = objinside(p)?;893 p.eat(T!['}'])?;887 p.eat(T!['}'])?;894 e = Expr::ObjExtend(Rc::new(e), body);888 e = Expr::ObjExtend(Box::new(e), body);895 } else {889 } else {896 break;890 break;897 }891 }1007 if let Some(desc) = lexeme.kind.error_description() {1001 if let Some(desc) = lexeme.kind.error_description() {1008 return Err(ParseError {1002 return Err(ParseError {1009 message: desc.to_owned(),1003 message: desc.to_owned(),1010 location: lexeme.range,1004 location: Span(p.source.clone(), lexeme.range.0, lexeme.range.1),1011 });1005 });1012 }1006 }1013 }1007 }crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__array_comp.snapdiffbeforeafterboth--- a/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__array_comp.snap
+++ b/crates/jrsonnet-ir-parser/src/snapshots/jrsonnet_ir_parser__tests__array_comp.snap
@@ -10,7 +10,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "x",
+ "x" from virtual:<test>:7-8,
),
over: Var(
"arr" from virtual:<test>:12-15,
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
@@ -10,13 +10,13 @@
exprs: [
ExprParam {
destruct: Full(
- "x",
+ "x" from virtual:<test>:8-9,
),
default: None,
},
ExprParam {
destruct: Full(
- "y",
+ "y" from virtual:<test>:11-12,
),
default: Some(
Num(
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
@@ -35,7 +35,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "x",
+ "x" from virtual:<test>:23-24,
),
over: Var(
"arr" from virtual:<test>:28-31,
@@ -52,7 +52,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "a",
+ "a" from virtual:<test>:41-42,
),
over: Var(
"b" from virtual:<test>:46-47,
@@ -70,7 +70,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "e",
+ "e" from virtual:<test>:57-58,
),
over: Var(
"f" from virtual:<test>:62-63,
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
@@ -11,7 +11,7 @@
exprs: [
ExprParam {
destruct: Full(
- "foo",
+ "foo" from virtual:<test>:8-11,
),
default: Some(
Str(
@@ -21,7 +21,7 @@
},
ExprParam {
destruct: Full(
- "bar",
+ "bar" from virtual:<test>:21-24,
),
default: None,
},
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
@@ -20,7 +20,7 @@
locals: [
Field {
into: Full(
- "x",
+ "x" from virtual:<test>:11-12,
),
value: Num(
1.0,
crates/jrsonnet-ir/src/expr.rsdiffbeforeafterboth--- a/crates/jrsonnet-ir/src/expr.rs
+++ b/crates/jrsonnet-ir/src/expr.rs
@@ -1,16 +1,15 @@
use std::{
fmt::{self, Debug, Display},
ops::{Deref, RangeInclusive},
- rc::Rc,
};
use jrsonnet_gcmodule::Acyclic;
use jrsonnet_interner::IStr;
use crate::{
- NumValue,
function::{FunctionSignature, ParamDefault, ParamName, ParamParse},
source::Source,
+ NumValue,
};
#[derive(Debug, PartialEq, Acyclic)]
@@ -50,7 +49,7 @@
pub plus: bool,
pub params: Option<ExprParams>,
pub visibility: Visibility,
- pub value: Rc<Expr>,
+ pub value: Expr,
}
#[derive(Debug, PartialEq, Acyclic)]
@@ -156,13 +155,13 @@
#[derive(Debug, PartialEq, Acyclic)]
pub struct ExprParam {
pub destruct: Destruct,
- pub default: Option<Rc<Expr>>,
+ pub default: Option<Expr>,
}
/// Defined function parameters
-#[derive(Debug, Clone, PartialEq, Acyclic)]
+#[derive(Debug, PartialEq, Acyclic)]
pub struct ExprParams {
- pub exprs: Rc<Vec<ExprParam>>,
+ pub exprs: Vec<ExprParam>,
pub signature: FunctionSignature,
pub(crate) binds_len: usize,
}
@@ -191,19 +190,19 @@
.collect(),
),
binds_len: exprs.iter().map(|v| v.destruct.binds_len()).sum(),
- exprs: Rc::new(exprs),
+ exprs,
}
}
}
#[derive(Debug, PartialEq, Acyclic)]
pub struct ArgsDesc {
- pub unnamed: Vec<Rc<Expr>>,
+ pub unnamed: Vec<Expr>,
pub names: Vec<IStr>,
- pub values: Vec<Rc<Expr>>,
+ pub values: Vec<Expr>,
}
impl ArgsDesc {
- pub fn new(unnamed: Vec<Rc<Expr>>, names: Vec<IStr>, values: Vec<Rc<Expr>>) -> Self {
+ pub fn new(unnamed: Vec<Expr>, names: Vec<IStr>, values: Vec<Expr>) -> Self {
Self {
unnamed,
names,
@@ -222,7 +221,7 @@
#[derive(Debug, Clone, PartialEq, Acyclic)]
pub enum Destruct {
- Full(IStr),
+ Full(Spanned<IStr>),
#[cfg(feature = "exp-destruct")]
Skip,
#[cfg(feature = "exp-destruct")]
@@ -242,7 +241,7 @@
/// Name of destructure, used for function parameter names
pub fn name(&self) -> ParamName {
match self {
- Self::Full(name) => ParamName::Named(name.clone()),
+ Self::Full(name) => ParamName::Named(name.value.clone()),
#[cfg(feature = "exp-destruct")]
_ => ParamName::Unnamed,
}
@@ -286,12 +285,12 @@
pub enum BindSpec {
Field {
into: Destruct,
- value: Rc<Expr>,
+ value: Expr,
},
Function {
name: IStr,
params: ExprParams,
- value: Rc<Expr>,
+ value: Expr,
},
}
impl BindSpec {
@@ -323,15 +322,15 @@
#[derive(Debug, PartialEq, Acyclic)]
pub struct ObjComp {
- pub locals: Rc<Vec<BindSpec>>,
- pub field: Rc<FieldMember>,
+ pub locals: Vec<BindSpec>,
+ pub field: Box<FieldMember>,
pub compspecs: Vec<CompSpec>,
}
#[derive(Debug, PartialEq, Acyclic)]
pub struct ObjMembers {
- pub locals: Rc<Vec<BindSpec>>,
- pub asserts: Rc<Vec<AssertStmt>>,
+ pub locals: Vec<BindSpec>,
+ pub asserts: Vec<AssertStmt>,
pub fields: Vec<FieldMember>,
}
@@ -371,7 +370,7 @@
pub rhs: Expr,
}
-#[derive(Debug, PartialEq, Acyclic)]
+#[derive(Debug, PartialEq, Acyclic, Clone, Copy)]
pub enum ImportKind {
Normal,
Str,
@@ -404,7 +403,7 @@
Var(Spanned<IStr>),
/// Array of expressions: [1, 2, "Hello"]
- Arr(Rc<Vec<Expr>>),
+ Arr(Vec<Expr>),
/// Array comprehension:
/// ```jsonnet
/// ingredients: [
@@ -416,19 +415,19 @@
/// ]
/// ],
/// ```
- ArrComp(Rc<Expr>, Vec<CompSpec>),
+ ArrComp(Box<Expr>, Vec<CompSpec>),
/// Object: {a: 2}
Obj(ObjBody),
/// Object extension: var1 {b: 2}
- ObjExtend(Rc<Expr>, ObjBody),
+ ObjExtend(Box<Expr>, ObjBody),
/// -2
UnaryOp(UnaryOpType, Box<Expr>),
/// 2 - 2
BinaryOp(Box<BinaryOp>),
/// assert 2 == 2 : "Math is broken"
- AssertExpr(Rc<AssertExpr>),
+ AssertExpr(Box<AssertExpr>),
/// local a = 2; { b: a }
LocalExpr(Vec<BindSpec>, Box<Expr>),
@@ -444,7 +443,7 @@
parts: Vec<IndexPart>,
},
/// function(x) x
- Function(ExprParams, Rc<Expr>),
+ Function(ExprParams, Box<Expr>),
/// if true == false then 1 else 2
IfElse(Box<IfElse>),
Slice(Box<Slice>),
crates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-peg-parser/src/lib.rs
+++ b/crates/jrsonnet-peg-parser/src/lib.rs
@@ -61,13 +61,13 @@
rule keyword(id: &'static str) -> ()
= #{|input, pos| input.parse_string_literal(pos, id)} end_of_ident()
- pub rule param(s: &ParserSettings) -> ExprParam = destruct:destruct(s) expr:(_ "=" _ expr:expr(s){expr})? { ExprParam { destruct, default: expr.map(Rc::new) } }
+ pub rule param(s: &ParserSettings) -> ExprParam = destruct:destruct(s) default:(_ "=" _ default:expr(s){default})? { ExprParam { destruct, default } }
pub rule params(s: &ParserSettings) -> ExprParams
= params:param(s) ** comma() comma()? { ExprParams::new(params) }
/ { ExprParams::new(Vec::new()) }
- pub rule arg(s: &ParserSettings) -> (Option<IStr>, Rc<Expr>)
- = name:(quiet! { (s:id() _ "=" !['='] _ {s})? } / expected!("<argument name>")) expr:expr(s) {(name, Rc::new(expr))}
+ pub rule arg(s: &ParserSettings) -> (Option<IStr>, Expr)
+ = name:(quiet! { (s:id() _ "=" !['='] _ {s})? } / expected!("<argument name>")) expr:expr(s) {(name, expr)}
pub rule args(s: &ParserSettings) -> ArgsDesc
= args:arg(s)**comma() comma()? {?
@@ -123,7 +123,7 @@
#[cfg(not(feature = "exp-destruct"))] Err("!!!experimental destructuring was not enabled")
}
pub rule destruct(s: &ParserSettings) -> Destruct
- = v:id() {Destruct::Full(v)}
+ = v:spanned(<id()>, s) {Destruct::Full(v)}
/ "?" {?
#[cfg(feature = "exp-destruct")] return Ok(Destruct::Skip);
#[cfg(not(feature = "exp-destruct"))] Err("!!!experimental destructuring was not enabled")
@@ -132,8 +132,8 @@
/ obj:destruct_object(s) {obj}
pub rule bind(s: &ParserSettings) -> BindSpec
- = into:destruct(s) _ "=" _ value:expr(s) {BindSpec::Field{into, value: Rc::new(value)}}
- / name:id() _ "(" _ params:params(s) _ ")" _ "=" _ value:expr(s) {BindSpec::Function{name, params, value: Rc::new(value)}}
+ = into:destruct(s) _ "=" _ value:expr(s) {BindSpec::Field{into, value}}
+ / name:id() _ "(" _ params:params(s) _ ")" _ "=" _ value:expr(s) {BindSpec::Function{name, params, value}}
pub rule assertion(s: &ParserSettings) -> AssertStmt
= keyword("assert") _ assertion:spanned(<expr(s)>, s) message:(_ ":" _ e:expr(s) {e})? { AssertStmt{assertion, message} }
@@ -187,14 +187,14 @@
plus: plus.is_some(),
params: None,
visibility,
- value: Rc::new(value),
+ value,
}}
/ name:spanned(<field_name(s)>, s) _ "(" _ params:params(s) _ ")" _ visibility:visibility() _ value:expr(s) {FieldMember{
name,
plus: false,
params: Some(params),
visibility,
- value: Rc::new(value),
+ value,
}}
pub rule obj_local(s: &ParserSettings) -> BindSpec
= keyword("local") _ bind:bind(s) {bind}
@@ -217,8 +217,8 @@
}
}
ObjBody::ObjComp(ObjComp {
- locals: Rc::new(locals),
- field: field.map(Rc::new).ok_or("<missing object comprehension field>")?,
+ locals,
+ field: Box::new(field.ok_or("<missing object comprehension field>")?),
compspecs
})
} else {
@@ -233,8 +233,8 @@
}
}
ObjBody::MemberList(ObjMembers {
- locals: Rc::new(locals),
- asserts: Rc::new(asserts),
+ locals,
+ asserts,
fields
})
})
@@ -259,10 +259,10 @@
pub rule obj_expr(s: &ParserSettings) -> Expr
= "{" _ body:objinside(s) _ "}" {Expr::Obj(body)}
pub rule array_expr(s: &ParserSettings) -> Expr
- = "[" _ elems:(expr(s) ** comma()) _ comma()? "]" {Expr::Arr(Rc::new(elems))}
+ = "[" _ elems:(expr(s) ** comma()) _ comma()? "]" {Expr::Arr(elems)}
pub rule array_comp_expr(s: &ParserSettings) -> Expr
= "[" _ expr:expr(s) _ comma()? _ specs:(r: compspecs(s) _ {r}) "]" {
- Expr::ArrComp(Rc::new(expr), specs)
+ Expr::ArrComp(Box::new(expr), specs)
}
pub rule number_expr(s: &ParserSettings) -> Expr
= n:number() {? if let Some(n) = NumValue::new(n) {
@@ -315,8 +315,8 @@
/ local_expr(s)
/ if_then_else_expr(s)
- / keyword("function") _ "(" _ params:params(s) _ ")" _ expr:expr(s) {Expr::Function(params, Rc::new(expr))}
- / assert:assertion(s) _ ";" _ rest:expr(s) { Expr::AssertExpr(Rc::new(AssertExpr{
+ / keyword("function") _ "(" _ params:params(s) _ ")" _ expr:expr(s) {Expr::Function(params, Box::new(expr))}
+ / assert:assertion(s) _ ";" _ rest:expr(s) { Expr::AssertExpr(Box::new(AssertExpr{
assert, rest
})) }
@@ -390,7 +390,7 @@
value:(@) _ "[" _ slice:slice_desc(s) _ "]" {Expr::Slice(Box::new(Slice{value, slice}))}
indexable:(@) _ parts:index_part(s)+ {Expr::Index{indexable: Box::new(indexable), parts}}
a:(@) _ args:spanned(<"(" _ a:args(s) _ ")" {a}>, s) ts:(_ keyword("tailstrict"))? {Expr::Apply(Box::new(a), args, ts.is_some())}
- a:(@) _ "{" _ body:objinside(s) _ "}" {Expr::ObjExtend(Rc::new(a), body)}
+ a:(@) _ "{" _ body:objinside(s) _ "}" {Expr::ObjExtend(Box::new(a), body)}
--
e:expr_basic(s) {e}
"(" _ e:expr(s) _ ")" {e}
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
@@ -35,7 +35,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "x",
+ "x" from virtual:<test>:23-24,
),
over: Var(
"arr" from virtual:<test>:28-31,
@@ -52,7 +52,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "a",
+ "a" from virtual:<test>:41-42,
),
over: Var(
"b" from virtual:<test>:46-47,
@@ -70,7 +70,7 @@
ForSpec(
ForSpecData {
destruct: Full(
- "e",
+ "e" from virtual:<test>:57-58,
),
over: Var(
"f" from virtual:<test>:62-63,
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
@@ -11,7 +11,7 @@
exprs: [
ExprParam {
destruct: Full(
- "foo",
+ "foo" from virtual:<test>:8-11,
),
default: Some(
Str(
@@ -21,7 +21,7 @@
},
ExprParam {
destruct: Full(
- "bar",
+ "bar" from virtual:<test>:21-24,
),
default: None,
},
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
@@ -20,7 +20,7 @@
locals: [
Field {
into: Full(
- "x",
+ "x" from virtual:<test>:11-12,
),
value: Num(
1.0,