diff options
Diffstat (limited to 'crates/ra_mbe/src/syntax_bridge.rs')
-rw-r--r-- | crates/ra_mbe/src/syntax_bridge.rs | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/crates/ra_mbe/src/syntax_bridge.rs b/crates/ra_mbe/src/syntax_bridge.rs index e0f228ce9..3521b382a 100644 --- a/crates/ra_mbe/src/syntax_bridge.rs +++ b/crates/ra_mbe/src/syntax_bridge.rs | |||
@@ -148,30 +148,21 @@ fn convert_tt( | |||
148 | match child { | 148 | match child { |
149 | SyntaxElement::Token(token) => { | 149 | SyntaxElement::Token(token) => { |
150 | if token.kind().is_punct() { | 150 | if token.kind().is_punct() { |
151 | let mut prev = None; | 151 | assert!(token.text().len() == 1, "Input ast::token punct must be single char."); |
152 | for char in token.text().chars() { | 152 | let char = token.text().chars().next().unwrap(); |
153 | if let Some(char) = prev { | 153 | |
154 | token_trees.push( | 154 | let spacing = match child_iter.peek() { |
155 | tt::Leaf::from(tt::Punct { char, spacing: tt::Spacing::Joint }) | 155 | Some(SyntaxElement::Token(token)) => { |
156 | .into(), | 156 | if token.kind().is_punct() { |
157 | ); | 157 | tt::Spacing::Joint |
158 | } | 158 | } else { |
159 | prev = Some(char) | 159 | tt::Spacing::Alone |
160 | } | ||
161 | if let Some(char) = prev { | ||
162 | let spacing = match child_iter.peek() { | ||
163 | Some(SyntaxElement::Token(token)) => { | ||
164 | if token.kind().is_punct() { | ||
165 | tt::Spacing::Joint | ||
166 | } else { | ||
167 | tt::Spacing::Alone | ||
168 | } | ||
169 | } | 160 | } |
170 | _ => tt::Spacing::Alone, | 161 | } |
171 | }; | 162 | _ => tt::Spacing::Alone, |
163 | }; | ||
172 | 164 | ||
173 | token_trees.push(tt::Leaf::from(tt::Punct { char, spacing }).into()); | 165 | token_trees.push(tt::Leaf::from(tt::Punct { char, spacing }).into()); |
174 | } | ||
175 | } else { | 166 | } else { |
176 | let child: tt::TokenTree = if token.kind() == SyntaxKind::TRUE_KW | 167 | let child: tt::TokenTree = if token.kind() == SyntaxKind::TRUE_KW |
177 | || token.kind() == SyntaxKind::FALSE_KW | 168 | || token.kind() == SyntaxKind::FALSE_KW |
@@ -224,6 +215,15 @@ impl<'a, Q: Querier> TtTreeSink<'a, Q> { | |||
224 | } | 215 | } |
225 | } | 216 | } |
226 | 217 | ||
218 | fn is_delimiter(kind: SyntaxKind) -> bool { | ||
219 | use SyntaxKind::*; | ||
220 | |||
221 | match kind { | ||
222 | L_PAREN | L_BRACK | L_CURLY | R_PAREN | R_BRACK | R_CURLY => true, | ||
223 | _ => false, | ||
224 | } | ||
225 | } | ||
226 | |||
227 | impl<'a, Q: Querier> TreeSink for TtTreeSink<'a, Q> { | 227 | impl<'a, Q: Querier> TreeSink for TtTreeSink<'a, Q> { |
228 | fn token(&mut self, kind: SyntaxKind, n_tokens: u8) { | 228 | fn token(&mut self, kind: SyntaxKind, n_tokens: u8) { |
229 | if kind == L_DOLLAR || kind == R_DOLLAR { | 229 | if kind == L_DOLLAR || kind == R_DOLLAR { |
@@ -240,14 +240,18 @@ impl<'a, Q: Querier> TreeSink for TtTreeSink<'a, Q> { | |||
240 | self.buf.clear(); | 240 | self.buf.clear(); |
241 | self.inner.token(kind, text); | 241 | self.inner.token(kind, text); |
242 | 242 | ||
243 | // // Add a white space to token | 243 | // Add a white space between tokens, only if both are not delimiters |
244 | // let (last_kind, _, last_joint_to_next ) = self.src_querier.token(self.token_pos-n_tokens as usize); | 244 | if !is_delimiter(kind) { |
245 | // if !last_joint_to_next && last_kind.is_punct() { | 245 | let (last_kind, _, last_joint_to_next) = self.src_querier.token(self.token_pos - 1); |
246 | // let (cur_kind, _, _ ) = self.src_querier.token(self.token_pos); | 246 | if !last_joint_to_next && last_kind.is_punct() { |
247 | // if cur_kind.is_punct() { | 247 | let (cur_kind, _, _) = self.src_querier.token(self.token_pos); |
248 | // self.inner.token(WHITESPACE, " ".into()); | 248 | if !is_delimiter(cur_kind) { |
249 | // } | 249 | if cur_kind.is_punct() { |
250 | // } | 250 | self.inner.token(WHITESPACE, " ".into()); |
251 | } | ||
252 | } | ||
253 | } | ||
254 | } | ||
251 | } | 255 | } |
252 | 256 | ||
253 | fn start_node(&mut self, kind: SyntaxKind) { | 257 | fn start_node(&mut self, kind: SyntaxKind) { |