sway_core/decl_engine/
parsed_id.rs

1use 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
22/// An ID used to refer to an item in the [ParsedDeclEngine](super::decl_engine::ParsedDeclEngine)
23pub 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        // we assume that `usize::MAX` id is not possible in practice
142        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}