|
1 | 1 | //! FIXME: write short doc here
|
2 | 2 |
|
3 |
| -use std::{fmt, hash::BuildHasherDefault, ops::RangeInclusive}; |
| 3 | +use std::{hash::BuildHasherDefault, ops::RangeInclusive}; |
4 | 4 |
|
5 | 5 | use indexmap::IndexMap;
|
6 | 6 | use itertools::Itertools;
|
@@ -330,110 +330,6 @@ fn _replace_children(
|
330 | 330 | with_children(parent, new_children)
|
331 | 331 | }
|
332 | 332 |
|
333 |
| -#[derive(Debug, PartialEq, Eq, Hash)] |
334 |
| -enum InsertPos { |
335 |
| - FirstChildOf(SyntaxNode), |
336 |
| - After(SyntaxElement), |
337 |
| -} |
338 |
| - |
339 |
| -#[derive(Default)] |
340 |
| -pub(crate) struct SyntaxRewriter<'a> { |
341 |
| - //FIXME: add debug_assertions that all elements are in fact from the same file. |
342 |
| - replacements: FxHashMap<SyntaxElement, Replacement>, |
343 |
| - insertions: IndexMap<InsertPos, Vec<SyntaxElement>>, |
344 |
| - _pd: std::marker::PhantomData<&'a ()>, |
345 |
| -} |
346 |
| - |
347 |
| -impl fmt::Debug for SyntaxRewriter<'_> { |
348 |
| - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
349 |
| - f.debug_struct("SyntaxRewriter") |
350 |
| - .field("replacements", &self.replacements) |
351 |
| - .field("insertions", &self.insertions) |
352 |
| - .finish() |
353 |
| - } |
354 |
| -} |
355 |
| - |
356 |
| -impl SyntaxRewriter<'_> { |
357 |
| - pub(crate) fn replace<T: Clone + Into<SyntaxElement>>(&mut self, what: &T, with: &T) { |
358 |
| - let what = what.clone().into(); |
359 |
| - let replacement = Replacement::Single(with.clone().into()); |
360 |
| - self.replacements.insert(what, replacement); |
361 |
| - } |
362 |
| - |
363 |
| - pub(crate) fn rewrite(&self, node: &SyntaxNode) -> SyntaxNode { |
364 |
| - let _p = profile::span("rewrite"); |
365 |
| - |
366 |
| - if self.replacements.is_empty() && self.insertions.is_empty() { |
367 |
| - return node.clone(); |
368 |
| - } |
369 |
| - let green = self.rewrite_children(node); |
370 |
| - with_green(node, green) |
371 |
| - } |
372 |
| - |
373 |
| - pub(crate) fn rewrite_ast<N: AstNode>(self, node: &N) -> N { |
374 |
| - N::cast(self.rewrite(node.syntax())).unwrap() |
375 |
| - } |
376 |
| - |
377 |
| - fn replacement(&self, element: &SyntaxElement) -> Option<Replacement> { |
378 |
| - self.replacements.get(element).cloned() |
379 |
| - } |
380 |
| - |
381 |
| - fn insertions(&self, pos: &InsertPos) -> Option<impl Iterator<Item = SyntaxElement> + '_> { |
382 |
| - self.insertions.get(pos).map(|insertions| insertions.iter().cloned()) |
383 |
| - } |
384 |
| - |
385 |
| - fn rewrite_children(&self, node: &SyntaxNode) -> rowan::GreenNode { |
386 |
| - let _p = profile::span("rewrite_children"); |
387 |
| - |
388 |
| - // FIXME: this could be made much faster. |
389 |
| - let mut new_children = Vec::new(); |
390 |
| - if let Some(elements) = self.insertions(&InsertPos::FirstChildOf(node.clone())) { |
391 |
| - new_children.extend(elements.map(element_to_green)); |
392 |
| - } |
393 |
| - for child in node.children_with_tokens() { |
394 |
| - self.rewrite_self(&mut new_children, &child); |
395 |
| - } |
396 |
| - |
397 |
| - rowan::GreenNode::new(rowan::SyntaxKind(node.kind() as u16), new_children) |
398 |
| - } |
399 |
| - |
400 |
| - fn rewrite_self( |
401 |
| - &self, |
402 |
| - acc: &mut Vec<NodeOrToken<rowan::GreenNode, rowan::GreenToken>>, |
403 |
| - element: &SyntaxElement, |
404 |
| - ) { |
405 |
| - let _p = profile::span("rewrite_self"); |
406 |
| - |
407 |
| - if let Some(replacement) = self.replacement(&element) { |
408 |
| - match replacement { |
409 |
| - Replacement::Single(element) => acc.push(element_to_green(element)), |
410 |
| - }; |
411 |
| - } else { |
412 |
| - match element { |
413 |
| - NodeOrToken::Token(it) => acc.push(NodeOrToken::Token(it.green().to_owned())), |
414 |
| - NodeOrToken::Node(it) => { |
415 |
| - acc.push(NodeOrToken::Node(self.rewrite_children(it))); |
416 |
| - } |
417 |
| - } |
418 |
| - } |
419 |
| - if let Some(elements) = self.insertions(&InsertPos::After(element.clone())) { |
420 |
| - acc.extend(elements.map(element_to_green)); |
421 |
| - } |
422 |
| - } |
423 |
| -} |
424 |
| - |
425 |
| -fn element_to_green(element: SyntaxElement) -> NodeOrToken<rowan::GreenNode, rowan::GreenToken> { |
426 |
| - match element { |
427 |
| - NodeOrToken::Node(it) => NodeOrToken::Node(it.green().into_owned()), |
428 |
| - NodeOrToken::Token(it) => NodeOrToken::Token(it.green().to_owned()), |
429 |
| - } |
430 |
| -} |
431 |
| - |
432 |
| -#[derive(Clone, Debug)] |
433 |
| -enum Replacement { |
434 |
| - Single(SyntaxElement), |
435 |
| -} |
436 |
| - |
437 | 333 | fn with_children(
|
438 | 334 | parent: &SyntaxNode,
|
439 | 335 | new_children: Vec<NodeOrToken<rowan::GreenNode, rowan::GreenToken>>,
|
|
0 commit comments