1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5use crate::bindgen::ir::Path;
6use std::collections::hash_map::Entry;
7use std::collections::HashMap;
8
9impl DeclarationType {
10 pub fn to_str(self) -> &'static str {
11 match self {
12 DeclarationType::Struct => "struct",
13 DeclarationType::Enum => "enum",
14 DeclarationType::Union => "union",
15 }
16 }
17}
18
19#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
20pub enum DeclarationType {
21 Struct,
22 Enum,
23 Union,
24}
25
26#[derive(Default)]
27pub struct DeclarationTypeResolver {
28 types: HashMap<Path, Option<DeclarationType>>,
29}
30
31impl DeclarationTypeResolver {
32 fn insert(&mut self, path: &Path, ty: Option<DeclarationType>) {
33 if let Entry::Vacant(vacant_entry) = self.types.entry(path.clone()) {
34 vacant_entry.insert(ty);
35 }
36 }
37
38 pub fn add_enum(&mut self, path: &Path) {
39 self.insert(path, Some(DeclarationType::Enum));
40 }
41
42 pub fn add_struct(&mut self, path: &Path) {
43 self.insert(path, Some(DeclarationType::Struct));
44 }
45
46 pub fn add_union(&mut self, path: &Path) {
47 self.insert(path, Some(DeclarationType::Union));
48 }
49
50 pub fn add_none(&mut self, path: &Path) {
51 self.insert(path, None);
52 }
53
54 pub fn type_for(&self, path: &Path) -> Option<DeclarationType> {
55 *self.types.get(path)?
56 }
57}
58