diff options
Diffstat (limited to 'crates/ra_mbe')
-rw-r--r-- | crates/ra_mbe/src/syntax_bridge.rs | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/crates/ra_mbe/src/syntax_bridge.rs b/crates/ra_mbe/src/syntax_bridge.rs index 7a4ba9e93..24a043175 100644 --- a/crates/ra_mbe/src/syntax_bridge.rs +++ b/crates/ra_mbe/src/syntax_bridge.rs | |||
@@ -98,7 +98,7 @@ struct TtTokenSource { | |||
98 | struct Tok { | 98 | struct Tok { |
99 | kind: SyntaxKind, | 99 | kind: SyntaxKind, |
100 | is_joint_to_next: bool, | 100 | is_joint_to_next: bool, |
101 | text: Option<SmolStr>, | 101 | text: SmolStr, |
102 | } | 102 | } |
103 | 103 | ||
104 | impl TtTokenSource { | 104 | impl TtTokenSource { |
@@ -123,27 +123,34 @@ impl TtTokenSource { | |||
123 | tt::Leaf::Literal(l) => Tok { | 123 | tt::Leaf::Literal(l) => Tok { |
124 | kind: SyntaxKind::INT_NUMBER, // FIXME | 124 | kind: SyntaxKind::INT_NUMBER, // FIXME |
125 | is_joint_to_next: false, | 125 | is_joint_to_next: false, |
126 | text: Some(l.text.clone()), | 126 | text: l.text.clone(), |
127 | }, | 127 | }, |
128 | tt::Leaf::Punct(p) => Tok { | 128 | tt::Leaf::Punct(p) => Tok { |
129 | kind: SyntaxKind::from_char(p.char).unwrap(), | 129 | kind: SyntaxKind::from_char(p.char).unwrap(), |
130 | is_joint_to_next: p.spacing == tt::Spacing::Joint, | 130 | is_joint_to_next: p.spacing == tt::Spacing::Joint, |
131 | text: None, | 131 | text: { |
132 | let mut buf = [0u8; 4]; | ||
133 | let s: &str = p.char.encode_utf8(&mut buf); | ||
134 | SmolStr::new(s) | ||
135 | }, | ||
132 | }, | 136 | }, |
133 | tt::Leaf::Ident(ident) => { | 137 | tt::Leaf::Ident(ident) => { |
134 | Tok { kind: IDENT, is_joint_to_next: false, text: Some(ident.text.clone()) } | 138 | Tok { kind: IDENT, is_joint_to_next: false, text: ident.text.clone() } |
135 | } | 139 | } |
136 | }; | 140 | }; |
137 | self.tokens.push(tok) | 141 | self.tokens.push(tok) |
138 | } | 142 | } |
139 | fn push_delim(&mut self, d: tt::Delimiter, closing: bool) { | 143 | fn push_delim(&mut self, d: tt::Delimiter, closing: bool) { |
140 | let kinds = match d { | 144 | let (kinds, texts) = match d { |
141 | tt::Delimiter::Parenthesis => [L_PAREN, R_PAREN], | 145 | tt::Delimiter::Parenthesis => ([L_PAREN, R_PAREN], "()"), |
142 | tt::Delimiter::Brace => [L_CURLY, R_CURLY], | 146 | tt::Delimiter::Brace => ([L_CURLY, R_CURLY], "{}"), |
143 | tt::Delimiter::Bracket => [L_BRACK, R_BRACK], | 147 | tt::Delimiter::Bracket => ([L_BRACK, R_BRACK], "[]"), |
144 | tt::Delimiter::None => return, | 148 | tt::Delimiter::None => return, |
145 | }; | 149 | }; |
146 | let tok = Tok { kind: kinds[closing as usize], is_joint_to_next: false, text: None }; | 150 | let idx = closing as usize; |
151 | let kind = kinds[idx]; | ||
152 | let text = &texts[idx..texts.len() - (1 - idx)]; | ||
153 | let tok = Tok { kind, is_joint_to_next: false, text: SmolStr::new(text) }; | ||
147 | self.tokens.push(tok) | 154 | self.tokens.push(tok) |
148 | } | 155 | } |
149 | } | 156 | } |
@@ -156,6 +163,6 @@ impl TokenSource for TtTokenSource { | |||
156 | self.tokens[pos].is_joint_to_next | 163 | self.tokens[pos].is_joint_to_next |
157 | } | 164 | } |
158 | fn is_keyword(&self, pos: usize, kw: &str) -> bool { | 165 | fn is_keyword(&self, pos: usize, kw: &str) -> bool { |
159 | self.tokens[pos].text.as_ref().map(|it| it.as_str()) == Some(kw) | 166 | self.tokens[pos].text == *kw |
160 | } | 167 | } |
161 | } | 168 | } |