@@ -756,9 +756,13 @@ pub fn handle_code_action(
756
756
handle_fixes ( & world, & params, & mut res) ?;
757
757
758
758
if world. config . client_caps . resolve_code_action {
759
- for assist in world. analysis ( ) . unresolved_assists ( & world. config . assist , frange) ?. into_iter ( )
759
+ for ( index, assist) in world
760
+ . analysis ( )
761
+ . unresolved_assists ( & world. config . assist , frange) ?
762
+ . into_iter ( )
763
+ . enumerate ( )
760
764
{
761
- res. push ( to_proto:: unresolved_code_action ( & world, assist) ?) ;
765
+ res. push ( to_proto:: unresolved_code_action ( & world, assist, index ) ?) ;
762
766
}
763
767
} else {
764
768
for assist in world. analysis ( ) . resolved_assists ( & world. config . assist , frange) ?. into_iter ( ) {
@@ -773,24 +777,19 @@ pub fn handle_resolve_code_action(
773
777
world : WorldSnapshot ,
774
778
params : lsp_ext:: ResolveCodeActionParams ,
775
779
) -> Result < Option < lsp_ext:: SnippetWorkspaceEdit > > {
776
- if !world. config . client_caps . resolve_code_action {
777
- return Ok ( None ) ;
778
- }
779
-
780
780
let _p = profile ( "handle_resolve_code_action" ) ;
781
781
let file_id = from_proto:: file_id ( & world, & params. code_action_params . text_document . uri ) ?;
782
782
let line_index = world. analysis ( ) . file_line_index ( file_id) ?;
783
783
let range = from_proto:: text_range ( & line_index, params. code_action_params . range ) ;
784
784
let frange = FileRange { file_id, range } ;
785
- let mut res: Vec < lsp_ext:: CodeAction > = Vec :: new ( ) ;
786
785
787
- for assist in world. analysis ( ) . resolved_assists ( & world. config . assist , frange) ?. into_iter ( ) {
788
- res . push ( to_proto :: resolved_code_action ( & world , assist ) ? ) ;
789
- }
790
- Ok ( res
791
- . into_iter ( )
792
- . find ( |action| action . id . clone ( ) . unwrap ( ) == params . id && action . title == params . label )
793
- . and_then ( |action| action . edit ) )
786
+ let assists = world. analysis ( ) . resolved_assists ( & world. config . assist , frange) ?;
787
+ let id_components = params . id . split ( ":" ) . collect :: < Vec < & str > > ( ) ;
788
+ let index = id_components . last ( ) . unwrap ( ) . parse :: < usize > ( ) . unwrap ( ) ;
789
+ let id_string = id_components . first ( ) . unwrap ( ) ;
790
+ let assist = & assists [ index ] ;
791
+ assert ! ( assist . assist . id . 0 == * id_string ) ;
792
+ Ok ( to_proto :: resolved_code_action ( & world , assist . clone ( ) ) ? . edit )
794
793
}
795
794
796
795
pub fn handle_code_lens (
0 commit comments