@@ -14,7 +14,7 @@ mod tests;
14
14
15
15
use std:: ops:: ControlFlow ;
16
16
17
- use hir:: { InFile , InRealFile , MacroFileIdExt , MacroKind , Name , Semantics } ;
17
+ use hir:: { HirFileIdExt , InFile , InRealFile , MacroFileIdExt , MacroKind , Name , Semantics } ;
18
18
use ide_db:: { FxHashMap , Ranker , RootDatabase , SymbolKind } ;
19
19
use span:: EditionedFileId ;
20
20
use syntax:: {
@@ -371,8 +371,7 @@ fn traverse(
371
371
InFile :: new ( file_id. into ( ) , element)
372
372
} ;
373
373
374
- // string highlight injections, note this does not use the descended element as proc-macros
375
- // can rewrite string literals which invalidates our indices
374
+ // string highlight injections
376
375
if let ( Some ( original_token) , Some ( descended_token) ) =
377
376
( original_token, descended_element. value . as_token ( ) )
378
377
{
@@ -390,6 +389,7 @@ fn traverse(
390
389
}
391
390
}
392
391
392
+ let edition = descended_element. file_id . edition ( sema. db ) ;
393
393
let element = match descended_element. value {
394
394
NodeOrToken :: Node ( name_like) => {
395
395
let hl = highlight:: name_like (
@@ -398,7 +398,7 @@ fn traverse(
398
398
& mut bindings_shadow_count,
399
399
config. syntactic_name_ref_highlighting ,
400
400
name_like,
401
- file_id . edition ( ) ,
401
+ edition,
402
402
) ;
403
403
if hl. is_some ( ) && !in_macro {
404
404
// skip highlighting the contained token of our name-like node
@@ -408,7 +408,7 @@ fn traverse(
408
408
hl
409
409
}
410
410
NodeOrToken :: Token ( token) => {
411
- highlight:: token ( sema, token, file_id . edition ( ) , tt_level > 0 ) . zip ( Some ( None ) )
411
+ highlight:: token ( sema, token, edition, tt_level > 0 ) . zip ( Some ( None ) )
412
412
}
413
413
} ;
414
414
if let Some ( ( mut highlight, binding_hash) ) = element {
@@ -448,10 +448,11 @@ fn string_injections(
448
448
token : SyntaxToken ,
449
449
descended_token : & SyntaxToken ,
450
450
) -> ControlFlow < ( ) > {
451
- if ast:: String :: can_cast ( token. kind ( ) ) && ast:: String :: can_cast ( descended_token. kind ( ) ) {
452
- let string = ast:: String :: cast ( token) ;
453
- let string_to_highlight = ast:: String :: cast ( descended_token. clone ( ) ) ;
454
- if let Some ( ( string, descended_string) ) = string. zip ( string_to_highlight) {
451
+ if !matches ! ( token. kind( ) , STRING | BYTE_STRING | BYTE | CHAR | C_STRING ) {
452
+ return ControlFlow :: Continue ( ( ) ) ;
453
+ }
454
+ if let Some ( string) = ast:: String :: cast ( token. clone ( ) ) {
455
+ if let Some ( descended_string) = ast:: String :: cast ( descended_token. clone ( ) ) {
455
456
if string. is_raw ( )
456
457
&& inject:: ra_fixture ( hl, sema, config, & string, & descended_string) . is_some ( )
457
458
{
@@ -463,32 +464,17 @@ fn string_injections(
463
464
highlight_escape_string ( hl, & string) ;
464
465
}
465
466
}
466
- } else if ast:: ByteString :: can_cast ( token. kind ( ) )
467
- && ast:: ByteString :: can_cast ( descended_token. kind ( ) )
468
- {
469
- if let Some ( byte_string) = ast:: ByteString :: cast ( token) {
470
- if !byte_string. is_raw ( ) {
471
- highlight_escape_string ( hl, & byte_string) ;
472
- }
467
+ } else if let Some ( byte_string) = ast:: ByteString :: cast ( token. clone ( ) ) {
468
+ if !byte_string. is_raw ( ) {
469
+ highlight_escape_string ( hl, & byte_string) ;
473
470
}
474
- } else if ast:: CString :: can_cast ( token. kind ( ) ) && ast:: CString :: can_cast ( descended_token. kind ( ) )
475
- {
476
- if let Some ( c_string) = ast:: CString :: cast ( token) {
477
- if !c_string. is_raw ( ) {
478
- highlight_escape_string ( hl, & c_string) ;
479
- }
471
+ } else if let Some ( c_string) = ast:: CString :: cast ( token. clone ( ) ) {
472
+ if !c_string. is_raw ( ) {
473
+ highlight_escape_string ( hl, & c_string) ;
480
474
}
481
- } else if ast:: Char :: can_cast ( token. kind ( ) ) && ast:: Char :: can_cast ( descended_token. kind ( ) ) {
482
- let Some ( char) = ast:: Char :: cast ( token) else {
483
- return ControlFlow :: Break ( ( ) ) ;
484
- } ;
485
-
475
+ } else if let Some ( char) = ast:: Char :: cast ( token. clone ( ) ) {
486
476
highlight_escape_char ( hl, & char)
487
- } else if ast:: Byte :: can_cast ( token. kind ( ) ) && ast:: Byte :: can_cast ( descended_token. kind ( ) ) {
488
- let Some ( byte) = ast:: Byte :: cast ( token) else {
489
- return ControlFlow :: Break ( ( ) ) ;
490
- } ;
491
-
477
+ } else if let Some ( byte) = ast:: Byte :: cast ( token) {
492
478
highlight_escape_byte ( hl, & byte)
493
479
}
494
480
ControlFlow :: Continue ( ( ) )
@@ -536,10 +522,10 @@ fn descend_token(
536
522
token. map ( |token| match token. parent ( ) . and_then ( ast:: NameLike :: cast) {
537
523
// Remap the token into the wrapping single token nodes
538
524
Some ( parent) => match ( token. kind ( ) , parent. syntax ( ) . kind ( ) ) {
539
- ( T ! [ self ] | T ! [ ident ] , NAME | NAME_REF ) => NodeOrToken :: Node ( parent ) ,
540
- ( T ! [ self ] | T ! [ super ] | T ! [ crate ] | T ! [ Self ] , NAME_REF ) => NodeOrToken :: Node ( parent ) ,
541
- ( INT_NUMBER , NAME_REF ) => NodeOrToken :: Node ( parent ) ,
542
- ( LIFETIME_IDENT , LIFETIME ) => NodeOrToken :: Node ( parent) ,
525
+ ( T ! [ ident ] | T ! [ self ] , NAME )
526
+ | ( T ! [ ident ] | T ! [ self ] | T ! [ super ] | T ! [ crate ] | T ! [ Self ] , NAME_REF )
527
+ | ( INT_NUMBER , NAME_REF )
528
+ | ( LIFETIME_IDENT , LIFETIME ) => NodeOrToken :: Node ( parent) ,
543
529
_ => NodeOrToken :: Token ( token) ,
544
530
} ,
545
531
None => NodeOrToken :: Token ( token) ,
0 commit comments