From f0ddcccd2c2a05d3408d546426abcc02f2b795f7 Mon Sep 17 00:00:00 2001 From: Eric Walkingshaw Date: Thu, 12 Aug 2021 11:33:32 -0700 Subject: [PATCH 1/3] Generate an Enter event for the initial state. --- framec/src/frame_c/visitors/rust_visitor.rs | 48 +++++++++++++-------- framec_tests/src/basic.rs | 3 +- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/framec/src/frame_c/visitors/rust_visitor.rs b/framec/src/frame_c/visitors/rust_visitor.rs index e72e3605..09b3b832 100644 --- a/framec/src/frame_c/visitors/rust_visitor.rs +++ b/framec/src/frame_c/visitors/rust_visitor.rs @@ -899,22 +899,14 @@ impl RustVisitor { &self.config.state_context_var_name, &self.config.state_context_var_name )); self.newline(); - self.add_code(&format!( - "let mut enter_event = {}::new({}::{}, None);", - self.config.frame_event_type_name, - self.config.frame_event_message_type_name, - self.config.enter_msg - )); - self.newline(); - } else { - self.add_code(&format!( - "let mut enter_event = {}::new({}::{}, None);", - self.config.frame_event_type_name, - self.config.frame_event_message_type_name, - self.config.enter_msg - )); - self.newline(); } + self.add_code(&format!( + "let mut enter_event = {}::new({}::{}, None);", + self.config.frame_event_type_name, + self.config.frame_event_message_type_name, + self.config.enter_msg + )); + self.newline(); self.add_code(&format!( "(self.{})(self, &mut enter_event);", &self.config.state_var_name @@ -2217,7 +2209,7 @@ impl AstVisitor for RustVisitor { } self.newline(); - self.add_code(&format!("{} {{", system_node.name)); + self.add_code(&format!("let mut machine = {} {{", system_node.name)); self.indent(); self.newline(); self.add_code(&format!( @@ -2262,10 +2254,30 @@ impl AstVisitor for RustVisitor { self.outdent(); self.newline(); - self.add_code(&format!("}}")); + self.add_code("};"); + self.newline(); + + // send enter event for initial state + self.add_code(&format!( + "let mut enter_event = {}::new({}::{}, None);", + self.config.frame_event_type_name, + self.config.frame_event_message_type_name, + self.config.enter_msg + )); + self.newline(); + self.add_code(&format!( + "{}::{}(&mut machine, &mut enter_event);", + system_node.name, + self.format_state_name(&self.first_state_name) + )); + self.newline(); + + // return the new machine + self.add_code("machine"); + self.outdent(); self.newline(); - self.add_code(&format!("}}")); + self.add_code("}"); self.newline(); } diff --git a/framec_tests/src/basic.rs b/framec_tests/src/basic.rs index 4b6d224d..3e405952 100644 --- a/framec_tests/src/basic.rs +++ b/framec_tests/src/basic.rs @@ -18,10 +18,9 @@ mod tests { // Revisit: currently generated code doesn't send entry event to state machine's initial // state on creation #[test] - #[ignore] fn intial_state_entry_call() { let sm = Basic::new(); - assert_eq!(sm.entry_log, vec!["S1"]); + assert_eq!(sm.entry_log, vec!["S0"]); } #[test] From 08ae0c81049e04d8a551e112bf8cb8d38b3dc3d9 Mon Sep 17 00:00:00 2001 From: Eric Walkingshaw Date: Thu, 12 Aug 2021 14:46:45 -0700 Subject: [PATCH 2/3] Move initial enter event into separate initialize() method. --- framec/src/frame_c/default_config.yaml | 1 + framec/src/frame_c/visitors/rust_visitor.rs | 53 +++++++++++++++------ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/framec/src/frame_c/default_config.yaml b/framec/src/frame_c/default_config.yaml index 67692c3a..a06dfddb 100644 --- a/framec/src/frame_c/default_config.yaml +++ b/framec/src/frame_c/default_config.yaml @@ -40,6 +40,7 @@ codegen: state_var_name_suffix: _state state_enum_suffix: State state_enum_traits: Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord + initialize_method_name: initialize transition_method_name: transition change_state_method_name: change_state transition_hook_method_name: transition_hook diff --git a/framec/src/frame_c/visitors/rust_visitor.rs b/framec/src/frame_c/visitors/rust_visitor.rs index 09b3b832..cc821c9f 100644 --- a/framec/src/frame_c/visitors/rust_visitor.rs +++ b/framec/src/frame_c/visitors/rust_visitor.rs @@ -48,6 +48,7 @@ struct Config { state_var_name_suffix: String, state_enum_suffix: String, state_enum_traits: String, + initialize_method_name: String, transition_method_name: String, change_state_method_name: String, transition_hook_method_name: Option, @@ -215,6 +216,10 @@ impl Config { .as_str() .unwrap_or_default() .to_string(), + initialize_method_name: (&code_yaml["initialize_method_name"]) + .as_str() + .unwrap_or_default() + .to_string(), transition_method_name: (&code_yaml["transition_method_name"]) .as_str() .unwrap_or_default() @@ -2161,9 +2166,11 @@ impl AstVisitor for RustVisitor { None => {} } - // generate constructor - if self.has_states { + + // generate constructor + + self.newline(); self.add_code(&format!("pub fn new() -> {} {{", system_node.name)); self.indent(); @@ -2255,34 +2262,50 @@ impl AstVisitor for RustVisitor { self.outdent(); self.newline(); self.add_code("};"); + + // run the initialize method on the new machine self.newline(); - - // send enter event for initial state self.add_code(&format!( - "let mut enter_event = {}::new({}::{}, None);", + "machine.{}();", + self.config.initialize_method_name + )); + self.newline(); + + // return the new machine + self.add_code("machine"); + + self.outdent(); + self.newline(); + self.add_code("}"); + self.newline(); + + // end of generate constructor + + // generate initialize method + self.newline(); + self.add_code(&format!( + "pub fn {}(&mut self) {{", + self.config.initialize_method_name + )); + self.indent(); + self.newline(); + self.add_code(&format!( + "let mut e = {}::new({}::{}, None);", self.config.frame_event_type_name, self.config.frame_event_message_type_name, self.config.enter_msg )); self.newline(); self.add_code(&format!( - "{}::{}(&mut machine, &mut enter_event);", - system_node.name, - self.format_state_name(&self.first_state_name) + "(self.{})(self, &mut e);", + &self.config.state_var_name )); - self.newline(); - - // return the new machine - self.add_code("machine"); - self.outdent(); self.newline(); self.add_code("}"); self.newline(); } - // end of generate constructor - self.serialize.push("".to_string()); self.serialize.push("Bag _serialize__do() {".to_string()); From 62d7b7f17d0e555cf156051c8d3ea5c4876fd30a Mon Sep 17 00:00:00 2001 From: Eric Walkingshaw Date: Thu, 12 Aug 2021 15:25:11 -0700 Subject: [PATCH 3/3] Make Rustfmt happy. --- framec/src/frame_c/visitors/rust_visitor.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framec/src/frame_c/visitors/rust_visitor.rs b/framec/src/frame_c/visitors/rust_visitor.rs index cc821c9f..c1e990dc 100644 --- a/framec/src/frame_c/visitors/rust_visitor.rs +++ b/framec/src/frame_c/visitors/rust_visitor.rs @@ -2167,7 +2167,6 @@ impl AstVisitor for RustVisitor { } if self.has_states { - // generate constructor self.newline(); @@ -2278,7 +2277,7 @@ impl AstVisitor for RustVisitor { self.newline(); self.add_code("}"); self.newline(); - + // end of generate constructor // generate initialize method