--
-- Copyright (C) 2022-2023, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-Exception
--
-- This packages provides an interface to abstract away the action of reading
-- a source file to parse. Depending on use cases, it allows to override
-- bytes-to-text decoding and preprocess sources (before actual
-- lexing/parsing).
with Ada.Unchecked_Deallocation;
with GNATCOLL.Refcount;
with Gpr_Parser_Support.File_Readers;
with GPR2.Log;
package GPR2.File_Readers is
subtype Text_Type is Wide_Wide_String;
type Text_Access is access all Text_Type;
procedure Free is new Ada.Unchecked_Deallocation (Text_Type, Text_Access);
type Decoded_File_Contents is record
Buffer : Text_Access;
First : Positive;
Last : Natural;
end record;
-- The "Buffer (First .. Last)" slice contains the decoded file contents as
-- a sequence of codepoints. We keep track of First/Last indexes in
-- addition to Ada's Buffer'First/'Last attributes because source buffers
-- may be oversized.
type File_Reader_Interface is interface;
-- Interface to override how source files are fetched and decoded
procedure Read
(Self : File_Reader_Interface;
Filename : String;
Charset : String;
Read_BOM : Boolean;
Contents : out Decoded_File_Contents;
Diagnostics : in out GPR2.Log.Object) is abstract;
-- Read the content of the source at Filename, decoding it using the given
-- Charset and decoding the byte order mark if Read_BOM is True.
--
-- If there is an error during this process, append an error message to
-- Diagnostics. In that case, Contents is considered uninitialized.
--
-- Otherwise, allocate a Text_Type buffer, fill it and initialize Contents
-- to refer to it.
procedure Release (Self : in out File_Reader_Interface) is abstract;
-- Actions to perform when releasing resources associated to Self
procedure Do_Release (Self : in out File_Reader_Interface'Class);
-- Helper for the instantiation below
package File_Reader_References is new GNATCOLL.Refcount.Shared_Pointers
(File_Reader_Interface'Class, Do_Release);
subtype File_Reader_Reference is File_Reader_References.Ref;
No_File_Reader_Reference : File_Reader_Reference renames
File_Reader_References.Null_Ref;
function Create_File_Reader_Reference
(File_Reader : File_Reader_Interface'Class) return File_Reader_Reference;
-- Simple wrapper around the GNATCOLL.Refcount API to create file reader
-- references.
function Convert
(File_Reader : File_Reader_Reference)
return Gpr_Parser_Support.File_Readers.File_Reader_Reference;
-- Adapter used to convert File_Reader to the one used by Gpr_Parser
end GPR2.File_Readers;