1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
use super::*; pub enum Gen { Absolute, Relative(&'static str), } impl Gen { pub fn namespace(&self, namespace: &str) -> TokenStream { match self { Self::Absolute => { let mut tokens = TokenStream::new(); for namespace in namespace.split('.') { let namespace = to_ident(namespace); tokens.combine("e! { #namespace:: }); } tokens } Self::Relative(relative) => { if namespace == *relative { return TokenStream::new(); } let mut relative = relative.split('.').peekable(); let mut namespace = namespace.split('.').peekable(); while relative.peek() == namespace.peek() { if relative.next().is_none() { break; } namespace.next(); } let mut tokens = TokenStream::new(); for _ in 0..relative.count() { tokens.push_str("super::"); } for namespace in namespace { tokens.push_str(namespace); tokens.push_str("::"); } tokens } } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_namespace() { let reader = TypeReader::get(); let t = reader.resolve_type("Windows.Foundation", "IStringable"); assert_eq!( t.gen_name(&Gen::Absolute).as_str(), "Windows :: Foundation :: IStringable" ); assert_eq!( t.gen_name(&Gen::Relative("Windows")).as_str(), "Foundation:: IStringable" ); assert_eq!( t.gen_name(&Gen::Relative("Windows.Foundation")).as_str(), "IStringable" ); assert_eq!( t.gen_name(&Gen::Relative("Windows.Foundation.Collections")) .as_str(), "super:: IStringable" ); } }