summary refs log tree commit diff
path: root/src/tools/rust-analyzer/crates/ide-ssr
diff options
context:
space:
mode:
authorLaurențiu Nicola <lnicola@dend.ro>2023-06-05 12:04:23 +0300
committerLaurențiu Nicola <lnicola@dend.ro>2023-06-05 12:04:23 +0300
commitb8a7d439db0cfd765ed4bfedd2bbaeeee58b05a5 (patch)
tree5adcbc6cf50af3bebc2cd4f42d5252a4d728690e /src/tools/rust-analyzer/crates/ide-ssr
parent51f714c8c5021fe25442e46798b1cbef2f2249ed (diff)
parentaa9bc8612514d216f84eec218dfd19ab83f3598a (diff)
downloadrust-b8a7d439db0cfd765ed4bfedd2bbaeeee58b05a5.tar.gz
rust-b8a7d439db0cfd765ed4bfedd2bbaeeee58b05a5.zip
Merge commit 'aa9bc8612514d216f84eec218dfd19ab83f3598a' into sync-from-ra
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-ssr')
-rw-r--r--src/tools/rust-analyzer/crates/ide-ssr/Cargo.toml2
-rw-r--r--src/tools/rust-analyzer/crates/ide-ssr/src/lib.rs9
-rw-r--r--src/tools/rust-analyzer/crates/ide-ssr/src/replacing.rs18
-rw-r--r--src/tools/rust-analyzer/crates/ide-ssr/src/tests.rs2
4 files changed, 22 insertions, 9 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-ssr/Cargo.toml b/src/tools/rust-analyzer/crates/ide-ssr/Cargo.toml
index 04efa7b91d8..70ed6dea5bf 100644
--- a/src/tools/rust-analyzer/crates/ide-ssr/Cargo.toml
+++ b/src/tools/rust-analyzer/crates/ide-ssr/Cargo.toml
@@ -15,6 +15,8 @@ doctest = false
 [dependencies]
 cov-mark = "2.0.0-pre.1"
 itertools = "0.10.5"
+triomphe.workspace = true
+nohash-hasher.workspace = true
 
 # local deps
 hir.workspace = true
diff --git a/src/tools/rust-analyzer/crates/ide-ssr/src/lib.rs b/src/tools/rust-analyzer/crates/ide-ssr/src/lib.rs
index d9834ee63ad..66832a0bee4 100644
--- a/src/tools/rust-analyzer/crates/ide-ssr/src/lib.rs
+++ b/src/tools/rust-analyzer/crates/ide-ssr/src/lib.rs
@@ -87,8 +87,8 @@ pub use crate::{errors::SsrError, from_comment::ssr_from_comment, matching::Matc
 use crate::{errors::bail, matching::MatchFailureReason};
 use hir::Semantics;
 use ide_db::base_db::{FileId, FilePosition, FileRange};
+use nohash_hasher::IntMap;
 use resolving::ResolvedRule;
-use stdx::hash::NoHashHashMap;
 use syntax::{ast, AstNode, SyntaxNode, TextRange};
 use text_edit::TextEdit;
 
@@ -168,9 +168,9 @@ impl<'db> MatchFinder<'db> {
     }
 
     /// Finds matches for all added rules and returns edits for all found matches.
-    pub fn edits(&self) -> NoHashHashMap<FileId, TextEdit> {
+    pub fn edits(&self) -> IntMap<FileId, TextEdit> {
         use ide_db::base_db::SourceDatabaseExt;
-        let mut matches_by_file = NoHashHashMap::default();
+        let mut matches_by_file = IntMap::default();
         for m in self.matches().matches {
             matches_by_file
                 .entry(m.range.file_id)
@@ -184,6 +184,7 @@ impl<'db> MatchFinder<'db> {
                 (
                     file_id,
                     replacing::matches_to_edit(
+                        self.sema.db,
                         &matches,
                         &self.sema.db.file_text(file_id),
                         &self.rules,
@@ -224,7 +225,7 @@ impl<'db> MatchFinder<'db> {
         let file = self.sema.parse(file_id);
         let mut res = Vec::new();
         let file_text = self.sema.db.file_text(file_id);
-        let mut remaining_text = file_text.as_str();
+        let mut remaining_text = &*file_text;
         let mut base = 0;
         let len = snippet.len() as u32;
         while let Some(offset) = remaining_text.find(snippet) {
diff --git a/src/tools/rust-analyzer/crates/ide-ssr/src/replacing.rs b/src/tools/rust-analyzer/crates/ide-ssr/src/replacing.rs
index e27ef6e35ef..b4b83f62da2 100644
--- a/src/tools/rust-analyzer/crates/ide-ssr/src/replacing.rs
+++ b/src/tools/rust-analyzer/crates/ide-ssr/src/replacing.rs
@@ -14,14 +14,16 @@ use crate::{fragments, resolving::ResolvedRule, Match, SsrMatches};
 /// template. Placeholders in the template will have been substituted with whatever they matched to
 /// in the original code.
 pub(crate) fn matches_to_edit(
+    db: &dyn hir::db::ExpandDatabase,
     matches: &SsrMatches,
     file_src: &str,
     rules: &[ResolvedRule],
 ) -> TextEdit {
-    matches_to_edit_at_offset(matches, file_src, 0.into(), rules)
+    matches_to_edit_at_offset(db, matches, file_src, 0.into(), rules)
 }
 
 fn matches_to_edit_at_offset(
+    db: &dyn hir::db::ExpandDatabase,
     matches: &SsrMatches,
     file_src: &str,
     relative_start: TextSize,
@@ -31,13 +33,14 @@ fn matches_to_edit_at_offset(
     for m in &matches.matches {
         edit_builder.replace(
             m.range.range.checked_sub(relative_start).unwrap(),
-            render_replace(m, file_src, rules),
+            render_replace(db, m, file_src, rules),
         );
     }
     edit_builder.finish()
 }
 
 struct ReplacementRenderer<'a> {
+    db: &'a dyn hir::db::ExpandDatabase,
     match_info: &'a Match,
     file_src: &'a str,
     rules: &'a [ResolvedRule],
@@ -53,13 +56,19 @@ struct ReplacementRenderer<'a> {
     placeholder_tokens_requiring_parenthesis: FxHashSet<SyntaxToken>,
 }
 
-fn render_replace(match_info: &Match, file_src: &str, rules: &[ResolvedRule]) -> String {
+fn render_replace(
+    db: &dyn hir::db::ExpandDatabase,
+    match_info: &Match,
+    file_src: &str,
+    rules: &[ResolvedRule],
+) -> String {
     let rule = &rules[match_info.rule_index];
     let template = rule
         .template
         .as_ref()
         .expect("You called MatchFinder::edits after calling MatchFinder::add_search_pattern");
     let mut renderer = ReplacementRenderer {
+        db,
         match_info,
         file_src,
         rules,
@@ -96,7 +105,7 @@ impl ReplacementRenderer<'_> {
 
     fn render_node(&mut self, node: &SyntaxNode) {
         if let Some(mod_path) = self.match_info.rendered_template_paths.get(node) {
-            self.out.push_str(&mod_path.to_string());
+            self.out.push_str(&mod_path.display(self.db).to_string());
             // Emit everything except for the segment's name-ref, since we already effectively
             // emitted that as part of `mod_path`.
             if let Some(path) = ast::Path::cast(node.clone()) {
@@ -144,6 +153,7 @@ impl ReplacementRenderer<'_> {
                     );
                 }
                 let edit = matches_to_edit_at_offset(
+                    self.db,
                     &placeholder_value.inner_matches,
                     self.file_src,
                     range.start(),
diff --git a/src/tools/rust-analyzer/crates/ide-ssr/src/tests.rs b/src/tools/rust-analyzer/crates/ide-ssr/src/tests.rs
index 61698fca80f..424ba3d7fd5 100644
--- a/src/tools/rust-analyzer/crates/ide-ssr/src/tests.rs
+++ b/src/tools/rust-analyzer/crates/ide-ssr/src/tests.rs
@@ -3,8 +3,8 @@ use ide_db::{
     base_db::{salsa::Durability, FileId, FilePosition, FileRange, SourceDatabaseExt},
     FxHashSet,
 };
-use std::sync::Arc;
 use test_utils::RangeOrOffset;
+use triomphe::Arc;
 
 use crate::{MatchFinder, SsrRule};