Files
gnatstudio/kernel/src_info/projects.ads
Nicolas Setton f7c11441e6 W322-018 Introduce a cache for 'finding file in project'
The operation to find a file in the project from a base
name is very costly. Add a local cache in the Project_Registry
to alleviate the issue.

Make GPS.Kernel.Create take advantage of this cache in the
default lookup cases.

Use the call that leverage this cache when processing
the compiler output, and when applying codefix messages.

This reduces the import of 10000 messages on the same file
from 18s to 3s on my machine.

Add a test to check this scenario.
2023-03-30 12:47:33 +00:00

148 lines
6.2 KiB
Ada

------------------------------------------------------------------------------
-- GNAT Studio --
-- --
-- Copyright (C) 2002-2023, AdaCore --
-- --
-- This is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. This software is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public --
-- License for more details. You should have received a copy of the GNU --
-- General Public License distributed with this software; see file --
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy --
-- of the license. --
------------------------------------------------------------------------------
with Ada.Containers;
with Ada.Containers.Indefinite_Hashed_Maps;
with Ada.Strings.Hash;
with GNATCOLL.Projects; use GNATCOLL.Projects;
with GNATCOLL.VFS; use GNATCOLL.VFS;
package Projects is
type GPS_Project_Data is new GNATCOLL.Projects.Project_Data with private;
type Project_Registry is tagged private;
type Project_Registry_Access is access all Project_Registry'Class;
-- The registry is the name given to the set of currently loaded project
-- files. Only one project hierarchy can be loaded at any given time.
Saved_Config_File : aliased constant Filesystem_String := "gpsauto.cgpr";
-- Name of the config file that is saved when loading a project. This file
-- includes the user's specified config file (or the default GNAT naming
-- scheme), and any naming scheme defined in plugins.
-- Aliased in order to be accessible through AJIS.
function Is_Valid_Project_Name (Name : String) return Boolean;
-- Return True if Name is a valid project name
function Create
(Tree : not null access GNATCOLL.Projects.Project_Tree'Class;
Env : GNATCOLL.Projects.Project_Environment_Access := null)
return Project_Registry_Access;
-- Create a new project registry (associated with a custom tree).
-- Env can be passed a specific value if you want to extend
-- Project_Environment. In all cases, Initialize(Env) is called.
function Create
(Self : in out Project_Registry;
Filename : Filesystem_String) return Virtual_File;
-- Wrapper around Registry.Tree.Create, caching the results
-- for better performance.
function Environment
(Self : Project_Registry)
return GNATCOLL.Projects.Project_Environment_Access;
-- Return the environment for the loaded projects
function Tree
(Self : Project_Registry)
return GNATCOLL.Projects.Project_Tree_Access;
-- Return the loaded project tree
procedure Destroy (Registry : in out Project_Registry_Access);
-- Destroy the registry
type Project_Type_Array is array (Natural range <>) of Project_Type;
type Project_Type_Array_Access is access all Project_Type_Array;
procedure Free (Self : in out Project_Type_Array_Access);
-- Free the memory used by Self
function Project_Name_Hash
(Project : Project_Type) return Ada.Containers.Hash_Type;
-- Return a Hash_Type computed from the full name of the given Project.
-- Could be used to instantiate an Ada 2005 container that uses a
-- Project_Type as key and requires a hash function.
function Project_Directory
(Project : Project_Type;
Host : String := GNATCOLL.VFS.Local_Host)
return GNATCOLL.VFS.Virtual_File;
-- Return the directory that contains the project file.
-- No_File is returned if the project is No_Project.
function Source_Files_Non_Recursive
(Projects : Project_Type_Array;
Include_Project_Files : Boolean := False)
return GNATCOLL.Projects.File_And_Project_Array_Access;
-- Return the list of all direct source files for all projects.
-- If Include_Project_Files is true, then the .gpr files themselves will
-- be included in the result.
-- Result must be freed by the caller.
function Source_Dirs_With_VCS
(Project : Project_Type;
Recursive : Boolean) return GNATCOLL.VFS.File_Array;
-- Return the list of source directories under version control
type Paths_Type_Information is (Relative, Absolute, From_Pref);
procedure Set_Paths_Type
(Project : Project_Type; Paths : Paths_Type_Information);
-- Indicate how the types should be stored internally for the project
function Get_Paths_Type
(Project : Project_Type) return Paths_Type_Information;
-- Indicate how the types are stored internally for the project
procedure Cleanup_Subdirs (Tree : GNATCOLL.Projects.Project_Tree'Class);
-- Cleanup empty subdirs created when opening a project with prj.subdirs.
-- Also remove other temporary files
procedure Reset_Cache (Self : in out Project_Registry);
-- Reset any caching. This needs to be done whenever the view
-- is reloaded.
private
function Hash (X : Filesystem_String) return Ada.Containers.Hash_Type is
(Ada.Strings.Hash (+X));
package FS_To_File is new Ada.Containers.Indefinite_Hashed_Maps
(Key_Type => Filesystem_String,
Element_Type => Virtual_File,
Hash => Hash,
Equivalent_Keys => "=",
"=" => "=");
type Project_Registry is tagged record
Env : GNATCOLL.Projects.Project_Environment_Access;
Tree : GNATCOLL.Projects.Project_Tree_Access;
Filesystem_To_File_Map : FS_To_File.Map;
end record;
type GPS_Project_Data is new GNATCOLL.Projects.Project_Data with record
Paths_Type : Paths_Type_Information := From_Pref;
-- True if the paths in the project file should be stored as relative
-- paths.
end record;
type GPS_Project_Data_Access is access all GPS_Project_Data'Class;
end Projects;