Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/fixup.rs')
-rw-r--r--crates/hir-expand/src/fixup.rs29
1 files changed, 13 insertions, 16 deletions
diff --git a/crates/hir-expand/src/fixup.rs b/crates/hir-expand/src/fixup.rs
index 424655ed65..939104b709 100644
--- a/crates/hir-expand/src/fixup.rs
+++ b/crates/hir-expand/src/fixup.rs
@@ -14,11 +14,11 @@ use syntax::{
match_ast,
};
use syntax_bridge::DocCommentDesugarMode;
-use triomphe::Arc;
+use thin_vec::ThinVec;
use tt::{Spacing, TransformTtAction, transform_tt};
use crate::{
- span_map::SpanMapRef,
+ span_map::SpanMap,
tt::{self, Ident, Leaf, Punct, TopSubtree},
};
@@ -35,8 +35,7 @@ pub(crate) struct SyntaxFixups {
/// This is the information needed to reverse the fixups.
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct SyntaxFixupUndoInfo {
- // FIXME: ThinArc<[Subtree]>
- original: Option<Arc<Box<[TopSubtree]>>>,
+ original: Option<ThinVec<TopSubtree>>,
}
impl SyntaxFixupUndoInfo {
@@ -51,7 +50,7 @@ const FIXUP_DUMMY_RANGE: TextRange = TextRange::empty(TextSize::new(0));
const FIXUP_DUMMY_RANGE_END: TextSize = TextSize::new(!0);
pub(crate) fn fixup_syntax(
- span_map: SpanMapRef<'_>,
+ span_map: SpanMap<'_>,
node: &SyntaxNode,
call_site: Span,
mode: DocCommentDesugarMode,
@@ -59,7 +58,7 @@ pub(crate) fn fixup_syntax(
let mut append = FxHashMap::<SyntaxElement, _>::default();
let mut remove = FxHashSet::<SyntaxElement>::default();
let mut preorder = node.preorder();
- let mut original = Vec::new();
+ let mut original = ThinVec::new();
let dummy_range = FIXUP_DUMMY_RANGE;
let fake_span = |range| {
let span = span_map.span_for_range(range);
@@ -317,13 +316,12 @@ pub(crate) fn fixup_syntax(
}
}
}
+ original.shrink_to_fit();
let needs_fixups = !append.is_empty() || !original.is_empty();
SyntaxFixups {
append,
remove,
- undo_info: SyntaxFixupUndoInfo {
- original: needs_fixups.then(|| Arc::new(original.into_boxed_slice())),
- },
+ undo_info: SyntaxFixupUndoInfo { original: needs_fixups.then_some(original) },
}
}
@@ -340,7 +338,7 @@ fn has_error_to_handle(node: &SyntaxNode) -> bool {
}
pub(crate) fn reverse_fixups(tt: &mut TopSubtree, undo_info: &SyntaxFixupUndoInfo) {
- let Some(undo_info) = undo_info.original.as_deref() else { return };
+ let Some(undo_info) = &undo_info.original else { return };
let undo_info = &**undo_info;
let top_subtree = tt.top_subtree();
let open_span = top_subtree.delimiter.open;
@@ -402,7 +400,6 @@ mod tests {
use span::{Edition, EditionedFileId, FileId};
use syntax::TextRange;
use syntax_bridge::DocCommentDesugarMode;
- use triomphe::Arc;
use crate::{
fixup::reverse_fixups,
@@ -440,19 +437,19 @@ mod tests {
#[track_caller]
fn check(#[rust_analyzer::rust_fixture] ra_fixture: &str, mut expect: Expect) {
let parsed = syntax::SourceFile::parse(ra_fixture, span::Edition::CURRENT);
- let span_map = SpanMap::RealSpanMap(Arc::new(RealSpanMap::absolute(EditionedFileId::new(
+ let span_map = SpanMap::RealSpanMap(&RealSpanMap::absolute(EditionedFileId::new(
FileId::from_raw(0),
Edition::CURRENT,
- ))));
+ )));
let fixups = super::fixup_syntax(
- span_map.as_ref(),
+ span_map,
&parsed.syntax_node(),
span_map.span_for_range(TextRange::empty(0.into())),
DocCommentDesugarMode::Mbe,
);
let mut tt = syntax_bridge::syntax_node_to_token_tree_modified(
&parsed.syntax_node(),
- span_map.as_ref(),
+ span_map,
fixups.append,
fixups.remove,
span_map.span_for_range(TextRange::empty(0.into())),
@@ -494,7 +491,7 @@ mod tests {
// modulo token IDs and `Punct`s' spacing.
let original_as_tt = syntax_bridge::syntax_node_to_token_tree(
&parsed.syntax_node(),
- span_map.as_ref(),
+ span_map,
span_map.span_for_range(TextRange::empty(0.into())),
DocCommentDesugarMode::Mbe,
);