leo_ast/common/
identifier.rs1use crate::{Expression, Node, NodeID, simple_node_impl};
18
19use leo_span::{Span, Symbol};
20
21use snarkvm::{console::program::Identifier as IdentifierCore, prelude::Network};
22use std::{
23 fmt,
24 hash::{Hash, Hasher},
25};
26
27use serde::{Deserialize, Serialize};
28
29#[derive(Clone, Copy, Default, Serialize, Deserialize)]
35pub struct Identifier {
36 pub name: Symbol,
38 pub span: Span,
40 pub id: NodeID,
42}
43
44simple_node_impl!(Identifier);
45
46impl Identifier {
47 pub fn new(name: Symbol, id: NodeID) -> Self {
49 Self { name, span: Span::default(), id }
50 }
51
52 pub fn matches(&self, other: &Self) -> bool {
54 self.name == other.name
55 }
56}
57
58impl fmt::Display for Identifier {
59 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
60 self.name.fmt(f)
61 }
62}
63impl fmt::Debug for Identifier {
64 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65 self.name.fmt(f)
66 }
67}
68
69impl PartialEq for Identifier {
70 fn eq(&self, other: &Self) -> bool {
71 self.name == other.name && self.span == other.span
72 }
73}
74
75impl Eq for Identifier {}
76
77impl Hash for Identifier {
78 fn hash<H: Hasher>(&self, state: &mut H) {
79 self.name.hash(state);
80 self.span.hash(state);
81 }
82}
83
84impl<N: Network> From<&IdentifierCore<N>> for Identifier {
85 fn from(id: &IdentifierCore<N>) -> Self {
86 Self { name: Symbol::intern(&id.to_string()), span: Default::default(), id: Default::default() }
87 }
88}
89
90impl From<Identifier> for Expression {
91 fn from(value: Identifier) -> Self {
92 Expression::Identifier(value)
93 }
94}