git.delta.rocks / jrsonnet / refs/commits / 1b7795b5f1ce

difftreelog

feat destructure in comprehensions

Yaroslav Bolyukin2022-11-09parent: #c3b4574.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
8};8};
9use jrsonnet_types::ValType;9use jrsonnet_types::ValType;
1010
11use self::destructure::destruct;
11use crate::{12use crate::{
12 destructure::evaluate_dest,13 destructure::evaluate_dest,
13 error::Error::*,14 error::Error::*,
63 }64 }
64 Some(CompSpec::ForSpec(ForSpecData(var, expr))) => match evaluate(ctx.clone(), expr)? {65 Some(CompSpec::ForSpec(ForSpecData(var, expr))) => match evaluate(ctx.clone(), expr)? {
65 Val::Arr(list) => {66 Val::Arr(list) => {
66 for item in list.iter() {67 for item in list.iter_lazy() {
68 let fctx = Pending::new();
69 let mut new_bindings = GcHashMap::new();
70 destruct(var, item, fctx.clone(), &mut new_bindings)?;
71 let ctx = ctx
72 .clone()
73 .extend(new_bindings, None, None, None)
74 .into_future(fctx);
75
67 evaluate_comp(76 evaluate_comp(ctx, &specs[1..], callback)?;
68 ctx.clone().with_var(var.clone(), item?.clone()),
69 &specs[1..],
70 callback,
71 )?;
72 }77 }
73 }78 }
78}83}
7984
80trait CloneableUnbound<T>: Unbound<Bound = T> + Clone {}85trait CloneableUnbound<T>: Unbound<Bound = T> + Clone {}
86impl<V, T> CloneableUnbound<T> for V where V: Unbound<Bound = T> + Clone {}
8187
82fn evaluate_object_locals(88fn evaluate_object_locals(
83 fctx: Pending<Context>,89 fctx: Pending<Context>,
88 fctx: Pending<Context>,94 fctx: Pending<Context>,
89 locals: Rc<Vec<BindSpec>>,95 locals: Rc<Vec<BindSpec>>,
90 }96 }
91 impl CloneableUnbound<Context> for UnboundLocals {}
92 impl Unbound for UnboundLocals {97 impl Unbound for UnboundLocals {
93 type Bound = Context;98 type Bound = Context;
9499
117 builder: &mut ObjValueBuilder,122 builder: &mut ObjValueBuilder,
118 ctx: Context,123 ctx: Context,
119 uctx: B,124 uctx: B,
120 member: &FieldMember,125 field: &FieldMember,
121) -> Result<()> {126) -> Result<()> {
127 let name = evaluate_field_name(ctx.clone(), &field.name)?;
128 let Some(name) = name else {
129 return Ok(());
130 };
131
122 match member {132 match field {
123 FieldMember {133 FieldMember {
124 name,
125 plus,134 plus,
126 params: None,135 params: None,
127 visibility,136 visibility,
128 value,137 value,
138 ..
129 } => {139 } => {
130 #[derive(Trace)]140 #[derive(Trace)]
131 struct UnboundValue<B: Trace> {141 struct UnboundValue<B: Trace> {
144 }154 }
145 }155 }
146
147 let name = evaluate_field_name(ctx.clone(), name)?;
148 let Some(name) = name else {
149 return Ok(());
150 };
151156
152 builder157 builder
153 .member(name.clone())158 .member(name.clone())
161 }))?;166 }))?;
162 }167 }
163 FieldMember {168 FieldMember {
164 name,
165 params: Some(params),169 params: Some(params),
166 value,170 value,
167 ..171 ..
185 }189 }
186 }190 }
187
188 let Some(name) = evaluate_field_name(ctx.clone(), name)? else {
189 return Ok(());
190 };
191191
192 builder192 builder
193 .member(name.clone())193 .member(name.clone())
227 Member::Field(field) => {227 Member::Field(field) => {
228 evaluate_field_member(&mut builder, ctx.clone(), uctx.clone(), &field)?228 evaluate_field_member(&mut builder, ctx.clone(), uctx.clone(), &field)?
229 }229 }
230 Member::BindStmt(_) => {
231 // Already handled
232 }
233 Member::AssertStmt(stmt) => {230 Member::AssertStmt(stmt) => {
234 #[derive(Trace)]231 #[derive(Trace)]
235 struct ObjectAssert<B: Trace> {232 struct ObjectAssert<B: Trace> {
247 assert: stmt.clone(),244 assert: stmt.clone(),
248 }));245 }));
249 }246 }
247 Member::BindStmt(_) => {
248 // Already handled
249 }
250 }250 }
251 }251 }
252 let this = builder.build();252 let this = builder.build();
modifiedcrates/jrsonnet-parser/src/expr.rsdiffbeforeafterboth
--- a/crates/jrsonnet-parser/src/expr.rs
+++ b/crates/jrsonnet-parser/src/expr.rs
@@ -253,7 +253,7 @@
 #[cfg_attr(feature = "structdump", derive(Codegen))]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[derive(Debug, PartialEq, Trace)]
-pub struct ForSpecData(pub IStr, pub LocExpr);
+pub struct ForSpecData(pub Destruct, pub LocExpr);
 
 #[cfg_attr(feature = "structdump", derive(Codegen))]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
modifiedcrates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-parser/src/lib.rs
+++ b/crates/jrsonnet-parser/src/lib.rs
@@ -208,7 +208,7 @@
 		pub rule ifspec(s: &ParserSettings) -> IfSpecData
 			= keyword("if") _ expr:expr(s) {IfSpecData(expr)}
 		pub rule forspec(s: &ParserSettings) -> ForSpecData
-			= keyword("for") _ id:id() _ keyword("in") _ cond:expr(s) {ForSpecData(id, cond)}
+			= keyword("for") _ id:destruct(s) _ keyword("in") _ cond:expr(s) {ForSpecData(id, cond)}
 		pub rule compspec(s: &ParserSettings) -> Vec<expr::CompSpec>
 			= s:(i:ifspec(s) { expr::CompSpec::IfSpec(i) } / f:forspec(s) {expr::CompSpec::ForSpec(f)} ) ** _ {s}
 		pub rule local_expr(s: &ParserSettings) -> Expr
@@ -620,7 +620,7 @@
 						16
 					),
 					vec![CompSpec::ForSpec(ForSpecData(
-						"x".into(),
+						Destruct::Full("x".into()),
 						el!(Var("arr".into()), 26, 29)
 					))]
 				),