@@ -59,7 +59,10 @@ use ide_db::{
59
59
symbol_index:: { self , FileSymbol } ,
60
60
LineIndexDatabase ,
61
61
} ;
62
- use syntax:: SourceFile ;
62
+ use syntax:: {
63
+ ast:: { self , AstNode , AstToken } ,
64
+ SourceFile ,
65
+ } ;
63
66
64
67
use crate :: display:: ToNav ;
65
68
@@ -504,7 +507,11 @@ impl Analysis {
504
507
resolve : bool ,
505
508
frange : FileRange ,
506
509
) -> Cancelable < Vec < Assist > > {
507
- self . with_db ( |db| Assist :: get ( db, config, resolve, frange) )
510
+ self . with_db ( |db| {
511
+ let mut acc = Assist :: get ( db, config, resolve, frange) ;
512
+ add_ssr_assist ( db, & mut acc, resolve, frange) ;
513
+ acc
514
+ } )
508
515
}
509
516
510
517
/// Computes the set of diagnostics for the given file.
@@ -579,6 +586,33 @@ impl Analysis {
579
586
}
580
587
}
581
588
589
+ fn add_ssr_assist (
590
+ db : & RootDatabase ,
591
+ base : & mut Vec < Assist > ,
592
+ resolve : bool ,
593
+ frange : FileRange ,
594
+ ) -> Option < ( ) > {
595
+ let comment = {
596
+ let file = db. parse ( frange. file_id ) ;
597
+ file. tree ( ) . syntax ( ) . token_at_offset ( frange. range . start ( ) ) . find_map ( ast:: Comment :: cast)
598
+ } ?;
599
+ let match_finder = ide_ssr:: ssr_from_comment ( db, frange, & comment) . ok ( ) ?;
600
+
601
+ let mut assist = Assist {
602
+ id : AssistId ( "ssr" , AssistKind :: RefactorRewrite ) ,
603
+ label : Label :: new ( "Apply SSR" ) ,
604
+ group : None ,
605
+ target : comment. syntax ( ) . text_range ( ) ,
606
+ source_change : None ,
607
+ } ;
608
+ if resolve {
609
+ assist. source_change = Some ( SourceChange :: from_edits ( match_finder. edits ( ) , Vec :: new ( ) ) ) ;
610
+ }
611
+
612
+ base. push ( assist) ;
613
+ Some ( ( ) )
614
+ }
615
+
582
616
#[ test]
583
617
fn analysis_is_send ( ) {
584
618
fn is_send < T : Send > ( ) { }
0 commit comments