Add snippet insert if client supports it

This commit is contained in:
Ali Bektas 2023-07-05 13:32:12 +02:00
parent 03423116ad
commit 30cbba20de
2 changed files with 72 additions and 26 deletions

View File

@ -44,7 +44,7 @@ use syntax::{
// };
// }
//
// trait NewTrait<const N: usize> {
// trait ${0:TraitName}<const N: usize> {
// // Used as an associated constant.
// const CONST_ASSOC: usize = N * 4;
//
@ -53,7 +53,7 @@ use syntax::{
// const_maker! {i32, 7}
// }
//
// impl<const N: usize> NewTrait<N> for Foo<N> {
// impl<const N: usize> ${0:TraitName}<N> for Foo<N> {
// // Used as an associated constant.
// const CONST_ASSOC: usize = N * 4;
//
@ -126,23 +126,41 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
"".to_string()
};
// // Then replace
builder.replace(
impl_name.syntax().text_range(),
format!("NewTrait{} for {}", arg_list, impl_name.to_string()),
);
if let Some(snippet_cap) = ctx.config.snippet_cap {
builder.replace_snippet(
snippet_cap,
impl_name.syntax().text_range(),
format!("${{0:TraitName}}{} for {}", arg_list, impl_name.to_string()),
);
// Insert trait before TraitImpl
builder.insert_snippet(
snippet_cap,
impl_ast.syntax().text_range().start(),
format!(
"{}\n\n{}",
trait_ast.to_string().replace("NewTrait", "${0:TraitName}"),
IndentLevel::from_node(impl_ast.syntax())
),
);
} else {
builder.replace(
impl_name.syntax().text_range(),
format!("NewTrait{} for {}", arg_list, impl_name.to_string()),
);
// Insert trait before TraitImpl
builder.insert(
impl_ast.syntax().text_range().start(),
format!(
"{}\n\n{}",
trait_ast.to_string(),
IndentLevel::from_node(impl_ast.syntax())
),
);
}
builder.replace(assoc_items.syntax().text_range(), impl_items.to_string());
// Insert trait before TraitImpl
builder.insert(
impl_ast.syntax().text_range().start(),
format!(
"{}\n\n{}",
trait_ast.to_string(),
IndentLevel::from_node(impl_ast.syntax())
),
);
},
);
@ -193,7 +211,7 @@ fn strip_body(item: &ast::AssocItem) {
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::{check_assist, check_assist_not_applicable};
use crate::tests::{check_assist, check_assist_no_snippet_cap, check_assist_not_applicable};
#[test]
fn test_trigger_when_cursor_on_header() {
@ -212,7 +230,7 @@ impl Foo { $0
#[test]
fn test_assoc_item_fn() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
struct Foo(f64);
@ -239,7 +257,7 @@ impl NewTrait for Foo {
#[test]
fn test_assoc_item_macro() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
struct Foo;
@ -274,7 +292,7 @@ impl NewTrait for Foo {
#[test]
fn test_assoc_item_const() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
struct Foo;
@ -297,7 +315,7 @@ impl NewTrait for Foo {
#[test]
fn test_impl_with_generics() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
struct Foo<const N: usize>([i32; N]);
@ -325,7 +343,7 @@ impl<const N: usize> NewTrait<N> for Foo<N> {
#[test]
fn test_trait_items_should_not_have_vis() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
struct Foo;
@ -362,7 +380,7 @@ impl Emp$0tyImpl{}
#[test]
fn test_not_top_level_impl() {
check_assist(
check_assist_no_snippet_cap(
generate_trait_from_impl,
r#"
mod a {
@ -382,4 +400,32 @@ mod a {
}"#,
)
}
#[test]
fn test_snippet_cap_is_some() {
check_assist(
generate_trait_from_impl,
r#"
struct Foo<const N: usize>([i32; N]);
impl<const N: usize> F$0oo<N> {
// Used as an associated constant.
const CONST: usize = N * 4;
}
"#,
r#"
struct Foo<const N: usize>([i32; N]);
trait ${0:TraitName}<const N: usize> {
// Used as an associated constant.
const CONST: usize = N * 4;
}
impl<const N: usize> ${0:TraitName}<N> for Foo<N> {
// Used as an associated constant.
const CONST: usize = N * 4;
}
"#,
)
}
}

View File

@ -1533,7 +1533,7 @@ macro_rules! const_maker {
};
}
trait NewTrait<const N: usize> {
trait ${0:TraitName}<const N: usize> {
// Used as an associated constant.
const CONST_ASSOC: usize = N * 4;
@ -1542,7 +1542,7 @@ trait NewTrait<const N: usize> {
const_maker! {i32, 7}
}
impl<const N: usize> NewTrait<N> for Foo<N> {
impl<const N: usize> ${0:TraitName}<N> for Foo<N> {
// Used as an associated constant.
const CONST_ASSOC: usize = N * 4;