@@ -254,7 +254,9 @@ impl<'a> CompletionContext<'a> {
254254 // match foo { $0 }
255255 // match foo { ..., pat => $0 }
256256 ast:: MatchExpr ( it) => {
257- let ty = if self . previous_token_is( T ![ =>] ) {
257+ let on_arrow = previous_non_trivia_token( self . token. clone( ) ) . map_or( false , |it| T ![ =>] == it. kind( ) ) ;
258+
259+ let ty = if on_arrow {
258260 // match foo { ..., pat => $0 }
259261 cov_mark:: hit!( expected_type_match_arm_body_without_leading_char) ;
260262 cov_mark:: hit!( expected_type_match_arm_body_with_leading_char) ;
@@ -327,9 +329,6 @@ impl<'a> CompletionContext<'a> {
327329 return None ;
328330 }
329331
330- self . previous_token =
331- syntax_element. clone ( ) . into_token ( ) . and_then ( previous_non_trivia_token) ;
332-
333332 ( self . expected_type , self . expected_name ) = self . expected_type_and_name ( ) ;
334333
335334 // Overwrite the path kind for derives
@@ -368,19 +367,19 @@ impl<'a> CompletionContext<'a> {
368367 } else {
369368 // Fix up trailing whitespace problem
370369 // #[attr(foo = $0
371- let token = if self . token . kind ( ) == SyntaxKind :: WHITESPACE {
372- self . previous_token . as_ref ( ) ?
373- } else {
374- & self . token
375- } ;
370+ let token =
371+ syntax:: algo:: skip_trivia_token ( self . token . clone ( ) , Direction :: Prev ) ?;
376372 let p = token. parent ( ) ?;
377373 if p. kind ( ) == SyntaxKind :: TOKEN_TREE
378374 && p. ancestors ( ) . any ( |it| it. kind ( ) == SyntaxKind :: META )
379375 {
376+ let colon_prefix = previous_non_trivia_token ( self . token . clone ( ) )
377+ . map_or ( false , |it| T ! [ : ] == it. kind ( ) ) ;
380378 self . ident_ctx = IdentContext :: UnexpandedAttrTT {
381379 fake_attribute_under_caret : syntax_element
382380 . ancestors ( )
383381 . find_map ( ast:: Attr :: cast) ,
382+ colon_prefix,
384383 } ;
385384 } else {
386385 return None ;
@@ -493,12 +492,15 @@ impl<'a> CompletionContext<'a> {
493492 |kind| ( NameRefContext { nameref : nameref. clone ( ) , kind } , Default :: default ( ) ) ;
494493
495494 if let Some ( record_field) = ast:: RecordExprField :: for_field_name ( & name_ref) {
495+ let dot_prefix = previous_non_trivia_token ( name_ref. syntax ( ) . clone ( ) )
496+ . map_or ( false , |it| T ! [ . ] == it. kind ( ) ) ;
497+
496498 return find_node_in_file_compensated (
497499 sema,
498500 original_file,
499501 & record_field. parent_record_lit ( ) ,
500502 )
501- . map ( NameRefKind :: RecordExpr )
503+ . map ( |expr| NameRefKind :: RecordExpr { expr , dot_prefix } )
502504 . map ( make_res) ;
503505 }
504506 if let Some ( record_field) = ast:: RecordPatField :: for_field_name_ref ( & name_ref) {
@@ -1180,8 +1182,12 @@ pub(crate) fn is_in_loop_body(node: &SyntaxNode) -> bool {
11801182 . is_some ( )
11811183}
11821184
1183- fn previous_non_trivia_token ( token : SyntaxToken ) -> Option < SyntaxToken > {
1184- let mut token = token. prev_token ( ) ;
1185+ fn previous_non_trivia_token ( e : impl Into < SyntaxElement > ) -> Option < SyntaxToken > {
1186+ let mut token = match e. into ( ) {
1187+ SyntaxElement :: Node ( n) => n. first_token ( ) ?,
1188+ SyntaxElement :: Token ( t) => t,
1189+ }
1190+ . prev_token ( ) ;
11851191 while let Some ( inner) = token {
11861192 if !inner. kind ( ) . is_trivia ( ) {
11871193 return Some ( inner) ;
0 commit comments