1//! This code was generated using Zed Agent with Claude Opus 4.
2
3use gpui_macros::derive_inspector_reflection;
4
5#[derive_inspector_reflection]
6trait Transform: Clone {
7 /// Doubles the value
8 fn double(self) -> Self;
9
10 /// Triples the value
11 fn triple(self) -> Self;
12
13 /// Increments the value by one
14 ///
15 /// This method has a default implementation
16 fn increment(self) -> Self {
17 // Default implementation
18 self.add_one()
19 }
20
21 /// Quadruples the value by doubling twice
22 fn quadruple(self) -> Self {
23 // Default implementation with mut self
24 self.double().double()
25 }
26
27 // These methods will be filtered out:
28 #[allow(dead_code)]
29 fn add(&self, other: &Self) -> Self;
30 #[allow(dead_code)]
31 fn set_value(&mut self, value: i32);
32 #[allow(dead_code)]
33 fn get_value(&self) -> i32;
34
35 /// Adds one to the value
36 fn add_one(self) -> Self;
37
38 /// cfg attributes are respected
39 #[cfg(all())]
40 fn cfg_included(self) -> Self;
41
42 #[cfg(any())]
43 fn cfg_omitted(self) -> Self;
44}
45
46#[derive(Debug, Clone, PartialEq)]
47struct Number(i32);
48
49impl Transform for Number {
50 fn double(self) -> Self {
51 Number(self.0 * 2)
52 }
53
54 fn triple(self) -> Self {
55 Number(self.0 * 3)
56 }
57
58 fn add(&self, other: &Self) -> Self {
59 Number(self.0 + other.0)
60 }
61
62 fn set_value(&mut self, value: i32) {
63 self.0 = value;
64 }
65
66 fn get_value(&self) -> i32 {
67 self.0
68 }
69
70 fn add_one(self) -> Self {
71 Number(self.0 + 1)
72 }
73
74 fn cfg_included(self) -> Self {
75 Number(self.0)
76 }
77}
78
79#[test]
80fn test_derive_inspector_reflection() {
81 use transform_reflection::*;
82
83 // Get all methods that match the pattern fn(self) -> Self or fn(mut self) -> Self
84 let methods = methods::<Number>();
85
86 assert_eq!(methods.len(), 6);
87 let method_names: Vec<_> = methods.iter().map(|m| m.name).collect();
88 assert!(method_names.contains(&"double"));
89 assert!(method_names.contains(&"triple"));
90 assert!(method_names.contains(&"increment"));
91 assert!(method_names.contains(&"quadruple"));
92 assert!(method_names.contains(&"add_one"));
93 assert!(method_names.contains(&"cfg_included"));
94
95 // Invoke methods by name
96 let num = Number(5);
97
98 let doubled = find_method::<Number>("double").unwrap().invoke(num.clone());
99 assert_eq!(doubled, Number(10));
100
101 let tripled = find_method::<Number>("triple").unwrap().invoke(num.clone());
102 assert_eq!(tripled, Number(15));
103
104 let incremented = find_method::<Number>("increment")
105 .unwrap()
106 .invoke(num.clone());
107 assert_eq!(incremented, Number(6));
108
109 let quadrupled = find_method::<Number>("quadruple").unwrap().invoke(num);
110 assert_eq!(quadrupled, Number(20));
111
112 // Try to invoke a non-existent method
113 let result = find_method::<Number>("nonexistent");
114 assert!(result.is_none());
115
116 // Chain operations
117 let num = Number(10);
118 let result = find_method::<Number>("double")
119 .map(|m| m.invoke(num))
120 .and_then(|n| find_method::<Number>("increment").map(|m| m.invoke(n)))
121 .and_then(|n| find_method::<Number>("triple").map(|m| m.invoke(n)));
122
123 assert_eq!(result, Some(Number(63))); // (10 * 2 + 1) * 3 = 63
124
125 // Test documentationumentation capture
126 let double_method = find_method::<Number>("double").unwrap();
127 assert_eq!(double_method.documentation, Some("Doubles the value"));
128
129 let triple_method = find_method::<Number>("triple").unwrap();
130 assert_eq!(triple_method.documentation, Some("Triples the value"));
131
132 let increment_method = find_method::<Number>("increment").unwrap();
133 assert_eq!(
134 increment_method.documentation,
135 Some("Increments the value by one\n\nThis method has a default implementation")
136 );
137
138 let quadruple_method = find_method::<Number>("quadruple").unwrap();
139 assert_eq!(
140 quadruple_method.documentation,
141 Some("Quadruples the value by doubling twice")
142 );
143
144 let add_one_method = find_method::<Number>("add_one").unwrap();
145 assert_eq!(add_one_method.documentation, Some("Adds one to the value"));
146}