@@ -286,13 +286,13 @@ pub(crate) fn highlight_exit_points(
286
286
sema : & Semantics < ' _ , RootDatabase > ,
287
287
def_token : Option < SyntaxToken > ,
288
288
body : ast:: Expr ,
289
- ) -> Option < FxHashMap < EditionedFileId , Vec < HighlightedRange > > > {
290
- let mut highlights: FxHashMap < EditionedFileId , Vec < _ > > = FxHashMap :: default ( ) ;
289
+ ) -> Option < FxHashMap < EditionedFileId , FxHashSet < HighlightedRange > > > {
290
+ let mut highlights: FxHashMap < EditionedFileId , FxHashSet < _ > > = FxHashMap :: default ( ) ;
291
291
292
292
let mut push_to_highlights = |file_id, range| {
293
293
if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
294
294
let hrange = HighlightedRange { category : ReferenceCategory :: empty ( ) , range } ;
295
- highlights. entry ( file_id) . or_default ( ) . push ( hrange) ;
295
+ highlights. entry ( file_id) . or_default ( ) . insert ( hrange) ;
296
296
}
297
297
} ;
298
298
@@ -379,7 +379,7 @@ pub(crate) fn highlight_exit_points(
379
379
merge_map ( & mut res, new_map) ;
380
380
}
381
381
382
- res
382
+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
383
383
}
384
384
385
385
pub ( crate ) fn highlight_break_points (
@@ -392,13 +392,13 @@ pub(crate) fn highlight_break_points(
392
392
loop_token : Option < SyntaxToken > ,
393
393
label : Option < ast:: Label > ,
394
394
expr : ast:: Expr ,
395
- ) -> Option < FxHashMap < EditionedFileId , Vec < HighlightedRange > > > {
396
- let mut highlights: FxHashMap < EditionedFileId , Vec < _ > > = FxHashMap :: default ( ) ;
395
+ ) -> Option < FxHashMap < EditionedFileId , FxHashSet < HighlightedRange > > > {
396
+ let mut highlights: FxHashMap < EditionedFileId , FxHashSet < _ > > = FxHashMap :: default ( ) ;
397
397
398
398
let mut push_to_highlights = |file_id, range| {
399
399
if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
400
400
let hrange = HighlightedRange { category : ReferenceCategory :: empty ( ) , range } ;
401
- highlights. entry ( file_id) . or_default ( ) . push ( hrange) ;
401
+ highlights. entry ( file_id) . or_default ( ) . insert ( hrange) ;
402
402
}
403
403
} ;
404
404
@@ -445,11 +445,12 @@ pub(crate) fn highlight_break_points(
445
445
Some ( highlights)
446
446
}
447
447
448
- let mut res = FxHashMap :: default ( ) ;
449
- let token_kind = token. kind ( ) ;
450
448
let Some ( loops) = goto_definition:: find_loops ( sema, & token) else {
451
- return res ;
449
+ return FxHashMap :: default ( ) ;
452
450
} ;
451
+
452
+ let mut res = FxHashMap :: default ( ) ;
453
+ let token_kind = token. kind ( ) ;
453
454
for expr in loops {
454
455
let new_map = match & expr {
455
456
ast:: Expr :: LoopExpr ( l) => hl ( sema, token_kind, l. loop_token ( ) , l. label ( ) , expr) ,
@@ -461,7 +462,7 @@ pub(crate) fn highlight_break_points(
461
462
merge_map ( & mut res, new_map) ;
462
463
}
463
464
464
- res
465
+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
465
466
}
466
467
467
468
pub ( crate ) fn highlight_yield_points (
@@ -472,13 +473,13 @@ pub(crate) fn highlight_yield_points(
472
473
sema : & Semantics < ' _ , RootDatabase > ,
473
474
async_token : Option < SyntaxToken > ,
474
475
body : Option < ast:: Expr > ,
475
- ) -> Option < FxHashMap < EditionedFileId , Vec < HighlightedRange > > > {
476
- let mut highlights: FxHashMap < EditionedFileId , Vec < _ > > = FxHashMap :: default ( ) ;
476
+ ) -> Option < FxHashMap < EditionedFileId , FxHashSet < HighlightedRange > > > {
477
+ let mut highlights: FxHashMap < EditionedFileId , FxHashSet < _ > > = FxHashMap :: default ( ) ;
477
478
478
479
let mut push_to_highlights = |file_id, range| {
479
480
if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
480
481
let hrange = HighlightedRange { category : ReferenceCategory :: empty ( ) , range } ;
481
- highlights. entry ( file_id) . or_default ( ) . push ( hrange) ;
482
+ highlights. entry ( file_id) . or_default ( ) . insert ( hrange) ;
482
483
}
483
484
} ;
484
485
@@ -524,7 +525,7 @@ pub(crate) fn highlight_yield_points(
524
525
merge_map ( & mut res, new_map) ;
525
526
}
526
527
527
- res
528
+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
528
529
}
529
530
530
531
fn cover_range ( r0 : Option < TextRange > , r1 : Option < TextRange > ) -> Option < TextRange > {
@@ -553,8 +554,8 @@ fn original_frange(
553
554
}
554
555
555
556
fn merge_map (
556
- res : & mut FxHashMap < EditionedFileId , Vec < HighlightedRange > > ,
557
- new : Option < FxHashMap < EditionedFileId , Vec < HighlightedRange > > > ,
557
+ res : & mut FxHashMap < EditionedFileId , FxHashSet < HighlightedRange > > ,
558
+ new : Option < FxHashMap < EditionedFileId , FxHashSet < HighlightedRange > > > ,
558
559
) {
559
560
let Some ( new) = new else {
560
561
return ;
@@ -1967,6 +1968,38 @@ fn main() {
1967
1968
};
1968
1969
}
1969
1970
}
1971
+ "# ,
1972
+ )
1973
+ }
1974
+
1975
+ #[ test]
1976
+ fn no_highlight_on_return_in_macro_call ( ) {
1977
+ check (
1978
+ r#"
1979
+ //- minicore:include
1980
+ //- /lib.rs
1981
+ macro_rules! M {
1982
+ ($blk:expr) => {
1983
+ $blk
1984
+ };
1985
+ }
1986
+
1987
+ fn main() {
1988
+ fn f() {
1989
+ // ^^
1990
+ M!({ return$0; });
1991
+ // ^^^^^^
1992
+ // ^^^^^^^^^^^^^^^
1993
+
1994
+ include!("a.rs")
1995
+ // ^^^^^^^^^^^^^^^^
1996
+ }
1997
+ }
1998
+
1999
+ //- /a.rs
2000
+ {
2001
+ return;
2002
+ }
1970
2003
"# ,
1971
2004
)
1972
2005
}
0 commit comments