1use super::{HandleSet, ModuleMap};
2use crate::Handle;
3
4pub struct TypeTracer<'a> {
5 pub overrides: &'a crate::Arena<crate::Override>,
6 pub types_used: &'a mut HandleSet<crate::Type>,
7 pub expressions_used: &'a mut HandleSet<crate::Expression>,
8 pub overrides_used: &'a mut HandleSet<crate::Override>,
9}
10
11impl TypeTracer<'_> {
12 pub fn trace_type(&mut self, ty: &crate::Type) {
13 use crate::TypeInner as Ti;
14 match ty.inner {
15 Ti::Scalar { .. }
17 | Ti::Vector { .. }
18 | Ti::Matrix { .. }
19 | Ti::Atomic { .. }
20 | Ti::ValuePointer { .. }
21 | Ti::Image { .. }
22 | Ti::Sampler { .. }
23 | Ti::AccelerationStructure { .. }
24 | Ti::RayQuery { .. } => {}
25
26 Ti::Array {
28 base,
29 size,
30 stride: _,
31 }
32 | Ti::BindingArray { base, size } => {
33 self.types_used.insert(base);
34 match size {
35 crate::ArraySize::Pending(handle) => {
36 self.overrides_used.insert(handle);
37 let r#override = &self.overrides[handle];
38 self.types_used.insert(r#override.ty);
39 if let Some(expr) = r#override.init {
40 self.expressions_used.insert(expr);
41 }
42 }
43 crate::ArraySize::Constant(_) | crate::ArraySize::Dynamic => {}
44 }
45 }
46 Ti::Pointer { base, space: _ } => {
47 self.types_used.insert(base);
48 }
49 Ti::Struct {
50 ref members,
51 span: _,
52 } => {
53 self.types_used.insert_iter(members.iter().map(|m| m.ty));
54 }
55 }
56 }
57}
58
59impl ModuleMap {
60 pub fn adjust_type(&self, ty: &mut crate::Type) {
61 let adjust = |ty: &mut Handle<crate::Type>| self.types.adjust(ty);
62
63 use crate::TypeInner as Ti;
64 match ty.inner {
65 Ti::Scalar(_)
67 | Ti::Vector { .. }
68 | Ti::Matrix { .. }
69 | Ti::Atomic(_)
70 | Ti::ValuePointer { .. }
71 | Ti::Image { .. }
72 | Ti::Sampler { .. }
73 | Ti::AccelerationStructure { .. }
74 | Ti::RayQuery { .. } => {}
75
76 Ti::Pointer {
78 ref mut base,
79 space: _,
80 } => adjust(base),
81 Ti::Array {
82 ref mut base,
83 ref mut size,
84 stride: _,
85 }
86 | Ti::BindingArray {
87 ref mut base,
88 ref mut size,
89 } => {
90 adjust(base);
91 match *size {
92 crate::ArraySize::Pending(ref mut r#override) => {
93 self.overrides.adjust(r#override);
94 }
95 crate::ArraySize::Constant(_) | crate::ArraySize::Dynamic => {}
96 }
97 }
98 Ti::Struct {
99 ref mut members,
100 span: _,
101 } => {
102 for member in members {
103 self.types.adjust(&mut member.ty);
104 }
105 }
106 };
107 }
108}