Skip to content

Commit c957dca

Browse files
author
automatic-merge
committed
Merge remote branch 'origin/master' into edge
2 parents 16b8d56 + 436eed1 commit c957dca

File tree

9 files changed

+286
-50
lines changed

9 files changed

+286
-50
lines changed

Diff for: source/ada/lsp-ada_context_sets.adb

+3-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ package body LSP.Ada_Context_Sets is
7575
return Context_Access is
7676
begin
7777
for Context of Self.Contexts loop
78-
if Context.Is_Part_Of_Project (URI) then
78+
if not Context.Is_Fallback_Context
79+
and then Context.Is_Part_Of_Project (URI)
80+
then
7981
return Context;
8082
end if;
8183
end loop;

Diff for: source/ada/lsp-ada_handlers-project_loading.adb

+108-46
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,15 @@ package body LSP.Ada_Handlers.Project_Loading is
104104
-- Reload as project source dirs the directories in
105105
-- Self.Project_Dirs_Loaded.
106106

107+
procedure Create_In_Memory_Project
108+
(Name : GPR2.Name_Type;
109+
Dirs : File_Sets.Set;
110+
Project_Tree : in out GPR2.Project.Tree.Object;
111+
Success : out Boolean);
112+
-- Unload Project_Tree then construct a new project in memory with given
113+
-- Name and source Dirs. Return Success=True and resulting Project_Tree
114+
-- if everything is fine. Return Success=False otherwise.
115+
107116
procedure Update_Project_Predefined_Sources
108117
(Self : in out Message_Handler'Class);
109118
-- Fill Self.Project_Predefined_Sources with loaded project tree runtime
@@ -113,6 +122,68 @@ package body LSP.Ada_Handlers.Project_Loading is
113122
-- This also indexes immediately any already opened document, creating
114123
-- the handler's fallback context before for that purpose.
115124

125+
procedure Create_Fallback_Context (Self : in out Message_Handler'Class);
126+
-- Create a fallback context for the given handler's contexts' set.
127+
128+
-----------------------------
129+
-- Create_Fallback_Context --
130+
-----------------------------
131+
132+
procedure Create_Fallback_Context (Self : in out Message_Handler'Class) is
133+
use LSP.Ada_Context_Sets;
134+
use LSP.Ada_Contexts;
135+
use type GNATCOLL.VFS.Virtual_File;
136+
137+
C : constant Context_Access := new Context (Self.Tracer);
138+
139+
Reader : LSP.Ada_Handlers.File_Readers.LSP_File_Reader
140+
(Self'Unchecked_Access);
141+
142+
Dirs : File_Sets.Set;
143+
144+
Project_Tree : GPR2.Project.Tree.Object;
145+
146+
Success : Boolean;
147+
begin
148+
Self.Tracer.Trace_Text ("Creating fallback context");
149+
150+
C.Initialize
151+
(File_Reader => Reader,
152+
Follow_Symlinks => Self.Configuration.Follow_Symlinks,
153+
Style => Self.Configuration.Documentation_Style,
154+
As_Fallback_Context => True);
155+
156+
if Self.Client.Root_Directory /= GNATCOLL.VFS.No_File then
157+
Dirs.Insert (Self.Client.Root_Directory);
158+
end if;
159+
160+
Create_In_Memory_Project
161+
("fallback_context", Dirs, Project_Tree, Success);
162+
163+
pragma Assert
164+
(Success, "Can't create an empty project for the fallback context");
165+
166+
-- Create a basic GPR2_Provider_And_Projects containing only the
167+
-- implicit project and load it.
168+
declare
169+
Provider : Libadalang.Project_Provider.GPR2_Provider_And_Projects :=
170+
(Provider =>
171+
Libadalang.Project_Provider.Create_Project_Unit_Provider
172+
(Tree => Project_Tree,
173+
Project => Project_Tree.Root_Project),
174+
Projects => <>);
175+
begin
176+
Provider.Projects.Append (Project_Tree.Root_Project);
177+
178+
C.Load_Project
179+
(Provider => Provider,
180+
Tree => Project_Tree,
181+
Charset => "iso-8859-1");
182+
end;
183+
184+
Self.Contexts.Prepend (C);
185+
end Create_Fallback_Context;
186+
116187
---------------------------
117188
-- Ensure_Project_Loaded --
118189
---------------------------
@@ -684,35 +755,6 @@ package body LSP.Ada_Handlers.Project_Loading is
684755
--------------------------
685756

686757
procedure Enqueue_Indexing_Job (Self : in out Message_Handler'Class) is
687-
procedure Create_Fallback_Context (Self : in out Message_Handler'Class);
688-
-- Create a fallback context for the given handler's contexts' set.
689-
690-
-----------------------------
691-
-- Create_Fallback_Context --
692-
-----------------------------
693-
694-
procedure Create_Fallback_Context (Self : in out Message_Handler'Class)
695-
is
696-
use LSP.Ada_Context_Sets;
697-
use LSP.Ada_Contexts;
698-
begin
699-
declare
700-
C : constant Context_Access := new Context (Self.Tracer);
701-
Reader :
702-
LSP.Ada_Handlers.File_Readers.LSP_File_Reader
703-
(Self'Unchecked_Access);
704-
begin
705-
Self.Tracer.Trace_Text ("Creating fallback context");
706-
707-
C.Initialize
708-
(File_Reader => Reader,
709-
Follow_Symlinks => Self.Configuration.Follow_Symlinks,
710-
Style => Self.Configuration.Documentation_Style,
711-
As_Fallback_Context => True);
712-
Self.Contexts.Prepend (C);
713-
end;
714-
end Create_Fallback_Context;
715-
716758
Files : LSP.Ada_Indexing.File_Sets.Set;
717759
begin
718760
-- Create a fallback context before indexing. This allows to
@@ -786,21 +828,44 @@ package body LSP.Ada_Handlers.Project_Loading is
786828
----------------------------------
787829

788830
procedure Reload_Implicit_Project_Dirs (Self : in out Message_Handler'Class)
831+
is
832+
Success : Boolean;
833+
begin
834+
Release_Contexts_And_Project_Info (Self);
835+
836+
Create_In_Memory_Project
837+
(Name => "default",
838+
Dirs => Self.Project_Dirs_Loaded,
839+
Project_Tree => Self.Project_Tree,
840+
Success => Success);
841+
842+
if not Success then
843+
LSP.Ada_Project_Loading.Set_Load_Status
844+
(Self.Project_Status, LSP.Ada_Project_Loading.Invalid_Project);
845+
end if;
846+
end Reload_Implicit_Project_Dirs;
847+
848+
------------------------------
849+
-- Create_In_Memory_Project --
850+
------------------------------
851+
852+
procedure Create_In_Memory_Project
853+
(Name : GPR2.Name_Type;
854+
Dirs : File_Sets.Set;
855+
Project_Tree : in out GPR2.Project.Tree.Object;
856+
Success : out Boolean)
789857
is
790858
Project : GPR2.Project.Tree.View_Builder.Object :=
791859
GPR2.Project.Tree.View_Builder.Create
792860
(Project_Dir => GPR2.Path_Name.Create_Directory ("."),
793-
Name => "default");
861+
Name => Name);
794862
Values : GPR2.Containers.Value_List;
795863
Opts : GPR2.Options.Object;
796-
Success : Boolean;
797864
begin
798-
Release_Contexts_And_Project_Info (Self);
799-
Self.Project_Tree.Unload;
800-
865+
Project_Tree.Unload;
801866
-- Load all the dirs
802867

803-
for Dir of Self.Project_Dirs_Loaded loop
868+
for Dir of Dirs loop
804869
Values.Append (Dir.Display_Full_Name);
805870
end loop;
806871

@@ -809,28 +874,25 @@ package body LSP.Ada_Handlers.Project_Loading is
809874

810875
-- First we load the fallback project
811876
Success :=
812-
Self.Project_Tree.Load_Virtual_View
877+
Project_Tree.Load_Virtual_View
813878
(Project,
814879
Opts,
815880
With_Runtime => True,
816881
Absent_Dir_Error => GPR2.No_Error);
817882

818-
if not Success then
819-
for C in Self.Project_Tree.Log_Messages.Iterate loop
883+
if Success then
884+
Project_Tree.Update_Sources;
885+
else
886+
for C in Project_Tree.Log_Messages.Iterate loop
820887
Tracer.Trace (C.Element.Format);
821888
end loop;
822-
LSP.Ada_Project_Loading.Set_Load_Status
823-
(Self.Project_Status, LSP.Ada_Project_Loading.Invalid_Project);
824889
end if;
825890

826-
Self.Project_Tree.Update_Sources;
827-
828891
exception
829892
when E : others =>
830-
Tracer.Trace_Exception (E, "Reload_Implicit_Project_Dirs");
831-
LSP.Ada_Project_Loading.Set_Load_Status
832-
(Self.Project_Status, LSP.Ada_Project_Loading.Invalid_Project);
833-
end Reload_Implicit_Project_Dirs;
893+
Tracer.Trace_Exception (E, "Create_In_Memory_Project");
894+
Success := False;
895+
end Create_In_Memory_Project;
834896

835897
--------------------
836898
-- Reload_Project --

Diff for: source/ada/lsp-ada_handlers-project_loading.ads

+3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ package LSP.Ada_Handlers.Project_Loading is
3333
-- 4. else if there are multiple projects at the root, warn about it and
3434
-- load the implicit project
3535
-- 5. else load the implicit project
36+
--
37+
-- Initially this function guaranteed that the Message_Handler would have
38+
-- the project loaded on return, but this is no longer the case.
3639

3740
procedure Reload_Project (Self : in out Message_Handler'CLass);
3841
-- Clear the current project context and call Ensure_Project_Loaded to

Diff for: source/ada/lsp-ada_handlers.adb

+3-3
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,10 @@ package body LSP.Ada_Handlers is
254254
-- Check if the given file belongs to the runtime.
255255

256256
function Is_A_Source (Self : LSP.Ada_Contexts.Context) return Boolean is
257-
((Is_Runtime_File and then not Self.Is_Fallback_Context)
258-
or else Self.Is_Part_Of_Project (File));
257+
(not Self.Is_Fallback_Context and then
258+
(Is_Runtime_File or else Self.Is_Part_Of_Project (File)));
259259
-- Return True if File is a source of the project held by Context
260-
-- Avoid considering runtime files as sources for the fallback context,
260+
-- Avoid considering runtime files as sources and the fallback context,
261261
-- if there is no context available for this file then we will still
262262
-- use the fallback later.
263263

Diff for: testsuite/ada_lsp/rename.out_of_project/default.gpr

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
project Default is
2+
for Source_Dirs use ("src");
3+
end Default;

Diff for: testsuite/ada_lsp/rename.out_of_project/proc.adb

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
procedure Proc is
2+
begin
3+
Proc;
4+
end Proc;

0 commit comments

Comments
 (0)