@@ -286,13 +286,13 @@ pub(crate) fn highlight_exit_points(
286286 sema : & Semantics < ' _ , RootDatabase > ,
287287 def_token : Option < SyntaxToken > ,
288288 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 ( ) ;
291291
292292 let mut push_to_highlights = |file_id, range| {
293293 if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
294294 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) ;
296296 }
297297 } ;
298298
@@ -379,7 +379,7 @@ pub(crate) fn highlight_exit_points(
379379 merge_map ( & mut res, new_map) ;
380380 }
381381
382- res
382+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
383383}
384384
385385pub ( crate ) fn highlight_break_points (
@@ -392,13 +392,13 @@ pub(crate) fn highlight_break_points(
392392 loop_token : Option < SyntaxToken > ,
393393 label : Option < ast:: Label > ,
394394 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 ( ) ;
397397
398398 let mut push_to_highlights = |file_id, range| {
399399 if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
400400 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) ;
402402 }
403403 } ;
404404
@@ -445,11 +445,12 @@ pub(crate) fn highlight_break_points(
445445 Some ( highlights)
446446 }
447447
448- let mut res = FxHashMap :: default ( ) ;
449- let token_kind = token. kind ( ) ;
450448 let Some ( loops) = goto_definition:: find_loops ( sema, & token) else {
451- return res ;
449+ return FxHashMap :: default ( ) ;
452450 } ;
451+
452+ let mut res = FxHashMap :: default ( ) ;
453+ let token_kind = token. kind ( ) ;
453454 for expr in loops {
454455 let new_map = match & expr {
455456 ast:: Expr :: LoopExpr ( l) => hl ( sema, token_kind, l. loop_token ( ) , l. label ( ) , expr) ,
@@ -461,7 +462,7 @@ pub(crate) fn highlight_break_points(
461462 merge_map ( & mut res, new_map) ;
462463 }
463464
464- res
465+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
465466}
466467
467468pub ( crate ) fn highlight_yield_points (
@@ -472,13 +473,13 @@ pub(crate) fn highlight_yield_points(
472473 sema : & Semantics < ' _ , RootDatabase > ,
473474 async_token : Option < SyntaxToken > ,
474475 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 ( ) ;
477478
478479 let mut push_to_highlights = |file_id, range| {
479480 if let Some ( FileRange { file_id, range } ) = original_frange ( sema. db , file_id, range) {
480481 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) ;
482483 }
483484 } ;
484485
@@ -524,7 +525,7 @@ pub(crate) fn highlight_yield_points(
524525 merge_map ( & mut res, new_map) ;
525526 }
526527
527- res
528+ res. into_iter ( ) . map ( | ( file_id , ranges ) | ( file_id , ranges . into_iter ( ) . collect ( ) ) ) . collect ( )
528529}
529530
530531fn cover_range ( r0 : Option < TextRange > , r1 : Option < TextRange > ) -> Option < TextRange > {
@@ -553,8 +554,8 @@ fn original_frange(
553554}
554555
555556fn 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 > > > ,
558559) {
559560 let Some ( new) = new else {
560561 return ;
@@ -1967,6 +1968,38 @@ fn main() {
19671968 };
19681969 }
19691970}
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+ }
19702003"# ,
19712004 )
19722005 }
0 commit comments