@@ -273,9 +273,10 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
273
273
syntax:: SyntaxElement :: Token ( it) => {
274
274
// Don't have a way to make tokens mut, so instead make the parent mut
275
275
// and find the token again
276
- let parent = edit. make_syntax_mut ( it. parent ( ) . unwrap ( ) ) ;
276
+ let parent =
277
+ edit. make_syntax_mut ( it. parent ( ) . expect ( "Token must have a parent." ) ) ;
277
278
let mut_token =
278
- parent. covering_element ( it. text_range ( ) ) . into_token ( ) . unwrap ( ) ;
279
+ parent. covering_element ( it. text_range ( ) ) . into_token ( ) . expect ( "Covering element cannot be found. Range may be beyond the current node's range" ) ;
279
280
280
281
syntax:: SyntaxElement :: from ( mut_token)
281
282
}
@@ -446,21 +447,23 @@ fn build_pat(
446
447
mod_path_to_ast ( & module. find_use_path ( db, ModuleDef :: from ( var) , prefer_no_std) ?) ;
447
448
448
449
// FIXME: use HIR for this; it doesn't currently expose struct vs. tuple vs. unit variants though
449
- let pat : ast :: Pat = match var. source ( db) ?. value . kind ( ) {
450
+ Some ( match var. source ( db) ?. value . kind ( ) {
450
451
ast:: StructKind :: Tuple ( field_list) => {
451
452
let pats =
452
453
iter:: repeat ( make:: wildcard_pat ( ) . into ( ) ) . take ( field_list. fields ( ) . count ( ) ) ;
453
454
make:: tuple_struct_pat ( path, pats) . into ( )
454
455
}
455
456
ast:: StructKind :: Record ( field_list) => {
456
- let pats = field_list
457
- . fields ( )
458
- . map ( |f| make:: ext:: simple_ident_pat ( f. name ( ) . unwrap ( ) ) . into ( ) ) ;
457
+ let pats = field_list. fields ( ) . map ( |f| {
458
+ make:: ext:: simple_ident_pat (
459
+ f. name ( ) . expect ( "Record field must have a name" ) ,
460
+ )
461
+ . into ( )
462
+ } ) ;
459
463
make:: record_pat ( path, pats) . into ( )
460
464
}
461
465
ast:: StructKind :: Unit => make:: path_pat ( path) ,
462
- } ;
463
- Some ( pat)
466
+ } )
464
467
}
465
468
ExtendedVariant :: True => Some ( ast:: Pat :: from ( make:: literal_pat ( "true" ) ) ) ,
466
469
ExtendedVariant :: False => Some ( ast:: Pat :: from ( make:: literal_pat ( "false" ) ) ) ,
@@ -1941,4 +1944,35 @@ fn main() {
1941
1944
"# ,
1942
1945
) ;
1943
1946
}
1947
+
1948
+ /// See [`discussion`](https://github.com/rust-lang/rust-analyzer/pull/15594#discussion_r1322960614)
1949
+ #[ test]
1950
+ fn missing_field_name ( ) {
1951
+ check_assist (
1952
+ add_missing_match_arms,
1953
+ r#"
1954
+ enum A {
1955
+ A,
1956
+ Missing { a: u32, : u32, c: u32 }
1957
+ }
1958
+
1959
+ fn a() {
1960
+ let b = A::A;
1961
+ match b$0 {}
1962
+ }"# ,
1963
+ r#"
1964
+ enum A {
1965
+ A,
1966
+ Missing { a: u32, : u32, c: u32 }
1967
+ }
1968
+
1969
+ fn a() {
1970
+ let b = A::A;
1971
+ match b {
1972
+ $0A::A => todo!(),
1973
+ A::Missing { a, u32, c } => todo!(),
1974
+ }
1975
+ }"# ,
1976
+ )
1977
+ }
1944
1978
}
0 commit comments