|
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