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}