sway_core/decl_engine/
parsed_id.rs1use super::{
2 parsed_engine::{ParsedDeclEngine, ParsedDeclEngineGet, ParsedDeclEngineIndex},
3 DeclUniqueId,
4};
5use crate::{
6 engine_threading::{
7 DebugWithEngines, EqWithEngines, HashWithEngines, PartialEqWithEngines,
8 PartialEqWithEnginesContext,
9 },
10 Engines,
11};
12use serde::{Deserialize, Serialize};
13use std::{
14 hash::{DefaultHasher, Hasher},
15 marker::PhantomData,
16 {fmt, hash::Hash},
17};
18use sway_types::{Named, Spanned};
19
20pub type ParsedDeclIdIndexType = usize;
21
22pub struct ParsedDeclId<T>(ParsedDeclIdIndexType, PhantomData<T>);
24
25impl<T> fmt::Debug for ParsedDeclId<T> {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 f.debug_tuple("ParsedDeclId").field(&self.0).finish()
28 }
29}
30
31impl<T> ParsedDeclId<T> {
32 pub(crate) fn inner(&self) -> ParsedDeclIdIndexType {
33 self.0
34 }
35
36 pub fn unique_id(&self) -> DeclUniqueId
37 where
38 T: 'static,
39 {
40 let mut hasher = DefaultHasher::default();
41 std::any::TypeId::of::<T>().hash(&mut hasher);
42 self.0.hash(&mut hasher);
43
44 DeclUniqueId(hasher.finish())
45 }
46}
47
48impl<T> Copy for ParsedDeclId<T> {}
49impl<T> Clone for ParsedDeclId<T> {
50 fn clone(&self) -> Self {
51 *self
52 }
53}
54
55impl<T> Eq for ParsedDeclId<T> {}
56impl<T> PartialEq for ParsedDeclId<T> {
57 fn eq(&self, other: &Self) -> bool {
58 self.0.eq(&other.0)
59 }
60}
61
62impl<T> DebugWithEngines for ParsedDeclId<T>
63where
64 ParsedDeclEngine: ParsedDeclEngineIndex<T>,
65 T: Named + Spanned + DebugWithEngines,
66{
67 fn fmt(&self, f: &mut fmt::Formatter<'_>, engines: &Engines) -> fmt::Result {
68 let decl = engines.pe().get(self);
69 DebugWithEngines::fmt(&decl, f, engines)
70 }
71}
72
73impl<T> EqWithEngines for ParsedDeclId<T> {}
74impl<T> PartialEqWithEngines for ParsedDeclId<T> {
75 fn eq(&self, other: &Self, _ctx: &PartialEqWithEnginesContext) -> bool {
76 self.0 == other.0
77 }
78}
79
80impl<T> Hash for ParsedDeclId<T> {
81 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
82 self.0.hash(state)
83 }
84}
85
86impl<T> HashWithEngines for ParsedDeclId<T>
87where
88 ParsedDeclEngine: ParsedDeclEngineIndex<T>,
89 T: Named + Spanned + HashWithEngines,
90{
91 fn hash<H: Hasher>(&self, state: &mut H, engines: &Engines) {
92 let decl_engine = engines.pe();
93 let decl = decl_engine.get(self);
94 decl.name().hash(state);
95 decl.hash(state, engines);
96 }
97}
98
99impl<T> PartialOrd for ParsedDeclId<T> {
100 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
101 Some(self.cmp(other))
102 }
103}
104impl<T> Ord for ParsedDeclId<T> {
105 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
106 self.0.cmp(&other.0)
107 }
108}
109
110impl<T> Serialize for ParsedDeclId<T> {
111 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
112 where
113 S: serde::Serializer,
114 {
115 self.0.serialize(serializer)
116 }
117}
118
119impl<'de, T> Deserialize<'de> for ParsedDeclId<T> {
120 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
121 where
122 D: serde::Deserializer<'de>,
123 {
124 let id = usize::deserialize(deserializer)?;
125 Ok(ParsedDeclId::new(id))
126 }
127}
128
129impl<T> ParsedDeclId<T> {
130 pub(crate) fn new(id: usize) -> Self {
131 ParsedDeclId(id, PhantomData)
132 }
133
134 #[allow(dead_code)]
135 pub(crate) fn replace_id(&mut self, index: Self) {
136 self.0 = index.0;
137 }
138
139 #[allow(dead_code)]
140 pub(crate) fn dummy() -> Self {
141 Self(usize::MAX, PhantomData)
143 }
144}
145
146#[allow(clippy::from_over_into)]
147impl<T> Into<usize> for ParsedDeclId<T> {
148 fn into(self) -> usize {
149 self.0
150 }
151}