@@ -6,7 +6,6 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
66 """
77
88 alias ElixirLS.LanguageServer.SourceFile
9- #import ElixirLS.LanguageServer.Protocol
109
1110 def rename ( % SourceFile { } = source_file , start_uri , line , character , new_name ) do
1211 edits =
@@ -15,23 +14,24 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
1514 % ElixirSense.Location { } = definition <-
1615 ElixirSense . definition ( source_file . text , line , character ) ,
1716 references <- ElixirSense . references ( source_file . text , line , character ) do
18-
19-
2017 length_old = length ( char_ident )
2118
22- [
23- % {
24- uri: start_uri ,
25- range:
26- adjust_range (
27- definition . line ,
28- definition . column ,
29- definition . line ,
30- definition . column + length_old
19+ definition_references =
20+ case definition do
21+ % { type: :function } ->
22+ parse_definition_source_code ( definition , source_file . text )
23+ |> get_all_fn_header_positions ( char_ident )
24+ |> positions_to_references ( start_uri , length_old )
25+
26+ _ ->
27+ positions_to_references (
28+ [ { definition . line , definition . column } ] ,
29+ start_uri ,
30+ length_old
3131 )
32- }
33- | repack_references ( references , start_uri )
34- ]
32+ end
33+
34+ definition_references ++ repack_references ( references , start_uri )
3535 else
3636 _ ->
3737 [ ]
@@ -62,7 +62,9 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
6262 begin: { start_line , start_col } ,
6363 end: { end_line , end_col } ,
6464 context: { context , char_ident }
65- } when context in [ :local_or_var , :local_call ] <- Code.Fragment . surround_context ( source_file . text , { line , character } ) do
65+ }
66+ when context in [ :local_or_var , :local_call ] <-
67+ Code.Fragment . surround_context ( source_file . text , { line , character } ) do
6668 % {
6769 range: adjust_range ( start_line , start_col , end_line , end_col ) ,
6870 placeholder: to_string ( char_ident )
@@ -91,6 +93,36 @@ defmodule ElixirLS.LanguageServer.Providers.Rename do
9193 end
9294 end
9395
96+ defp parse_definition_source_code ( definition , source_text )
97+
98+ defp parse_definition_source_code ( % { file: nil } , source_text ) do
99+ ElixirSense.Core.Parser . parse_string ( source_text , true , true , 0 )
100+ end
101+
102+ defp parse_definition_source_code ( % { file: file } , _ ) do
103+ ElixirSense.Core.Parser . parse_file ( file , true , true , 0 )
104+ end
105+
106+ defp get_all_fn_header_positions ( parsed_source , char_ident ) do
107+ parsed_source . mods_funs_to_positions
108+ |> Map . filter ( fn
109+ { { _ , fn_name , _ } , _ } -> Atom . to_charlist ( fn_name ) == char_ident
110+ end )
111+ |> Enum . flat_map ( fn { _ , % { positions: positions } } -> positions end )
112+ |> Enum . uniq ( )
113+ end
114+
115+ defp positions_to_references ( header_positions , start_uri , length_old )
116+ when is_list ( header_positions ) do
117+ header_positions
118+ |> Enum . map ( fn { line , column } ->
119+ % {
120+ uri: start_uri ,
121+ range: adjust_range ( line , column , line , column + length_old )
122+ }
123+ end )
124+ end
125+
94126 defp adjust_range ( start_line , start_character , end_line , end_character ) do
95127 % {
96128 start: % { line: start_line - 1 , character: start_character - 1 } ,
0 commit comments