##  vim: ft=makoada

----------------
-- Is_Keyword --
----------------

function Is_Keyword
  (TDH     : Token_Data_Handler;
   Index   : Token_Or_Trivia_Index;
   Version : Language_Version) return Boolean
is
   use Libadalang.Implementation;
   use Libadalang.Implementation.Precomputed_Symbols;
   use Langkit_Support.Symbols;
   use Langkit_Support.Token_Data_Handlers;

   Kind       : constant Token_Kind := To_Token_Kind (Data (Index, TDH).Kind);
   Sym        : Symbol_Type;

   function "+" (S : Precomputed_Symbol_Index) return Symbol_Type is
     (Precomputed_Symbol (Precomputed_Symbol_Table (TDH.Symbols), S));
begin
   --  Exit early on trivia tokens
   if Index.Trivia /= No_Token_Index then
      return False;

   --  Token that are not identifiers, decimal or integer literals but part of
   --  the Alphanumericals family are all keywords.
   elsif Kind not in Ada_Identifier | Ada_Decimal | Ada_Integer
         and then Token_Kind_To_Family (Kind) = Alphanumericals
   then
      return True;

   else
      Sym := Get_Symbol (Index, TDH);
      case Version is
         when Ada_83 =>
            return False;
         when Ada_95 =>
            return Sym in +Precomputed_Sym_Abstract
                        | +Precomputed_Sym_Protected
                        | +Precomputed_Sym_Requeue
                        | +Precomputed_Sym_Tagged
                        | +Precomputed_Sym_Until;
         when Ada_2005 =>
            return Sym in +Precomputed_Sym_Abstract
                        | +Precomputed_Sym_Interface
                        | +Precomputed_Sym_Overriding
                        | +Precomputed_Sym_Protected
                        | +Precomputed_Sym_Requeue
                        | +Precomputed_Sym_Synchronized
                        | +Precomputed_Sym_Tagged
                        | +Precomputed_Sym_Until;
         when Ada_2012 | Ada_2022 =>
            return Sym in +Precomputed_Sym_Abstract
                        | +Precomputed_Sym_Interface
                        | +Precomputed_Sym_Overriding
                        | +Precomputed_Sym_Protected
                        | +Precomputed_Sym_Requeue
                        | +Precomputed_Sym_Some
                        | +Precomputed_Sym_Synchronized
                        | +Precomputed_Sym_Tagged
                        | +Precomputed_Sym_Until;
      end case;
   end if;
end Is_Keyword;
