1
1
-- ----------------------------------------------------------------------------
2
2
-- Language Server Protocol --
3
3
-- --
4
- -- Copyright (C) 2020-2022 , AdaCore --
4
+ -- Copyright (C) 2020-2023 , AdaCore --
5
5
-- --
6
6
-- This is free software; you can redistribute it and/or modify it under --
7
7
-- terms of the GNU General Public License as published by the Free Soft- --
16
16
-- ----------------------------------------------------------------------------
17
17
18
18
with Ada.Strings.UTF_Encoding ;
19
- with Ada.Strings.Unbounded ;
20
19
with Ada.Strings.Wide_Wide_Unbounded ;
21
20
22
21
with Langkit_Support.Text ;
23
22
24
23
with Libadalang.Analysis ;
25
- with Libadalang.Common ;
26
-
27
- with Laltools.Common ;
28
24
25
+ with LSP.Commands ;
29
26
with LSP.Messages ;
30
27
31
28
with VSS.Strings.Conversions ;
32
- with LSP.Commands ;
33
29
34
- package body LSP.Ada_Handlers.Refactor.Imports_Commands is
30
+ package body LSP.Ada_Handlers.Refactor.Auto_Import is
35
31
36
32
-- --------------
37
33
-- Initialize --
@@ -46,8 +42,11 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
46
42
begin
47
43
Self.Context := Context.Id;
48
44
Self.Where := Where;
49
- Self.With_Clause := With_Clause;
50
- Self.Prefix := Prefix;
45
+ Self.Suggestion :=
46
+ (Import =>
47
+ VSS.Strings.Conversions.To_Unbounded_Wide_Wide_String (With_Clause),
48
+ Qualifier =>
49
+ VSS.Strings.Conversions.To_Unbounded_Wide_Wide_String (Prefix));
51
50
end Initialize ;
52
51
53
52
-- ----------
@@ -74,10 +73,25 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
74
73
LSP.Types.Read_String (JS, V.Context);
75
74
elsif Key = " where" then
76
75
LSP.Messages.TextDocumentPositionParams'Read (JS, V.Where);
77
- elsif Key = " with_clause" then
78
- LSP.Types.Read_String (JS, V.With_Clause);
79
- elsif Key = " prefix" then
80
- LSP.Types.Read_String (JS, V.Prefix);
76
+ elsif Key = " import" then
77
+ declare
78
+ Import : VSS.Strings.Virtual_String;
79
+ begin
80
+ LSP.Types.Read_String (JS, Import);
81
+ V.Suggestion.Import :=
82
+ VSS.Strings.Conversions.To_Unbounded_Wide_Wide_String
83
+ (Import);
84
+ end ;
85
+
86
+ elsif Key = " qualifier" then
87
+ declare
88
+ Qualififer : VSS.Strings.Virtual_String;
89
+ begin
90
+ LSP.Types.Read_String (JS, Qualififer);
91
+ V.Suggestion.Qualifier :=
92
+ VSS.Strings.Conversions.To_Unbounded_Wide_Wide_String
93
+ (Qualififer);
94
+ end ;
81
95
else
82
96
JS.Skip_Value;
83
97
end if ;
@@ -96,13 +110,13 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
96
110
Context : Context_Access;
97
111
Where : LSP.Messages.Location;
98
112
Commands_Vector : in out LSP.Messages.CodeAction_Vector;
99
- Suggestion : LAL_Refactor.Refactor_Imports.Import_Suggestion )
113
+ Suggestion : LAL_Refactor.Auto_Import.Import_Type )
100
114
is
101
115
Pointer : LSP.Commands.Command_Pointer;
102
116
Item : LSP.Messages.CodeAction;
103
117
104
118
function Create_Suggestion_Title
105
- (Suggestion : LAL_Refactor.Refactor_Imports.Import_Suggestion )
119
+ (Suggestion : LAL_Refactor.Auto_Import.Import_Type )
106
120
return VSS.Strings.Virtual_String;
107
121
-- Creates the suggestion text that will be shown by the client to
108
122
-- to the developer. The text is costumized based on the need of
@@ -112,42 +126,17 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
112
126
-- Create_Suggestions_Title --
113
127
-- ----------------------------
114
128
function Create_Suggestion_Title
115
- (Suggestion : LAL_Refactor.Refactor_Imports.Import_Suggestion )
129
+ (Suggestion : LAL_Refactor.Auto_Import.Import_Type )
116
130
return VSS.Strings.Virtual_String
117
131
is
118
- Title : Ada.Strings.Wide_Wide_Unbounded.
119
- Unbounded_Wide_Wide_String
120
- := Ada.Strings.Wide_Wide_Unbounded.
121
- Null_Unbounded_Wide_Wide_String;
122
- use type Ada.Strings.Wide_Wide_Unbounded.
123
- Unbounded_Wide_Wide_String;
132
+ use Ada.Strings.Wide_Wide_Unbounded;
124
133
134
+ Title : constant Langkit_Support.Text.Unbounded_Text_Type :=
135
+ " Qualify with " & Suggestion.Qualifier;
125
136
begin
126
- if Suggestion.With_Clause_Text /= " " then
127
- if Suggestion.Prefix_Text /= " " then
128
- -- Add with clause and prefix
129
- Title :=
130
- Title
131
- & " Add 'with' clause for "
132
- & Suggestion.With_Clause_Text
133
- & " and prefix the object with "
134
- & Suggestion.Prefix_Text;
135
-
136
- else
137
- -- Add with clause and leave the prefix as it is
138
- Title :=
139
- Title
140
- & " Add 'with' clause for "
141
- & Suggestion.With_Clause_Text;
142
- end if ;
143
- else
144
- -- Only add prefix
145
-
146
- Title := Title & " Prefix the object with "
147
- & Suggestion.Prefix_Text;
148
- end if ;
149
- return VSS.Strings.To_Virtual_String
150
- (Langkit_Support.Text.To_Text (Title));
137
+ return
138
+ VSS.Strings.To_Virtual_String
139
+ (Langkit_Support.Text.To_Text (Title));
151
140
end Create_Suggestion_Title ;
152
141
153
142
begin
@@ -157,15 +146,15 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
157
146
Where.span.first),
158
147
With_Clause =>
159
148
VSS.Strings.Conversions.To_Virtual_String
160
- (Suggestion.With_Clause_Text ),
149
+ (Suggestion.Import ),
161
150
Prefix =>
162
151
VSS.Strings.Conversions.To_Virtual_String
163
- (Suggestion.Prefix_Text ));
152
+ (Suggestion.Qualifier ));
164
153
Pointer.Set (Self);
165
154
Item :=
166
155
(title => Create_Suggestion_Title (Suggestion),
167
156
kind => (Is_Set => True,
168
- Value => LSP.Messages.RefactorRewrite ),
157
+ Value => LSP.Messages.QuickFix ),
169
158
diagnostics => (Is_Set => False),
170
159
disabled => (Is_Set => False),
171
160
edit => (Is_Set => False),
@@ -188,119 +177,20 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
188
177
Document : LSP.Ada_Documents.Document_Access)
189
178
return LAL_Refactor.Refactoring_Edits
190
179
is
191
- use Langkit_Support.Text;
192
180
use Libadalang.Analysis;
193
- use Libadalang.Common;
194
- use Libadalang.Slocs;
195
- use LAL_Refactor;
196
- use VSS.Strings;
197
- use VSS.Strings.Conversions;
181
+ use LAL_Refactor.Auto_Import;
198
182
199
- Node : Ada_Node :=
200
- Document.Get_Node_At (Context, Self.Where.position);
183
+ Name : constant Libadalang.Analysis.Name :=
184
+ Document.Get_Node_At (Context, Self.Where.position).As_Name ;
201
185
202
- Edits : LAL_Refactor.Refactoring_Edits ;
186
+ function Units return Analysis_Unit_Array is ([]) ;
203
187
204
188
begin
205
- -- Add prefix
206
-
207
- if not Self.Prefix.Is_Empty
208
- and then Node.Kind in Ada_Identifier
209
- then
210
- -- If this is a DottedName them remove the current prefix and replace
211
- -- it by the suggested one. Otherwise, just add the prepend the
212
- -- prefix
213
-
214
- while Node.Parent.Kind in Ada_Dotted_Name_Range loop
215
- Node := Node.Parent;
216
- end loop ;
217
-
218
- if Node.Kind in Ada_Dotted_Name_Range then
219
- Node := Node.As_Dotted_Name.F_Suffix.As_Ada_Node;
220
- end if ;
221
-
222
- if Node.Parent.Kind = Ada_Dotted_Name then
223
- -- Node.Parent is the full Dotted Name: this includes the
224
- -- current prefixes and the identifier. Using this SLOC instead
225
- -- of only the current prefixes SLOC is better since this covers
226
- -- cases when the Dotted Name is splitted in multiple lines.
227
-
228
- Safe_Insert
229
- (Edits => Edits.Text_Edits,
230
- File_Name => Node.Unit.Get_Filename,
231
- Edit =>
232
- Text_Edit'
233
- (Location =>
234
- Make_Range
235
- (Start_Sloc
236
- (Node.Parent.As_Dotted_Name.F_Prefix.Sloc_Range),
237
- Start_Sloc (Node.Sloc_Range)),
238
- Text =>
239
- Ada.Strings.Unbounded.To_Unbounded_String
240
- (To_UTF8 (To_Wide_Wide_String (Self.Prefix)))));
241
-
242
- else
243
- Safe_Insert
244
- (Edits => Edits.Text_Edits,
245
- File_Name => Node.Unit.Get_Filename,
246
- Edit =>
247
- Text_Edit'
248
- (Location =>
249
- Make_Range
250
- (Start_Sloc (Node.Sloc_Range),
251
- Start_Sloc (Node.Sloc_Range)),
252
- Text =>
253
- Ada.Strings.Unbounded.To_Unbounded_String
254
- (To_UTF8 (To_Wide_Wide_String (Self.Prefix)))));
255
- end if ;
256
- end if ;
257
-
258
- -- Add with clause
259
-
260
- if not Self.With_Clause.Is_Empty then
261
- declare
262
- Last : Boolean;
263
- S : constant Libadalang.Slocs.Source_Location :=
264
- Laltools.Common.Get_Insert_With_Location
265
- (Node => Laltools.Common.Get_Compilation_Unit (Node),
266
- Pack_Name =>
267
- VSS.Strings.Conversions.To_Wide_Wide_String
268
- (Self.With_Clause),
269
- Last => Last);
270
- begin
271
- if S /= Libadalang.Slocs.No_Source_Location then
272
- if Last then
273
- Safe_Insert
274
- (Edits => Edits.Text_Edits,
275
- File_Name => Node.Unit.Get_Filename,
276
- Edit =>
277
- Text_Edit'
278
- (Location => Make_Range (S, S),
279
- Text =>
280
- Ada.Strings.Unbounded.To_Unbounded_String
281
- (To_UTF8 (To_Wide_Wide_String
282
- (Document.Line_Terminator
283
- & " with " & Self.With_Clause & " ;" )))));
284
-
285
- else
286
- Safe_Insert
287
- (Edits => Edits.Text_Edits,
288
- File_Name => Node.Unit.Get_Filename,
289
- Edit =>
290
- Text_Edit'
291
- (Location => Make_Range (S, S),
292
- Text =>
293
- Ada.Strings.Unbounded.To_Unbounded_String
294
- (To_UTF8 (To_Wide_Wide_String
295
- (" with " & Self.With_Clause & " ;"
296
- & Document.Line_Terminator)))));
297
- end if ;
298
-
299
- end if ;
300
- end ;
301
- end if ;
302
-
303
- return Edits;
189
+ return
190
+ Create_Auto_Importer
191
+ (Name,
192
+ Self.Suggestion)
193
+ .Refactor (Units'Access );
304
194
end Command_To_Refactoring_Edits ;
305
195
306
196
-- ------------
@@ -345,11 +235,15 @@ package body LSP.Ada_Handlers.Refactor.Imports_Commands is
345
235
LSP.Types.Write_String (S, V.Context);
346
236
JS.Key (" where" );
347
237
LSP.Messages.TextDocumentPositionParams'Write (S, V.Where);
348
- JS.Key (" with_clause" );
349
- LSP.Types.Write_String (S, V.With_Clause);
350
- JS.Key (" prefix" );
351
- LSP.Types.Write_String (S, V.Prefix);
238
+ JS.Key (" import" );
239
+ LSP.Types.Write_String
240
+ (S,
241
+ VSS.Strings.Conversions.To_Virtual_String (V.Suggestion.Import));
242
+ JS.Key (" qualifier" );
243
+ LSP.Types.Write_String
244
+ (S,
245
+ VSS.Strings.Conversions.To_Virtual_String (V.Suggestion.Qualifier));
352
246
JS.End_Object;
353
247
end Write_Command ;
354
248
355
- end LSP.Ada_Handlers.Refactor.Imports_Commands ;
249
+ end LSP.Ada_Handlers.Refactor.Auto_Import ;
0 commit comments