| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 1 | use proc_macro2::Ident; |
| 2 | |
| David Tolnay | f02146e | 2020-11-01 15:35:42 -0800 | [diff] [blame] | 3 | #[derive(Copy, Clone, PartialEq, Debug)] |
| David Tolnay | 97c5b86 | 2020-11-01 14:59:01 -0800 | [diff] [blame] | 4 | pub enum Block<'a> { |
| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 5 | AnonymousNamespace, |
| 6 | Namespace(&'static str), |
| David Tolnay | 97c5b86 | 2020-11-01 14:59:01 -0800 | [diff] [blame] | 7 | UserDefinedNamespace(&'a Ident), |
| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 8 | InlineNamespace(&'static str), |
| 9 | ExternC, |
| 10 | } |
| 11 | |
| David Tolnay | 97c5b86 | 2020-11-01 14:59:01 -0800 | [diff] [blame] | 12 | impl<'a> Block<'a> { |
| David Tolnay | 2a160e4 | 2020-11-01 15:40:20 -0800 | [diff] [blame] | 13 | pub fn write_begin(self, out: &mut String) { |
| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 14 | if let Block::InlineNamespace(_) = self { |
| 15 | out.push_str("inline "); |
| 16 | } |
| 17 | self.write_common(out); |
| 18 | out.push_str(" {\n"); |
| 19 | } |
| 20 | |
| David Tolnay | 2a160e4 | 2020-11-01 15:40:20 -0800 | [diff] [blame] | 21 | pub fn write_end(self, out: &mut String) { |
| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 22 | out.push_str("} // "); |
| 23 | self.write_common(out); |
| 24 | out.push('\n'); |
| 25 | } |
| 26 | |
| David Tolnay | 2a160e4 | 2020-11-01 15:40:20 -0800 | [diff] [blame] | 27 | fn write_common(self, out: &mut String) { |
| David Tolnay | 0c033e3 | 2020-11-01 15:15:48 -0800 | [diff] [blame] | 28 | match self { |
| 29 | Block::AnonymousNamespace => out.push_str("namespace"), |
| 30 | Block::Namespace(name) => { |
| 31 | out.push_str("namespace "); |
| 32 | out.push_str(name); |
| 33 | } |
| 34 | Block::UserDefinedNamespace(name) => { |
| 35 | out.push_str("namespace "); |
| 36 | out.push_str(&name.to_string()); |
| 37 | } |
| 38 | Block::InlineNamespace(name) => { |
| 39 | out.push_str("namespace "); |
| 40 | out.push_str(name); |
| 41 | } |
| 42 | Block::ExternC => out.push_str("extern \"C\""), |
| 43 | } |
| 44 | } |
| 45 | } |