Skip to content

Commit f16ee76

Browse files
authored
fix: codegen per-field show/hide blocks for struct-typed lists and vars (#284)
closes #283
2 parents 9a6377b + 6558d4c commit f16ee76

3 files changed

Lines changed: 53 additions & 13 deletions

File tree

src/codegen/sb3.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,8 +1183,8 @@ where T: Write + Seek
11831183
is_cloud,
11841184
} => self.set_var(s, d, this_id, name, value, type_, is_local, is_cloud),
11851185
Stmt::ChangeVar { name, value } => self.change_var(s, d, this_id, name, value),
1186-
Stmt::Show(name) => self.show(s, d, name),
1187-
Stmt::Hide(name) => self.hide(s, d, name),
1186+
Stmt::Show(name) => self.show_or_hide_monitor(s, d, name),
1187+
Stmt::Hide(name) => self.show_or_hide_monitor(s, d, name),
11881188
Stmt::AddToList { name, value } => self.add_to_list(s, d, this_id, name, value),
11891189
Stmt::DeleteListIndex { name, index } => {
11901190
self.delete_list_index(s, d, this_id, name, index)

src/codegen/stmt.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,23 +178,23 @@ where T: Write + Seek
178178
self.expr(s, d, value, value_id, this_id)
179179
}
180180

181-
pub fn show(&mut self, s: S, d: D, name: &Name) -> io::Result<()> {
182-
self.begin_inputs()?;
183-
self.end_obj()?; // inputs
181+
pub fn show_or_hide_monitor(&mut self, s: S, d: D, name: &Name) -> io::Result<()> {
184182
match s.qualify_name(Some(d), name) {
185183
Some(QualifiedName::Var(qualified_name, _)) => {
186-
self.single_field_id("VARIABLE", &qualified_name)?
184+
self.begin_inputs()?;
185+
self.end_obj()?; // inputs
186+
self.single_field_id("VARIABLE", &qualified_name)?;
187+
self.end_obj()?; // node
187188
}
188189
Some(QualifiedName::List(qualified_name, _)) => {
189-
self.single_field_id("LIST", &qualified_name)?
190+
self.begin_inputs()?;
191+
self.end_obj()?; // inputs
192+
self.single_field_id("LIST", &qualified_name)?;
193+
self.end_obj()?; // node
190194
}
191-
None => {}
195+
_ => {}
192196
}
193-
self.end_obj() // node
194-
}
195-
196-
pub fn hide(&mut self, s: S, d: D, name: &Name) -> io::Result<()> {
197-
self.show(s, d, name)
197+
Ok(())
198198
}
199199

200200
pub fn add_to_list(

src/visitor/pass2.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ fn visit_stmts(stmts: &mut Vec<Stmt>, s: S, d: D, top_level: bool) {
197197
let mut i = 0;
198198
while i < stmts.len() {
199199
let replace = match &stmts[i] {
200+
Stmt::Show(name) => visit_show_or_hide_monitor(name, s, d, true),
201+
Stmt::Hide(name) => visit_show_or_hide_monitor(name, s, d, false),
200202
Stmt::SetVar {
201203
name,
202204
value,
@@ -729,3 +731,41 @@ fn const_struct_literal(
729731
}
730732
}
731733
}
734+
735+
fn visit_show_or_hide_monitor(name: &Name, s: S, _d: D, is_show: bool) -> Option<Vec<Stmt>> {
736+
if name.fieldname().is_some() {
737+
return None;
738+
}
739+
let basename = name.basename();
740+
let type_ = s
741+
.get_list(basename)
742+
.map(|list| &list.type_)
743+
.or_else(|| s.get_var(basename).map(|var| &var.type_))?;
744+
let (type_name, _) = type_.struct_()?;
745+
let struct_ = s.get_struct(type_name)?;
746+
Some(
747+
struct_
748+
.fields
749+
.iter()
750+
.map(|field| {
751+
if is_show {
752+
Stmt::Show(Name::DotName {
753+
lhs: name.basename().clone(),
754+
lhs_span: name.basespan().clone(),
755+
rhs: field.name.clone(),
756+
rhs_span: field.span.clone(),
757+
is_generated: true,
758+
})
759+
} else {
760+
Stmt::Hide(Name::DotName {
761+
lhs: name.basename().clone(),
762+
lhs_span: name.basespan().clone(),
763+
rhs: field.name.clone(),
764+
rhs_span: field.span.clone(),
765+
is_generated: true,
766+
})
767+
}
768+
})
769+
.collect(),
770+
)
771+
}

0 commit comments

Comments
 (0)