aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_macros/src/tt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_macros/src/tt.rs')
-rw-r--r--crates/ra_macros/src/tt.rs67
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 @@
1use std::fmt;
2
1use smol_str::SmolStr; 3use smol_str::SmolStr;
4use join_to_string::join;
2 5
3#[derive(Debug)] 6#[derive(Debug, Clone)]
4pub enum TokenTree { 7pub enum TokenTree {
5 Leaf(Leaf), 8 Leaf(Leaf),
6 Subtree(Subtree), 9 Subtree(Subtree),
7} 10}
8impl_froms!(TokenTree: Leaf, Subtree); 11impl_froms!(TokenTree: Leaf, Subtree);
9 12
10#[derive(Debug)] 13#[derive(Debug, Clone)]
11pub enum Leaf { 14pub enum Leaf {
12 Literal(Literal), 15 Literal(Literal),
13 Punct(Punct), 16 Punct(Punct),
@@ -15,7 +18,7 @@ pub enum Leaf {
15} 18}
16impl_froms!(Leaf: Literal, Punct, Ident); 19impl_froms!(Leaf: Literal, Punct, Ident);
17 20
18#[derive(Debug)] 21#[derive(Debug, Clone)]
19pub struct Subtree { 22pub 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)]
33pub struct Literal { 36pub struct Literal {
34 pub text: SmolStr, 37 pub text: SmolStr,
35} 38}
36 39
37#[derive(Debug)] 40#[derive(Debug, Clone, PartialEq, Eq)]
38pub struct Punct { 41pub struct Punct {
39 pub char: char, 42 pub char: char,
40} 43}
41 44
42#[derive(Debug)] 45#[derive(Debug, Clone)]
43pub struct Ident { 46pub struct Ident {
44 pub text: SmolStr, 47 pub text: SmolStr,
45} 48}
49
50impl 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
59impl 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
74impl 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
84impl fmt::Display for Ident {
85 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
86 fmt::Display::fmt(&self.text, f)
87 }
88}
89
90impl fmt::Display for Literal {
91 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92 fmt::Display::fmt(&self.text, f)
93 }
94}
95
96impl fmt::Display for Punct {
97 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
98 fmt::Display::fmt(&self.char, f)
99 }
100}