Merge #8602
8602: Fix panic in `replace_derive_with_manual_impl` r=jonas-schievink a=jonas-schievink bors r+ Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
commit
86c2bb3c5b
@ -47,6 +47,11 @@ pub(crate) fn replace_derive_with_manual_impl(
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !args.syntax().text_range().contains(ctx.offset()) {
|
||||||
|
cov_mark::hit!(outside_of_attr_args);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let trait_token = args.syntax().token_at_offset(ctx.offset()).find(|t| t.kind() == IDENT)?;
|
let trait_token = args.syntax().token_at_offset(ctx.offset()).find(|t| t.kind() == IDENT)?;
|
||||||
let trait_name = trait_token.text();
|
let trait_name = trait_token.text();
|
||||||
|
|
||||||
@ -207,7 +212,7 @@ mod tests {
|
|||||||
fn add_custom_impl_debug() {
|
fn add_custom_impl_debug() {
|
||||||
check_assist(
|
check_assist(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
mod fmt {
|
mod fmt {
|
||||||
pub struct Error;
|
pub struct Error;
|
||||||
pub type Result = Result<(), Error>;
|
pub type Result = Result<(), Error>;
|
||||||
@ -221,8 +226,8 @@ pub trait Debug {
|
|||||||
struct Foo {
|
struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
"
|
r#"
|
||||||
mod fmt {
|
mod fmt {
|
||||||
pub struct Error;
|
pub struct Error;
|
||||||
pub type Result = Result<(), Error>;
|
pub type Result = Result<(), Error>;
|
||||||
@ -241,14 +246,14 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
${0:todo!()}
|
${0:todo!()}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn add_custom_impl_all() {
|
fn add_custom_impl_all() {
|
||||||
check_assist(
|
check_assist(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
mod foo {
|
mod foo {
|
||||||
pub trait Bar {
|
pub trait Bar {
|
||||||
type Qux;
|
type Qux;
|
||||||
@ -263,8 +268,8 @@ fn bar() {}
|
|||||||
struct Foo {
|
struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
"
|
r#"
|
||||||
mod foo {
|
mod foo {
|
||||||
pub trait Bar {
|
pub trait Bar {
|
||||||
type Qux;
|
type Qux;
|
||||||
@ -290,20 +295,20 @@ fn foo() {
|
|||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn add_custom_impl_for_unique_input() {
|
fn add_custom_impl_for_unique_input() {
|
||||||
check_assist(
|
check_assist(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive(Debu$0g)]
|
#[derive(Debu$0g)]
|
||||||
struct Foo {
|
struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
"
|
r#"
|
||||||
struct Foo {
|
struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
@ -311,7 +316,7 @@ struct Foo {
|
|||||||
impl Debug for Foo {
|
impl Debug for Foo {
|
||||||
$0
|
$0
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,13 +324,13 @@ impl Debug for Foo {
|
|||||||
fn add_custom_impl_for_with_visibility_modifier() {
|
fn add_custom_impl_for_with_visibility_modifier() {
|
||||||
check_assist(
|
check_assist(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive(Debug$0)]
|
#[derive(Debug$0)]
|
||||||
pub struct Foo {
|
pub struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
"
|
r#"
|
||||||
pub struct Foo {
|
pub struct Foo {
|
||||||
bar: String,
|
bar: String,
|
||||||
}
|
}
|
||||||
@ -333,7 +338,7 @@ pub struct Foo {
|
|||||||
impl Debug for Foo {
|
impl Debug for Foo {
|
||||||
$0
|
$0
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,18 +346,18 @@ impl Debug for Foo {
|
|||||||
fn add_custom_impl_when_multiple_inputs() {
|
fn add_custom_impl_when_multiple_inputs() {
|
||||||
check_assist(
|
check_assist(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive(Display, Debug$0, Serialize)]
|
#[derive(Display, Debug$0, Serialize)]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
",
|
"#,
|
||||||
"
|
r#"
|
||||||
#[derive(Display, Serialize)]
|
#[derive(Display, Serialize)]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
|
|
||||||
impl Debug for Foo {
|
impl Debug for Foo {
|
||||||
$0
|
$0
|
||||||
}
|
}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,10 +365,10 @@ impl Debug for Foo {
|
|||||||
fn test_ignore_derive_macro_without_input() {
|
fn test_ignore_derive_macro_without_input() {
|
||||||
check_assist_not_applicable(
|
check_assist_not_applicable(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive($0)]
|
#[derive($0)]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,18 +376,18 @@ struct Foo {}
|
|||||||
fn test_ignore_if_cursor_on_param() {
|
fn test_ignore_if_cursor_on_param() {
|
||||||
check_assist_not_applicable(
|
check_assist_not_applicable(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive$0(Debug)]
|
#[derive$0(Debug)]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
",
|
"#,
|
||||||
);
|
);
|
||||||
|
|
||||||
check_assist_not_applicable(
|
check_assist_not_applicable(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[derive(Debug)$0]
|
#[derive(Debug)$0]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,10 +395,22 @@ struct Foo {}
|
|||||||
fn test_ignore_if_not_derive() {
|
fn test_ignore_if_not_derive() {
|
||||||
check_assist_not_applicable(
|
check_assist_not_applicable(
|
||||||
replace_derive_with_manual_impl,
|
replace_derive_with_manual_impl,
|
||||||
"
|
r#"
|
||||||
#[allow(non_camel_$0case_types)]
|
#[allow(non_camel_$0case_types)]
|
||||||
struct Foo {}
|
struct Foo {}
|
||||||
",
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn works_at_start_of_file() {
|
||||||
|
cov_mark::check!(outside_of_attr_args);
|
||||||
|
check_assist_not_applicable(
|
||||||
|
replace_derive_with_manual_impl,
|
||||||
|
r#"
|
||||||
|
$0#[derive(Debug)]
|
||||||
|
struct S;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user