borrowscope_runtime/tracker/
expressions.rs

1//! Expression tracking: index, field access, calls, operators
2
3use super::TRACKER;
4
5pub fn track_index_access(
6    #[cfg_attr(not(feature = "track"), allow(unused_variables))] access_id: usize,
7    #[cfg_attr(not(feature = "track"), allow(unused_variables))] container: &str,
8    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
9) {
10    #[cfg(feature = "track")]
11    {
12        let mut tracker = TRACKER.lock();
13        tracker.record_index_access(access_id, container, location);
14    }
15}
16
17/// Track field access
18#[inline(always)]
19pub fn track_field_access(
20    #[cfg_attr(not(feature = "track"), allow(unused_variables))] access_id: usize,
21    #[cfg_attr(not(feature = "track"), allow(unused_variables))] base: &str,
22    #[cfg_attr(not(feature = "track"), allow(unused_variables))] field: &str,
23    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
24) {
25    #[cfg(feature = "track")]
26    {
27        let mut tracker = TRACKER.lock();
28        tracker.record_field_access(access_id, base, field, location);
29    }
30}
31
32/// Track function call
33#[inline(always)]
34pub fn track_call(
35    #[cfg_attr(not(feature = "track"), allow(unused_variables))] call_id: usize,
36    #[cfg_attr(not(feature = "track"), allow(unused_variables))] fn_name: &str,
37    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
38) {
39    #[cfg(feature = "track")]
40    {
41        let mut tracker = TRACKER.lock();
42        tracker.record_call(call_id, fn_name, location);
43    }
44}
45
46/// Track lock acquisition (Mutex/RwLock)
47#[inline(always)]
48pub fn track_lock(
49    #[cfg_attr(not(feature = "track"), allow(unused_variables))] lock_id: usize,
50    #[cfg_attr(not(feature = "track"), allow(unused_variables))] lock_type: &str,
51    #[cfg_attr(not(feature = "track"), allow(unused_variables))] var_name: &str,
52    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
53) {
54    #[cfg(feature = "track")]
55    {
56        let mut tracker = TRACKER.lock();
57        tracker.record_lock(lock_id, lock_type, var_name, location);
58    }
59}
60
61/// Track unwrap call (Option/Result)
62#[inline(always)]
63pub fn track_unwrap(
64    #[cfg_attr(not(feature = "track"), allow(unused_variables))] unwrap_id: usize,
65    #[cfg_attr(not(feature = "track"), allow(unused_variables))] method: &str,
66    #[cfg_attr(not(feature = "track"), allow(unused_variables))] var_name: &str,
67    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
68) {
69    #[cfg(feature = "track")]
70    {
71        let mut tracker = TRACKER.lock();
72        tracker.record_unwrap(unwrap_id, method, var_name, location);
73    }
74}
75
76/// Track clone call
77#[inline(always)]
78pub fn track_clone(
79    #[cfg_attr(not(feature = "track"), allow(unused_variables))] clone_id: usize,
80    #[cfg_attr(not(feature = "track"), allow(unused_variables))] var_name: &str,
81    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
82) {
83    #[cfg(feature = "track")]
84    {
85        let mut tracker = TRACKER.lock();
86        tracker.record_clone(clone_id, var_name, location);
87    }
88}
89
90/// Track dereference operation
91#[inline(always)]
92pub fn track_deref(
93    #[cfg_attr(not(feature = "track"), allow(unused_variables))] deref_id: usize,
94    #[cfg_attr(not(feature = "track"), allow(unused_variables))] var_name: &str,
95    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
96) {
97    #[cfg(feature = "track")]
98    {
99        let mut tracker = TRACKER.lock();
100        tracker.record_deref(deref_id, var_name, location);
101    }
102}
103
104pub fn track_closure_create(
105    #[cfg_attr(not(feature = "track"), allow(unused_variables))] closure_id: usize,
106    #[cfg_attr(not(feature = "track"), allow(unused_variables))] capture_mode: &str,
107    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
108) {
109    #[cfg(feature = "track")]
110    {
111        let mut tracker = TRACKER.lock();
112        tracker.record_closure_create(closure_id, capture_mode, location);
113    }
114}
115
116/// Track struct creation
117#[inline(always)]
118pub fn track_struct_create(
119    #[cfg_attr(not(feature = "track"), allow(unused_variables))] struct_id: usize,
120    #[cfg_attr(not(feature = "track"), allow(unused_variables))] struct_name: &str,
121    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
122) {
123    #[cfg(feature = "track")]
124    {
125        let mut tracker = TRACKER.lock();
126        tracker.record_struct_create(struct_id, struct_name, location);
127    }
128}
129
130/// Track tuple creation
131#[inline(always)]
132pub fn track_tuple_create(
133    #[cfg_attr(not(feature = "track"), allow(unused_variables))] tuple_id: usize,
134    #[cfg_attr(not(feature = "track"), allow(unused_variables))] arity: usize,
135    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
136) {
137    #[cfg(feature = "track")]
138    {
139        let mut tracker = TRACKER.lock();
140        tracker.record_tuple_create(tuple_id, arity, location);
141    }
142}
143
144/// Track let-else divergence
145#[inline(always)]
146pub fn track_let_else(
147    #[cfg_attr(not(feature = "track"), allow(unused_variables))] let_else_id: usize,
148    #[cfg_attr(not(feature = "track"), allow(unused_variables))] pattern: &str,
149    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
150) {
151    #[cfg(feature = "track")]
152    {
153        let mut tracker = TRACKER.lock();
154        tracker.record_let_else(let_else_id, pattern, location);
155    }
156}
157
158/// Track range expression
159#[inline(always)]
160pub fn track_range(
161    #[cfg_attr(not(feature = "track"), allow(unused_variables))] range_id: usize,
162    #[cfg_attr(not(feature = "track"), allow(unused_variables))] range_type: &str,
163    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
164) {
165    #[cfg(feature = "track")]
166    {
167        let mut tracker = TRACKER.lock();
168        tracker.record_range(range_id, range_type, location);
169    }
170}
171
172/// Track binary operation
173#[inline(always)]
174pub fn track_binary_op(
175    #[cfg_attr(not(feature = "track"), allow(unused_variables))] op_id: usize,
176    #[cfg_attr(not(feature = "track"), allow(unused_variables))] operator: &str,
177    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
178) {
179    #[cfg(feature = "track")]
180    {
181        let mut tracker = TRACKER.lock();
182        tracker.record_binary_op(op_id, operator, location);
183    }
184}
185
186/// Track array creation
187#[inline(always)]
188pub fn track_array_create(
189    #[cfg_attr(not(feature = "track"), allow(unused_variables))] array_id: usize,
190    #[cfg_attr(not(feature = "track"), allow(unused_variables))] length: usize,
191    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
192) {
193    #[cfg(feature = "track")]
194    {
195        let mut tracker = TRACKER.lock();
196        tracker.record_array_create(array_id, length, location);
197    }
198}
199
200/// Track type cast
201#[inline(always)]
202pub fn track_type_cast(
203    #[cfg_attr(not(feature = "track"), allow(unused_variables))] cast_id: usize,
204    #[cfg_attr(not(feature = "track"), allow(unused_variables))] target_type: &str,
205    #[cfg_attr(not(feature = "track"), allow(unused_variables))] location: &str,
206) {
207    #[cfg(feature = "track")]
208    {
209        let mut tracker = TRACKER.lock();
210        tracker.record_type_cast(cast_id, target_type, location);
211    }
212}