difftreelog
feat destructure in comprehensions
in: master
3 files changed
crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth8};8};9use jrsonnet_types::ValType;9use jrsonnet_types::ValType;101011use 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 = ctx72 .clone()73 .extend(new_bindings, None, None, None)74 .into_future(fctx);7567 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}798480trait 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 {}818782fn 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;9499117 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 };131122 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 }146147 let name = evaluate_field_name(ctx.clone(), name)?;148 let Some(name) = name else {149 return Ok(());150 };151156152 builder157 builder153 .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 }187188 let Some(name) = evaluate_field_name(ctx.clone(), name)? else {189 return Ok(());190 };191191192 builder192 builder193 .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 handled232 }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 handled249 }250 }250 }251 }251 }252 let this = builder.build();252 let this = builder.build();crates/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))]
crates/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)
))]
),