veryl_parser/
stringifier.rs1use crate::resource_table::StrId;
2use crate::veryl_grammar_trait::{HierarchicalIdentifier, Identifier};
3use crate::veryl_token::VerylToken;
4use crate::veryl_walker::VerylWalker;
5
6#[derive(Default)]
7pub struct Stringifier {
8 string: String,
9 ids: Vec<StrId>,
10}
11
12impl Stringifier {
13 pub fn new() -> Self {
14 Default::default()
15 }
16
17 pub fn as_str(&self) -> &str {
18 &self.string
19 }
20
21 pub fn ids(&self) -> &[StrId] {
22 &self.ids
23 }
24
25 pub fn hierarchical_identifier_with_prefix_suffix(
26 &mut self,
27 arg: &HierarchicalIdentifier,
28 prefix: &Option<String>,
29 suffix: &Option<String>,
30 ) {
31 let list_len = &arg.hierarchical_identifier_list0.len();
32
33 if *list_len == 0 {
34 self.identifier_with_prefix_suffix(&arg.identifier, prefix, suffix);
35 } else {
36 self.identifier(&arg.identifier);
37 }
38
39 for x in &arg.hierarchical_identifier_list {
40 self.select(&x.select);
41 }
42
43 for (i, x) in arg.hierarchical_identifier_list0.iter().enumerate() {
44 self.dot(&x.dot);
45 if (i + 1) == *list_len {
46 self.identifier_with_prefix_suffix(&x.identifier, prefix, suffix);
47 } else {
48 self.identifier(&x.identifier);
49 }
50 for x in &x.hierarchical_identifier_list0_list {
51 self.select(&x.select);
52 }
53 }
54 }
55
56 fn identifier_with_prefix_suffix(
57 &mut self,
58 identifier: &Identifier,
59 prefix: &Option<String>,
60 suffix: &Option<String>,
61 ) {
62 if prefix.is_some() || suffix.is_some() {
63 let token = identifier.identifier_token.append(prefix, suffix);
64 self.veryl_token(&token);
65 } else {
66 self.veryl_token(&identifier.identifier_token);
67 }
68 }
69}
70
71impl VerylWalker for Stringifier {
72 fn veryl_token(&mut self, arg: &VerylToken) {
74 self.string.push_str(&arg.to_string());
75 self.ids.push(arg.token.text);
76 }
77}