------------------------------------------------------------------------------ -- Language Server Protocol -- -- -- -- Copyright (C) 2018-2021, 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.Strings.Wide_Wide_Unbounded; with LSP.Lal_Utils; package body LSP.Ada_Documents.LAL_Diagnostics is function Get_Diagnostics (Self : in out Diagnostic_Source'Class; Context : LSP.Ada_Contexts.Context) return Diagnostics; -------------------- -- Get_Diagnostic -- -------------------- overriding procedure Get_Diagnostic (Self : in out Diagnostic_Source; Context : LSP.Ada_Contexts.Context; Errors : out LSP.Messages.Diagnostic_Vector) is Item : LSP.Messages.Diagnostic; begin Item.source := (True, "libadalang"); Self.Errors := Self.Get_Diagnostics (Context); for J in Self.Errors.List'Range loop Item.span := LSP.Lal_Utils.To_Span (Self.Errors.List (J).Sloc_Range); Item.message := LSP.Lal_Utils.To_Virtual_String (Self.Errors.List (J).Message); Errors.Append (Item); end loop; end Get_Diagnostic; ------------------------ -- Has_New_Diagnostic -- ------------------------ overriding function Has_New_Diagnostic (Self : in out Diagnostic_Source; Context : LSP.Ada_Contexts.Context) return Boolean is begin return Self.Errors /= Self.Get_Diagnostics (Context); end Has_New_Diagnostic; -------------------- -- Get_Diagnostics -- -------------------- function Get_Diagnostics (Self : in out Diagnostic_Source'Class; Context : LSP.Ada_Contexts.Context) return Diagnostics is Last : Natural := 0; Errors : Langkit_Support.Diagnostics.Diagnostics_Array (1 .. MAX_NB_DIAGNOSTICS); Unit : constant Libadalang.Analysis.Analysis_Unit := Self.Document.Unit (Context); begin if Unit.Has_Diagnostics then for Error of Unit.Diagnostics loop -- Filter out diagnostics that simply report "Cannot parse <..>", -- as these are generally not useful to the end user. if Ada.Strings.Wide_Wide_Unbounded.Index (Error.Message, "Cannot parse <") /= 1 then Last := Last + 1; Errors (Last) := Error; exit when Last >= MAX_NB_DIAGNOSTICS; end if; end loop; return (Last, Errors (1 .. Last)); else return (Last => 0, List => (1 .. 0 => <>)); end if; end Get_Diagnostics; end LSP.Ada_Documents.LAL_Diagnostics;