aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/utils.rs')
-rw-r--r--crates/ra_assists/src/utils.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs
index f3fc92ebf..bb9749b06 100644
--- a/crates/ra_assists/src/utils.rs
+++ b/crates/ra_assists/src/utils.rs
@@ -1,18 +1,38 @@
1//! Assorted functions shared by several assists. 1//! Assorted functions shared by several assists.
2pub(crate) mod insert_use; 2pub(crate) mod insert_use;
3 3
4use std::iter; 4use std::{iter, ops};
5 5
6use hir::{Adt, Crate, Semantics, Trait, Type}; 6use hir::{Adt, Crate, Semantics, Trait, Type};
7use ra_ide_db::RootDatabase; 7use ra_ide_db::RootDatabase;
8use ra_syntax::{ 8use ra_syntax::{
9 ast::{self, make, NameOwner}, 9 ast::{self, make, NameOwner},
10 AstNode, T, 10 AstNode, SyntaxNode, T,
11}; 11};
12use rustc_hash::FxHashSet; 12use rustc_hash::FxHashSet;
13 13
14pub(crate) use insert_use::insert_use_statement; 14pub(crate) use insert_use::insert_use_statement;
15 15
16pub(crate) fn render_snippet(node: &SyntaxNode, placeholder: &SyntaxNode) -> String {
17 assert!(placeholder.ancestors().any(|it| it == *node));
18 let range = placeholder.text_range() - node.text_range().start();
19 let range: ops::Range<usize> = range.into();
20
21 let mut placeholder = placeholder.to_string();
22 escape(&mut placeholder);
23 let tab_stop = format!("${{0:{}}}", placeholder);
24
25 let mut buf = node.to_string();
26 buf.replace_range(range, &tab_stop);
27 return buf;
28
29 fn escape(buf: &mut String) {
30 stdx::replace(buf, '{', r"\{");
31 stdx::replace(buf, '}', r"\}");
32 stdx::replace(buf, '$', r"\$");
33 }
34}
35
16pub fn get_missing_assoc_items( 36pub fn get_missing_assoc_items(
17 sema: &Semantics<RootDatabase>, 37 sema: &Semantics<RootDatabase>,
18 impl_def: &ast::ImplDef, 38 impl_def: &ast::ImplDef,