Rename add import assist

This commit is contained in:
Kirill Bulatov 2020-02-07 23:35:34 +02:00
parent 5397f05bfe
commit 740a26b7d2
9 changed files with 96 additions and 104 deletions

View file

@ -1,4 +1,4 @@
//! Generated file, do not edit by hand, see `crate/ra_tools/src/codegen`
//! Generated file, do not edit by hand, see `xtask/src/codegen`
use super::check;
@ -160,21 +160,6 @@ impl Trait<u32> for () {
)
}
#[test]
fn doctest_add_import() {
check(
"add_import",
r#####"
fn process(map: std::collections::<|>HashMap<String, String>) {}
"#####,
r#####"
use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}
"#####,
)
}
#[test]
fn doctest_add_new() {
check(
@ -591,6 +576,21 @@ fn handle(action: Action) {
)
}
#[test]
fn doctest_replace_qualified_name_with_use() {
check(
"replace_qualified_name_with_use",
r#####"
fn process(map: std::collections::<|>HashMap<String, String>) {}
"#####,
r#####"
use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}
"#####,
)
}
#[test]
fn doctest_split_import() {
check(

View file

@ -7,7 +7,7 @@ use ra_syntax::{
use crate::{
assist_ctx::{ActionBuilder, Assist, AssistCtx},
auto_import_text_edit, AssistId,
insert_use_statement, AssistId,
};
use std::collections::BTreeSet;
@ -78,7 +78,7 @@ pub(crate) fn auto_import(ctx: AssistCtx) -> Option<Assist> {
fn import_to_action(import: ModPath, position: &SyntaxNode, anchor: &SyntaxNode) -> ActionBuilder {
let mut action_builder = ActionBuilder::default();
action_builder.label(format!("Import `{}`", &import));
auto_import_text_edit(position, anchor, &import, action_builder.text_edit_builder());
insert_use_statement(position, anchor, &import, action_builder.text_edit_builder());
action_builder
}

View file

@ -12,10 +12,10 @@ use crate::{
AssistId,
};
/// This function produces sequence of text edits into edit
/// to import the target path in the most appropriate scope given
/// the cursor position
pub fn auto_import_text_edit(
/// Creates and inserts a use statement for the given path to import.
/// The use statement is inserted in the scope most appropriate to the
/// the cursor position given, additionally merged with the existing use imports.
pub fn insert_use_statement(
// Ideally the position of the cursor, used to
position: &SyntaxNode,
// The statement to use as anchor (last resort)
@ -37,9 +37,9 @@ pub fn auto_import_text_edit(
}
}
// Assist: add_import
// Assist: replace_qualified_name_with_use
//
// Adds a use statement for a given fully-qualified path.
// Adds a use statement for a given fully-qualified name.
//
// ```
// fn process(map: std::collections::<|>HashMap<String, String>) {}
@ -50,7 +50,7 @@ pub fn auto_import_text_edit(
//
// fn process(map: HashMap<String, String>) {}
// ```
pub(crate) fn add_import(ctx: AssistCtx) -> Option<Assist> {
pub(crate) fn replace_qualified_name_with_use(ctx: AssistCtx) -> Option<Assist> {
let path: ast::Path = ctx.find_node_at_offset()?;
// We don't want to mess with use statements
if path.syntax().ancestors().find_map(ast::UseItem::cast).is_some() {
@ -72,9 +72,13 @@ pub(crate) fn add_import(ctx: AssistCtx) -> Option<Assist> {
}
};
ctx.add_assist(AssistId("add_import"), format!("Import {}", fmt_segments(&segments)), |edit| {
apply_auto_import(&position, &path, &segments, edit.text_edit_builder());
})
ctx.add_assist(
AssistId("replace_qualified_name_with_use"),
"Replace qualified path with use",
|edit| {
replace_with_use(&position, &path, &segments, edit.text_edit_builder());
},
)
}
fn collect_path_segments_raw(
@ -107,12 +111,6 @@ fn collect_path_segments_raw(
Some(segments.len() - oldlen)
}
fn fmt_segments(segments: &[SmolStr]) -> String {
let mut buf = String::new();
fmt_segments_raw(segments, &mut buf);
buf
}
fn fmt_segments_raw(segments: &[SmolStr], buf: &mut String) {
let mut iter = segments.iter();
if let Some(s) = iter.next() {
@ -558,7 +556,7 @@ fn make_assist_add_nested_import(
}
}
fn apply_auto_import(
fn replace_with_use(
container: &SyntaxNode,
path: &ast::Path,
target: &[SmolStr],
@ -603,9 +601,9 @@ mod tests {
use super::*;
#[test]
fn test_auto_import_add_use_no_anchor() {
fn test_replace_add_use_no_anchor() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
std::fmt::Debug<|>
",
@ -617,9 +615,9 @@ Debug<|>
);
}
#[test]
fn test_auto_import_add_use_no_anchor_with_item_below() {
fn test_replace_add_use_no_anchor_with_item_below() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
std::fmt::Debug<|>
@ -638,9 +636,9 @@ fn main() {
}
#[test]
fn test_auto_import_add_use_no_anchor_with_item_above() {
fn test_replace_add_use_no_anchor_with_item_above() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
fn main() {
}
@ -659,9 +657,9 @@ Debug<|>
}
#[test]
fn test_auto_import_add_use_no_anchor_2seg() {
fn test_replace_add_use_no_anchor_2seg() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
std::fmt<|>::Debug
",
@ -674,9 +672,9 @@ fmt<|>::Debug
}
#[test]
fn test_auto_import_add_use() {
fn test_replace_add_use() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use stdx;
@ -694,9 +692,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_file_use_other_anchor() {
fn test_replace_file_use_other_anchor() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
impl std::fmt::Debug<|> for Foo {
}
@ -711,9 +709,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_add_use_other_anchor_indent() {
fn test_replace_add_use_other_anchor_indent() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
impl std::fmt::Debug<|> for Foo {
}
@ -728,9 +726,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_split_different() {
fn test_replace_split_different() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt;
@ -747,9 +745,9 @@ impl io<|> for Foo {
}
#[test]
fn test_auto_import_split_self_for_use() {
fn test_replace_split_self_for_use() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt;
@ -766,9 +764,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_split_self_for_target() {
fn test_replace_split_self_for_target() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::Debug;
@ -785,9 +783,9 @@ impl fmt<|> for Foo {
}
#[test]
fn test_auto_import_add_to_nested_self_nested() {
fn test_replace_add_to_nested_self_nested() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::{Debug, nested::{Display}};
@ -804,9 +802,9 @@ impl nested<|> for Foo {
}
#[test]
fn test_auto_import_add_to_nested_self_already_included() {
fn test_replace_add_to_nested_self_already_included() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::{Debug, nested::{self, Display}};
@ -823,9 +821,9 @@ impl nested<|> for Foo {
}
#[test]
fn test_auto_import_add_to_nested_nested() {
fn test_replace_add_to_nested_nested() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::{Debug, nested::{Display}};
@ -842,9 +840,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_split_common_target_longer() {
fn test_replace_split_common_target_longer() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::Debug;
@ -861,9 +859,9 @@ impl Display<|> for Foo {
}
#[test]
fn test_auto_import_split_common_use_longer() {
fn test_replace_split_common_use_longer() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt::nested::Debug;
@ -880,9 +878,9 @@ impl Display<|> for Foo {
}
#[test]
fn test_auto_import_use_nested_import() {
fn test_replace_use_nested_import() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use crate::{
ty::{Substs, Ty},
@ -903,9 +901,9 @@ fn foo() { lower<|>::trait_env() }
}
#[test]
fn test_auto_import_alias() {
fn test_replace_alias() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
use std::fmt as foo;
@ -922,9 +920,9 @@ impl Debug<|> for Foo {
}
#[test]
fn test_auto_import_not_applicable_one_segment() {
fn test_replace_not_applicable_one_segment() {
check_assist_not_applicable(
add_import,
replace_qualified_name_with_use,
"
impl foo<|> for Foo {
}
@ -933,9 +931,9 @@ impl foo<|> for Foo {
}
#[test]
fn test_auto_import_not_applicable_in_use() {
fn test_replace_not_applicable_in_use() {
check_assist_not_applicable(
add_import,
replace_qualified_name_with_use,
"
use std::fmt<|>;
",
@ -943,9 +941,9 @@ use std::fmt<|>;
}
#[test]
fn test_auto_import_add_use_no_anchor_in_mod_mod() {
fn test_replace_add_use_no_anchor_in_mod_mod() {
check_assist(
add_import,
replace_qualified_name_with_use,
"
mod foo {
mod bar {

View file

@ -21,7 +21,7 @@ use ra_syntax::{TextRange, TextUnit};
use ra_text_edit::TextEdit;
pub(crate) use crate::assist_ctx::{Assist, AssistCtx, AssistHandler};
pub use crate::handlers::add_import::auto_import_text_edit;
pub use crate::handlers::replace_qualified_name_with_use::insert_use_statement;
/// Unique identifier of the assist, should not be shown to the user
/// directly.
@ -133,7 +133,7 @@ mod handlers {
mod replace_if_let_with_match;
mod split_import;
mod remove_dbg;
pub(crate) mod add_import;
pub(crate) mod replace_qualified_name_with_use;
mod add_missing_impl_members;
mod move_guard;
mod move_bounds;
@ -158,7 +158,7 @@ mod handlers {
replace_if_let_with_match::replace_if_let_with_match,
split_import::split_import,
remove_dbg::remove_dbg,
add_import::add_import,
replace_qualified_name_with_use::replace_qualified_name_with_use,
add_missing_impl_members::add_missing_impl_members,
add_missing_impl_members::add_missing_default_members,
inline_local_variable::inline_local_variable,

View file

@ -1,6 +1,6 @@
//! FIXME: write short doc here
use ra_assists::auto_import_text_edit;
use ra_assists::insert_use_statement;
use ra_syntax::{ast, AstNode, SmolStr};
use ra_text_edit::TextEditBuilder;
use rustc_hash::FxHashMap;
@ -26,12 +26,7 @@ pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) {
let edit = {
let mut builder = TextEditBuilder::default();
builder.replace(ctx.source_range(), name.to_string());
auto_import_text_edit(
&ctx.token.parent(),
&ctx.token.parent(),
&path,
&mut builder,
);
insert_use_statement(&ctx.token.parent(), &ctx.token.parent(), &path, &mut builder);
builder.finish()
};

View file

@ -1,4 +1,4 @@
//! Generated file, do not edit by hand, see `crate/ra_tools/src/codegen`
//! Generated file, do not edit by hand, see `xtask/src/codegen`
#![allow(bad_style, missing_docs, unreachable_pub)]
#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`."]

View file

@ -1,4 +1,4 @@
//! Generated file, do not edit by hand, see `crate/ra_tools/src/codegen`
//! Generated file, do not edit by hand, see `xtask/src/codegen`
use crate::{
ast::{self, AstChildren, AstNode},

View file

@ -154,20 +154,6 @@ impl Trait<u32> for () {
}
```
## `add_import`
Adds a use statement for a given fully-qualified path.
```rust
// BEFORE
fn process(map: std::collections::┃HashMap<String, String>) {}
// AFTER
use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}
```
## `add_new`
Adds a new inherent impl for a type.
@ -568,6 +554,20 @@ fn handle(action: Action) {
}
```
## `replace_qualified_name_with_use`
Adds a use statement for a given fully-qualified name.
```rust
// BEFORE
fn process(map: std::collections::┃HashMap<String, String>) {}
// AFTER
use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}
```
## `split_import`
Wraps the tail of import into braces.

View file

@ -53,8 +53,7 @@ fn reformat(text: impl std::fmt::Display) -> Result<String> {
write!(rustfmt.stdin.take().unwrap(), "{}", text)?;
let output = rustfmt.wait_with_output()?;
let stdout = String::from_utf8(output.stdout)?;
// TODO: update the preable: replace ra_tools with the relevant path
let preamble = "Generated file, do not edit by hand, see `crate/ra_tools/src/codegen`";
let preamble = "Generated file, do not edit by hand, see `xtask/src/codegen`";
Ok(format!("//! {}\n\n{}", preamble, stdout))
}