From 561b4b11ff1d87ea1ff2477dcba6ae1f396573a3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Feb 2020 15:53:31 +0100 Subject: Name assist handlers --- crates/ra_assists/src/handlers/split_import.rs | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 crates/ra_assists/src/handlers/split_import.rs (limited to 'crates/ra_assists/src/handlers/split_import.rs') diff --git a/crates/ra_assists/src/handlers/split_import.rs b/crates/ra_assists/src/handlers/split_import.rs new file mode 100644 index 000000000..2c3f07a79 --- /dev/null +++ b/crates/ra_assists/src/handlers/split_import.rs @@ -0,0 +1,69 @@ +use std::iter::successors; + +use ra_syntax::{ast, AstNode, TextUnit, T}; + +use crate::{Assist, AssistCtx, AssistId}; + +// Assist: split_import +// +// Wraps the tail of import into braces. +// +// ``` +// use std::<|>collections::HashMap; +// ``` +// -> +// ``` +// use std::{collections::HashMap}; +// ``` +pub(crate) fn split_import(ctx: AssistCtx) -> Option { + let colon_colon = ctx.find_token_at_offset(T![::])?; + let path = ast::Path::cast(colon_colon.parent())?; + let top_path = successors(Some(path), |it| it.parent_path()).last()?; + + let use_tree = top_path.syntax().ancestors().find_map(ast::UseTree::cast); + if use_tree.is_none() { + return None; + } + + let l_curly = colon_colon.text_range().end(); + let r_curly = match top_path.syntax().parent().and_then(ast::UseTree::cast) { + Some(tree) => tree.syntax().text_range().end(), + None => top_path.syntax().text_range().end(), + }; + + ctx.add_assist(AssistId("split_import"), "Split import", |edit| { + edit.target(colon_colon.text_range()); + edit.insert(l_curly, "{"); + edit.insert(r_curly, "}"); + edit.set_cursor(l_curly + TextUnit::of_str("{")); + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::helpers::{check_assist, check_assist_target}; + + #[test] + fn test_split_import() { + check_assist( + split_import, + "use crate::<|>db::RootDatabase;", + "use crate::{<|>db::RootDatabase};", + ) + } + + #[test] + fn split_import_works_with_trees() { + check_assist( + split_import, + "use crate:<|>:db::{RootDatabase, FileSymbol}", + "use crate::{<|>db::{RootDatabase, FileSymbol}}", + ) + } + + #[test] + fn split_import_target() { + check_assist_target(split_import, "use crate::<|>db::{RootDatabase, FileSymbol}", "::"); + } +} -- cgit v1.2.3