derive_inspector_reflection.rs

  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}