Skip to content

Commit 666343b

Browse files
committedJul 9, 2022
Auto merge of #12727 - DorianListens:dscheidt/extract-var-field-name, r=jonas-schievink
fix: Improve suggested names for extracted variables When extracting a field expression, if RA was unable to resolve the type of the field, we would previously fall back to using "var_name" as the variable name. Now, when the `Expr` being extracted matches a `FieldExpr`, we can use the `NameRef`'s ident token as a fallback option. fixes #10035
2 parents 2836dd1 + 21062f9 commit 666343b

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed
 

‎crates/ide-assists/src/handlers/extract_variable.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -943,8 +943,8 @@ struct S {
943943
}
944944
945945
fn foo(s: &mut S) {
946-
let $0var_name = &mut s.vec;
947-
var_name.push(0);
946+
let $0vec = &mut s.vec;
947+
vec.push(0);
948948
}"#,
949949
);
950950
}
@@ -979,8 +979,8 @@ struct S {
979979
}
980980
981981
fn foo(f: &mut Y) {
982-
let $0var_name = &mut f.field.field.vec;
983-
var_name.push(0);
982+
let $0vec = &mut f.field.field.vec;
983+
vec.push(0);
984984
}"#,
985985
);
986986
}

‎crates/ide-assists/src/utils/suggest_name.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ pub(crate) fn for_variable(expr: &ast::Expr, sema: &Semantics<'_, RootDatabase>)
9494

9595
let mut next_expr = Some(expr.clone());
9696
while let Some(expr) = next_expr {
97-
let name = from_call(&expr).or_else(|| from_type(&expr, sema));
97+
let name =
98+
from_call(&expr).or_else(|| from_type(&expr, sema)).or_else(|| from_field_name(&expr));
9899
if let Some(name) = name {
99100
return name;
100101
}
@@ -263,6 +264,15 @@ fn trait_name(trait_: &hir::Trait, db: &RootDatabase) -> Option<String> {
263264
Some(name)
264265
}
265266

267+
fn from_field_name(expr: &ast::Expr) -> Option<String> {
268+
let field = match expr {
269+
ast::Expr::FieldExpr(field) => field,
270+
_ => return None,
271+
};
272+
let ident = field.name_ref()?.ident_token()?;
273+
normalize(ident.text())
274+
}
275+
266276
#[cfg(test)]
267277
mod tests {
268278
use ide_db::base_db::{fixture::WithFixture, FileRange};
@@ -734,4 +744,17 @@ fn foo() { $0function.name().as_ref().unwrap().to_string()$0 }
734744
"name",
735745
);
736746
}
747+
748+
#[test]
749+
fn struct_field_name() {
750+
check(
751+
r#"
752+
struct S<T> {
753+
some_field: T;
754+
}
755+
fn foo<T>(some_struct: S<T>) { $0some_struct.some_field$0 }
756+
"#,
757+
"some_field",
758+
);
759+
}
737760
}

0 commit comments

Comments
 (0)