Skip to content

Commit

Permalink
Add str_ref_to_string fix
Browse files Browse the repository at this point in the history
Signed-off-by: hi-rustin <rustin.liu@gmail.com>
  • Loading branch information
Rustin170506 committed Jul 5, 2022
1 parent 6edf624 commit be023ab
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions crates/ide-diagnostics/src/handlers/type_mismatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::TypeMismatch) -> Option<Vec<Assi
add_reference(ctx, d, &mut fixes);
add_missing_ok_or_some(ctx, d, &mut fixes);
remove_semicolon(ctx, d, &mut fixes);
str_ref_to_string(ctx, d, &mut fixes);

if fixes.is_empty() {
None
Expand Down Expand Up @@ -134,6 +135,32 @@ fn remove_semicolon(
Some(())
}

fn str_ref_to_string(
ctx: &DiagnosticsContext<'_>,
d: &hir::TypeMismatch,
acc: &mut Vec<Assist>,
) -> Option<()> {
let expected = d.expected.display(ctx.sema.db);
let actual = d.actual.display(ctx.sema.db);

if expected.to_string() != "String" || actual.to_string() != "&str" {
return None;
}

let root = ctx.sema.db.parse_or_expand(d.expr.file_id)?;
let expr = d.expr.value.to_node(&root);
let expr_range = expr.syntax().text_range();

let ampersands = format!(".to_string()");

let edit = TextEdit::insert(expr.syntax().text_range().end(), ampersands);
let source_change =
SourceChange::from_text_edit(d.expr.file_id.original_file(ctx.sema.db), edit);
acc.push(fix("str_ref_to_string", "Use to_string() here", source_change, expr_range));

Some(())
}

#[cfg(test)]
mod tests {
use crate::tests::{check_diagnostics, check_fix, check_no_fix};
Expand Down Expand Up @@ -498,4 +525,20 @@ fn foo() -> SomeOtherEnum { 0$0 }
fn remove_semicolon() {
check_fix(r#"fn f() -> i32 { 92$0; }"#, r#"fn f() -> i32 { 92 }"#);
}

#[test]
fn str_ref_to_string() {
check_fix(
r#"
fn test() -> String {
"a"$0
}
"#,
r#"
fn test() -> String {
"a".to_string()
}
"#,
);
}
}

0 comments on commit be023ab

Please sign in to comment.