Skip to content

Commit a1f91ec

Browse files
Merge branch 'topic/bump_merge_conflict' into 'edge'
Improve handling of Error during Resolve_Name See merge request eng/ide/ada_language_server!1542
2 parents 01071eb + 558bc83 commit a1f91ec

File tree

5 files changed

+144
-119
lines changed

5 files changed

+144
-119
lines changed

source/ada/lsp-ada_contexts.adb

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ package body LSP.Ada_Contexts is
7878
-- Return the charset with which the context was initialized
7979

8080
procedure Find_All_References_In_Hierarchy
81-
(Self : Context;
82-
Decl : Libadalang.Analysis.Basic_Decl;
83-
Imprecise : in out Libadalang.Common.Ref_Result_Kind;
84-
Callback : not null access procedure
81+
(Self : Context;
82+
Decl : Libadalang.Analysis.Basic_Decl;
83+
Result_Kind : in out Libadalang.Common.Ref_Result_Kind;
84+
Callback : not null access procedure
8585
(Base_Id : Libadalang.Analysis.Base_Id;
8686
Kind : Libadalang.Common.Ref_Result_Kind;
8787
Cancel : in out Boolean));
@@ -208,15 +208,15 @@ package body LSP.Ada_Contexts is
208208
------------------------
209209

210210
function Find_All_Overrides
211-
(Self : Context;
212-
Decl : Libadalang.Analysis.Basic_Decl;
213-
Imprecise_Results : out Libadalang.Common.Ref_Result_Kind)
211+
(Self : Context;
212+
Decl : Libadalang.Analysis.Basic_Decl;
213+
Result_Kind : out Libadalang.Common.Ref_Result_Kind)
214214
return Libadalang.Analysis.Basic_Decl_Array
215215
is
216216
Units : constant Libadalang.Analysis.Analysis_Unit_Array :=
217217
Self.Analysis_Units;
218218
begin
219-
Imprecise_Results := Libadalang.Common.Precise;
219+
Result_Kind := Libadalang.Common.Precise;
220220

221221
if Decl.Is_Null then
222222
return (1 .. 0 => <>);
@@ -228,13 +228,14 @@ package body LSP.Ada_Contexts is
228228
return Decl.P_Find_All_Overrides (Units);
229229
exception
230230
when E : Libadalang.Common.Property_Error =>
231-
Imprecise_Results := Libadalang.Common.Imprecise;
231+
Result_Kind := Libadalang.Common.Imprecise;
232232
Self.Tracer.Trace_Exception (E, "in Find_All_Overrides (precise)");
233233
return Decl.P_Find_All_Overrides
234234
(Units, Imprecise_Fallback => True);
235235
end;
236236
exception
237237
when E : Libadalang.Common.Property_Error =>
238+
Result_Kind := Libadalang.Common.Error;
238239
Self.Tracer.Trace_Exception (E, "in Find_All_Overrides (imprecise)");
239240
return (1 .. 0 => <>);
240241
end Find_All_Overrides;
@@ -244,9 +245,9 @@ package body LSP.Ada_Contexts is
244245
--------------------------------
245246

246247
function Find_All_Base_Declarations
247-
(Self : Context;
248-
Decl : Libadalang.Analysis.Basic_Decl;
249-
Imprecise_Results : out Libadalang.Common.Ref_Result_Kind)
248+
(Self : Context;
249+
Decl : Libadalang.Analysis.Basic_Decl;
250+
Result_Kind : out Libadalang.Common.Ref_Result_Kind)
250251
return Libadalang.Analysis.Basic_Decl_Array
251252
is
252253
use Libadalang.Analysis;
@@ -259,7 +260,7 @@ package body LSP.Ada_Contexts is
259260
Langkit_Support.Slocs.Start_Sloc (Left.Sloc_Range) =
260261
Langkit_Support.Slocs.Start_Sloc (Right.Sloc_Range));
261262
begin
262-
Imprecise_Results := Libadalang.Common.Precise;
263+
Result_Kind := Libadalang.Common.Precise;
263264

264265
if Decl.Is_Null then
265266
return (1 .. 0 => <>);
@@ -293,7 +294,7 @@ package body LSP.Ada_Contexts is
293294
exception
294295
when E : Libadalang.Common.Property_Error =>
295296
Self.Tracer.Trace_Exception (E, "in Find_All_Base_Declarations");
296-
Imprecise_Results := Libadalang.Common.Imprecise;
297+
Result_Kind := Libadalang.Common.Error;
297298
return (1 .. 0 => <>);
298299
end Find_All_Base_Declarations;
299300

@@ -302,10 +303,10 @@ package body LSP.Ada_Contexts is
302303
--------------------------------------
303304

304305
procedure Find_All_References_In_Hierarchy
305-
(Self : Context;
306-
Decl : Libadalang.Analysis.Basic_Decl;
307-
Imprecise : in out Libadalang.Common.Ref_Result_Kind;
308-
Callback : not null access procedure
306+
(Self : Context;
307+
Decl : Libadalang.Analysis.Basic_Decl;
308+
Result_Kind : in out Libadalang.Common.Ref_Result_Kind;
309+
Callback : not null access procedure
309310
(Base_Id : Libadalang.Analysis.Base_Id;
310311
Kind : Libadalang.Common.Ref_Result_Kind;
311312
Cancel : in out Boolean))
@@ -323,31 +324,44 @@ package body LSP.Ada_Contexts is
323324
else
324325
Decl);
325326

327+
Overriding_Result_Kind : Libadalang.Common.Ref_Result_Kind;
328+
Bases_Result_Kind : Libadalang.Common.Ref_Result_Kind;
329+
326330
Overriding_Decls : constant Libadalang.Analysis.Basic_Decl_Array :=
327331
Self.Find_All_Overrides
328332
(Subp_Decl,
329-
Imprecise_Results => Imprecise);
333+
Result_Kind => Overriding_Result_Kind);
330334

331335
Base_Decls : constant Libadalang.Analysis.Basic_Decl_Array :=
332336
Self.Find_All_Base_Declarations
333337
(Subp_Decl,
334-
Imprecise_Results => Imprecise);
335-
336-
Hierarchy : constant Libadalang.Analysis.Basic_Decl_Array :=
337-
Overriding_Decls & Base_Decls;
338+
Result_Kind => Bases_Result_Kind);
338339
begin
339-
if Is_Param then
340-
LSP.Ada_Id_Iterators.Find_All_Param_References_In_Hierarchy
341-
(Param => Decl.As_Param_Spec,
342-
Hierarchy => Hierarchy,
343-
Units => Self.Analysis_Units,
344-
Callback => Callback);
345-
else
346-
LSP.Ada_Id_Iterators.Find_All_Subp_References_In_Hierarchy
347-
(Hierarchy => Hierarchy,
348-
Tracer => Self.Tracer.all,
349-
Callback => Callback);
340+
if Overriding_Result_Kind in Libadalang.Common.Error
341+
or else Bases_Result_Kind in Libadalang.Common.Error
342+
then
343+
Result_Kind := Libadalang.Common.Error;
344+
return;
350345
end if;
346+
347+
declare
348+
Hierarchy : constant Libadalang.Analysis.Basic_Decl_Array :=
349+
Overriding_Decls & Base_Decls;
350+
begin
351+
352+
if Is_Param then
353+
LSP.Ada_Id_Iterators.Find_All_Param_References_In_Hierarchy
354+
(Param => Decl.As_Param_Spec,
355+
Hierarchy => Hierarchy,
356+
Units => Self.Analysis_Units,
357+
Callback => Callback);
358+
else
359+
LSP.Ada_Id_Iterators.Find_All_Subp_References_In_Hierarchy
360+
(Hierarchy => Hierarchy,
361+
Tracer => Self.Tracer.all,
362+
Callback => Callback);
363+
end if;
364+
end;
351365
end Find_All_References_In_Hierarchy;
352366

353367
--------------------

source/ada/lsp-ada_contexts.ads

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,26 +98,26 @@ package LSP.Ada_Contexts is
9898
-- context.
9999

100100
function Find_All_Overrides
101-
(Self : Context;
102-
Decl : Libadalang.Analysis.Basic_Decl;
103-
Imprecise_Results : out Libadalang.Common.Ref_Result_Kind)
101+
(Self : Context;
102+
Decl : Libadalang.Analysis.Basic_Decl;
103+
Result_Kind : out Libadalang.Common.Ref_Result_Kind)
104104
return Libadalang.Analysis.Basic_Decl_Array;
105105
-- Finds all overriding subprograms of the given basic declaration.
106106
-- This is used to propose all the implementations of a given subprogram
107107
-- when textDocument/definition requests happen on dispatching calls.
108-
-- Imprecise_Results is set to True if we don't know whether the results
109-
-- are precise.
108+
-- Result_Kind indicates if LAL encountered an Error or if the result are
109+
-- Imprecise.
110110
-- Returns an empty array if Decl is null.
111111

112112
function Find_All_Base_Declarations
113-
(Self : Context;
114-
Decl : Libadalang.Analysis.Basic_Decl;
115-
Imprecise_Results : out Libadalang.Common.Ref_Result_Kind)
113+
(Self : Context;
114+
Decl : Libadalang.Analysis.Basic_Decl;
115+
Result_Kind : out Libadalang.Common.Ref_Result_Kind)
116116
return Libadalang.Analysis.Basic_Decl_Array;
117117
-- Given a subprogram declaration in Decl, find all the base subprograms
118118
-- that it inherits, not including self.
119-
-- Imprecise_Results is set to True if we don't know whether the results
120-
-- are precise.
119+
-- Result_Kind indicates if LAL encountered an Error or if the result are
120+
-- Imprecise.
121121
-- Returns an empty array if Decl is null.
122122

123123
procedure Find_All_Calls

source/ada/lsp-ada_declaration.adb

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ package body LSP.Ada_Declaration is
139139
On_Defining_Name : Boolean := False;
140140
-- Set to True if we are on a denfining name node
141141

142-
Ignore : Libadalang.Common.Ref_Result_Kind;
142+
Imprecise_Ignore : Boolean;
143+
Result_Kind : Libadalang.Common.Ref_Result_Kind;
143144
begin
144145
if Self.Contexts.Is_Empty then
145146
-- No more contexts to process, sort and return collected results
@@ -172,12 +173,13 @@ package body LSP.Ada_Declaration is
172173

173174
if Definition.Is_Null then
174175
-- If we aren't on a defining_name already then try to resolve
175-
Definition := Laltools.Common.Resolve_Name (Name_Node, Trace, Ignore);
176+
Definition := Laltools.Common.Resolve_Name
177+
(Name_Node, Trace, Result_Kind);
176178
else
177179
On_Defining_Name := True;
178180
end if;
179181

180-
if Definition.Is_Null then
182+
if Result_Kind in Libadalang.Common.Error or else Definition.Is_Null then
181183
return; -- Name resolution fails, nothing to do.
182184
end if;
183185

@@ -228,16 +230,25 @@ package body LSP.Ada_Declaration is
228230

229231
if not Decl_For_Find_Overrides.Is_Null then
230232
declare
233+
Overriding_Result_Kind : Libadalang.Common.Ref_Result_Kind;
234+
Bases_Result_Kind : Libadalang.Common.Ref_Result_Kind;
231235
Overridings : constant Libadalang.Analysis.Basic_Decl_Array :=
232236
Context.Find_All_Overrides
233237
(Decl_For_Find_Overrides,
234-
Imprecise_Results => Ignore);
238+
Result_Kind => Overriding_Result_Kind);
235239

236240
Bases : constant Libadalang.Analysis.Basic_Decl_Array :=
237241
Context.Find_All_Base_Declarations
238242
(Decl_For_Find_Overrides,
239-
Imprecise_Results => Ignore);
243+
Result_Kind => Bases_Result_Kind);
240244
begin
245+
if Overriding_Result_Kind in Libadalang.Common.Error
246+
or else Bases_Result_Kind in Libadalang.Common.Error
247+
then
248+
-- Abort
249+
return;
250+
end if;
251+
241252
for Subp of Bases loop
242253
Self.Parent.Context.Append_Location
243254
(Self.Response,

source/ada/lsp-ada_definition.adb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ package body LSP.Ada_Definition is
123123
Definition_Node : Libadalang.Analysis.Basic_Decl;
124124
Decl_For_Find_Overrides : Libadalang.Analysis.Basic_Decl;
125125
Entry_Decl_Node : Libadalang.Analysis.Entry_Decl;
126-
127-
Imprecise_Ignore : Libadalang.Common.Ref_Result_Kind;
128-
129126
begin
130127
if Self.Contexts.Is_Empty then
131128
-- No more contexts to process, sort and return collected results
@@ -239,16 +236,25 @@ package body LSP.Ada_Definition is
239236

240237
if not Decl_For_Find_Overrides.Is_Null then
241238
declare
239+
Overriding_Result_Kind : Libadalang.Common.Ref_Result_Kind;
240+
Bases_Result_Kind : Libadalang.Common.Ref_Result_Kind;
242241
Overridings : constant Libadalang.Analysis.Basic_Decl_Array :=
243242
Context.Find_All_Overrides
244243
(Decl_For_Find_Overrides,
245-
Imprecise_Results => Imprecise_Ignore);
244+
Result_Kind => Overriding_Result_Kind);
246245

247246
Bases : constant Libadalang.Analysis.Basic_Decl_Array :=
248247
Context.Find_All_Base_Declarations
249248
(Decl_For_Find_Overrides,
250-
Imprecise_Results => Imprecise_Ignore);
249+
Result_Kind => Bases_Result_Kind);
251250
begin
251+
if Overriding_Result_Kind in Libadalang.Common.Error
252+
or else Bases_Result_Kind in Libadalang.Common.Error
253+
then
254+
-- Abort
255+
return;
256+
end if;
257+
252258
for Subp of Bases loop
253259
Self.Parent.Context.Append_Location
254260
(Self.Response,

0 commit comments

Comments
 (0)