hugr_llvm/emit/
namer.rs

1use hugr_core::{Node, NodeIndex as _};
2
3/// A type with features for mangling the naming of symbols.
4#[derive(Clone)]
5pub struct Namer {
6    prefix: String,
7    postfix_node: bool,
8}
9
10impl Namer {
11    /// The [Default] impl of `Namer` uses this as a prefix.
12    pub const DEFAULT_PREFIX: &'static str = "_hl.";
13
14    /// Create a new `Namer` that for each symbol:
15    /// * prefixes `prefix`
16    /// * if `post_fix_node` is true, postfixes ".{`node.index()`}"
17    ///
18    /// # Example
19    ///
20    /// ```
21    /// use hugr_llvm::emit::Namer;
22    /// use hugr_core::Node;
23    /// let node = Node::from(portgraph::NodeIndex::new(7));
24    /// let namer = Namer::default();
25    /// assert_eq!(namer.name_func("name", node), "_hl.name.7");
26    ///
27    /// let namer = Namer::new("prefix.", false);
28    /// assert_eq!(namer.name_func("name", node), "prefix.name")
29    /// ```
30    pub fn new(prefix: impl Into<String>, postfix_node: bool) -> Self {
31        Self {
32            prefix: prefix.into(),
33            postfix_node,
34        }
35    }
36
37    /// Mangle the the name of a [`hugr_core::ops::FuncDefn`] or [`hugr_core::ops::FuncDecl`].
38    pub fn name_func(&self, name: impl AsRef<str>, node: Node) -> String {
39        let prefix = &self.prefix;
40        let name = name.as_ref();
41        let postfix = if self.postfix_node {
42            format!(".{}", node.index())
43        } else {
44            String::new()
45        };
46        format!("{prefix}{name}{postfix}")
47    }
48}
49
50impl Default for Namer {
51    fn default() -> Self {
52        Self::new(Self::DEFAULT_PREFIX, true)
53    }
54}