diff options
Diffstat (limited to 'crates/ra_macros/src/tt.rs')
-rw-r--r-- | crates/ra_macros/src/tt.rs | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/crates/ra_macros/src/tt.rs b/crates/ra_macros/src/tt.rs index 364eed9e6..56e930f00 100644 --- a/crates/ra_macros/src/tt.rs +++ b/crates/ra_macros/src/tt.rs | |||
@@ -1,13 +1,16 @@ | |||
1 | use std::fmt; | ||
2 | |||
1 | use smol_str::SmolStr; | 3 | use smol_str::SmolStr; |
4 | use join_to_string::join; | ||
2 | 5 | ||
3 | #[derive(Debug)] | 6 | #[derive(Debug, Clone)] |
4 | pub enum TokenTree { | 7 | pub enum TokenTree { |
5 | Leaf(Leaf), | 8 | Leaf(Leaf), |
6 | Subtree(Subtree), | 9 | Subtree(Subtree), |
7 | } | 10 | } |
8 | impl_froms!(TokenTree: Leaf, Subtree); | 11 | impl_froms!(TokenTree: Leaf, Subtree); |
9 | 12 | ||
10 | #[derive(Debug)] | 13 | #[derive(Debug, Clone)] |
11 | pub enum Leaf { | 14 | pub enum Leaf { |
12 | Literal(Literal), | 15 | Literal(Literal), |
13 | Punct(Punct), | 16 | Punct(Punct), |
@@ -15,7 +18,7 @@ pub enum Leaf { | |||
15 | } | 18 | } |
16 | impl_froms!(Leaf: Literal, Punct, Ident); | 19 | impl_froms!(Leaf: Literal, Punct, Ident); |
17 | 20 | ||
18 | #[derive(Debug)] | 21 | #[derive(Debug, Clone)] |
19 | pub struct Subtree { | 22 | pub struct Subtree { |
20 | pub delimiter: Delimiter, | 23 | pub delimiter: Delimiter, |
21 | pub token_trees: Vec<TokenTree>, | 24 | pub token_trees: Vec<TokenTree>, |
@@ -29,17 +32,69 @@ pub enum Delimiter { | |||
29 | None, | 32 | None, |
30 | } | 33 | } |
31 | 34 | ||
32 | #[derive(Debug)] | 35 | #[derive(Debug, Clone)] |
33 | pub struct Literal { | 36 | pub struct Literal { |
34 | pub text: SmolStr, | 37 | pub text: SmolStr, |
35 | } | 38 | } |
36 | 39 | ||
37 | #[derive(Debug)] | 40 | #[derive(Debug, Clone, PartialEq, Eq)] |
38 | pub struct Punct { | 41 | pub struct Punct { |
39 | pub char: char, | 42 | pub char: char, |
40 | } | 43 | } |
41 | 44 | ||
42 | #[derive(Debug)] | 45 | #[derive(Debug, Clone)] |
43 | pub struct Ident { | 46 | pub struct Ident { |
44 | pub text: SmolStr, | 47 | pub text: SmolStr, |
45 | } | 48 | } |
49 | |||
50 | impl fmt::Display for TokenTree { | ||
51 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
52 | match self { | ||
53 | TokenTree::Leaf(it) => fmt::Display::fmt(it, f), | ||
54 | TokenTree::Subtree(it) => fmt::Display::fmt(it, f), | ||
55 | } | ||
56 | } | ||
57 | } | ||
58 | |||
59 | impl fmt::Display for Subtree { | ||
60 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
61 | let (l, r) = match self.delimiter { | ||
62 | Delimiter::Parenthesis => ("(", ")"), | ||
63 | Delimiter::Brace => ("{", "}"), | ||
64 | Delimiter::Bracket => ("[", "]"), | ||
65 | Delimiter::None => ("", ""), | ||
66 | }; | ||
67 | join(self.token_trees.iter()) | ||
68 | .separator(" ") | ||
69 | .surround_with(l, r) | ||
70 | .to_fmt(f) | ||
71 | } | ||
72 | } | ||
73 | |||
74 | impl fmt::Display for Leaf { | ||
75 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
76 | match self { | ||
77 | Leaf::Ident(it) => fmt::Display::fmt(it, f), | ||
78 | Leaf::Literal(it) => fmt::Display::fmt(it, f), | ||
79 | Leaf::Punct(it) => fmt::Display::fmt(it, f), | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | |||
84 | impl fmt::Display for Ident { | ||
85 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
86 | fmt::Display::fmt(&self.text, f) | ||
87 | } | ||
88 | } | ||
89 | |||
90 | impl fmt::Display for Literal { | ||
91 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
92 | fmt::Display::fmt(&self.text, f) | ||
93 | } | ||
94 | } | ||
95 | |||
96 | impl fmt::Display for Punct { | ||
97 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
98 | fmt::Display::fmt(&self.char, f) | ||
99 | } | ||
100 | } | ||