File : asis-statements.ads


------------------------------------------------------------------------------
--                                                                          --
--                 ASIS-for-GNAT IMPLEMENTATION COMPONENTS                  --
--                                                                          --
--                        A S I S . S T A T E M E N T S                     --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
-- This   specification   is   adapted  from  the  Ada  Semantic  Interface --
-- Specification  (ASIS)  definition,  ISO/IEC  15291,  Working Draft.  In  --
-- accordance with the (expected) copyright of the ASIS definition, you can --
-- freely  copy  and  modify  this  specification,  provided  that  if  you --
-- redistribute  a  modified  version,  any  changes that you have made are --
-- clearly indicated.                                                       --
--                                                                          --
------------------------------------------------------------------------------

--  The content of this  specification is taken "as is" from ASIS 2.0.R.
--  The code is reformatted to follow the GNAT coding style rules

------------------------------------------------------------------------------
--  18 package Asis.Statements
------------------------------------------------------------------------------
------------------------------------------------------------------------------
package Asis.Statements is
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--  Asis.Statements encapsulates a set of queries that operate on A_Statement,
--  A_Path, and An_Exception_Handler elements.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--  18.1  function Label_Names
------------------------------------------------------------------------------

   function Label_Names
     (Statement : in Asis.Statement)
      return Asis.Defining_Name_List;

------------------------------------------------------------------------------
--  Statement   - Specifies the statement to query
--
--  Returns label_statement_identifier elements (A_Defining_Name elements) that
--  define the labels attached to the statement, in their order of appearance.
--
--  Returns a Nil_Element_List if there are no labels attached to the
--  statement.
--
--  The Enclosing_Element of the A_Defining_Name elements is the statement.
--
--  Appropriate Element_Kinds:
--       A_Statement
--
--  Returns Defining_Name_Kinds:
--       A_Defining_Identifier
--
------------------------------------------------------------------------------
--  18.2  function Assignment_Variable_Name
------------------------------------------------------------------------------

   function Assignment_Variable_Name
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the assignment statement to query
--
--  Returns the expression that names the left hand side of the assignment.
--
--  Appropriate Element_Kinds:
--       A_Statement
--
--  Appropriate Statement_Kinds:
--       An_Assignment_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.3  function Assignment_Expression
------------------------------------------------------------------------------

   function Assignment_Expression
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the assignment statement to query
--
--  Returns the expression from the right hand side of the assignment.
--
--  Appropriate Element_Kinds:
--       A_Statement
--

--  Appropriate Statement_Kinds:
--       An_Assignment_Statement
--
--  Returns Element_Kinds:
--       An_Expression

------------------------------------------------------------------------------
--  18.4  function Statement_Paths
------------------------------------------------------------------------------

   function Statement_Paths
     (Statement : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Path_List;

------------------------------------------------------------------------------
--  Statement   - Specifies the statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns a list of the execution paths of the statement, in
--  their order of appearance.
--
--  The only pragmas returned are those preceding the first alternative in
--  a case statement.
--
--  Appropriate Statement_Kinds:
--       An_If_Statement
--       A_Case_Statement
--       A_Selective_Accept_Statement
--       A_Timed_Entry_Call_Statement
--       A_Conditional_Entry_Call_Statement
--       An_Asynchronous_Select_Statement
--
--  Returns Element_Kinds:
--       A_Path
--       A_Pragma
--
------------------------------------------------------------------------------
--  18.5  function Condition_Expression
------------------------------------------------------------------------------

   function Condition_Expression
     (Path : in Asis.Path)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Path - Specifies the execution path to query
--
--  Returns the condition expression for an IF path or an ELSIF path.
--
--  Appropriate Path_Kinds:
--       An_If_Path
--       An_Elsif_Path
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.6  function Sequence_Of_Statements
------------------------------------------------------------------------------

   function Sequence_Of_Statements
     (Path            : in Asis.Path;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Path            - Specifies the execution path to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns a list of the statements and pragmas from an execution path,
--  in their order of appearance.
--
--  Appropriate Element_Kinds:
--       A_Path
--
--  Returns Element_Kinds:
--       A_Statement
--       A_Pragma
--
------------------------------------------------------------------------------
--  18.7  function Case_Expression
------------------------------------------------------------------------------

   function Case_Expression
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the case statement to query
--
--  Returns the expression of the case statement that determines which
--  execution path is taken.
--
--  Appropriate Element_Kinds:
--       A_Statement
--
--  Appropriate Statement_Kinds:
--       A_Case_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.8  function Case_Statement_Alternative_Choices
------------------------------------------------------------------------------

   function Case_Statement_Alternative_Choices
     (Path : in Asis.Path)
      return Asis.Element_List;

------------------------------------------------------------------------------
--  Path - Specifies the case_statement_alternative execution path to query
--
--  Returns a list of the 'when <choice> | <choice>' elements, in their
--  order of appearance.
--
--  Appropriate Path_Kinds:
--       A_Case_Path
--
--  Returns Element_Kinds:
--       An_Expression
--       A_Definition
--
--  Returns Definition_Kinds:
--       A_Discrete_Range
--       An_Others_Choice
--
------------------------------------------------------------------------------
--  18.9  function Statement_Identifier
------------------------------------------------------------------------------

   function Statement_Identifier
     (Statement : in Asis.Statement)
      return Asis.Defining_Name;

------------------------------------------------------------------------------
--  Statement   - Specifies the statement to query
--
--  Returns the identifier for the loop_statement or block_statement.
--
--  Returns a Nil_Element if the loop has no identifier.
--
--  The Enclosing_Element of the name is the statement.
--
--  Appropriate Statement_Kinds:
--       A_Loop_Statement
--       A_While_Loop_Statement
--       A_For_Loop_Statement
--       A_Block_Statement
--
--  Returns Defining_Name_Kinds:
--       Not_A_Defining_Name
--       A_Defining_Identifier
--
------------------------------------------------------------------------------
--  18.10 function Is_Name_Repeated
------------------------------------------------------------------------------

   function Is_Name_Repeated (Statement : in Asis.Statement) return Boolean;

------------------------------------------------------------------------------
--  Statement   - Specifies the statement to query
--
--  Returns True if the name of the accept, loop, or block is repeated after
--  the end of the statement.  Always returns True for loop or block
--  statements since the name is required.
--
--  Returns False for any unexpected Element.
--
--  Expected Statement_Kinds:
--       A_Block_Statement
--       A_Loop_Statement
--       An_Accept_Statement
--
------------------------------------------------------------------------------
--  18.11 function While_Condition
------------------------------------------------------------------------------

   function While_Condition
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the loop statement to query
--
--  Returns the condition expression associated with the while loop.
--
--  Appropriate Element_Kinds:
--       A_Statement
--
--  Appropriate Statement_Kinds:
--       A_While_Loop_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.12 function For_Loop_Parameter_Specification
------------------------------------------------------------------------------

   function For_Loop_Parameter_Specification
     (Statement : in Asis.Statement)
      return Asis.Declaration;

------------------------------------------------------------------------------
--  Statement   - Specifies the loop statement to query
--
--  Returns the declaration of the A_Loop_Parameter_Specification.
--
--  Appropriate Statement_Kinds:
--       A_For_Loop_Statement
--
--  Returns Declaration_Kinds:
--       A_Loop_Parameter_Specification
--

------------------------------------------------------------------------------
--  18.13 function Loop_Statements
------------------------------------------------------------------------------

   function Loop_Statements
     (Statement       : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the loop statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns the sequence_of_statements and any pragmas from the loop_statement,
--  in their order of appearance.
--
--  Appropriate Statement_Kinds:
--       A_Loop_Statement
--       A_While_Loop_Statement
--       A_For_Loop_Statement
--
--  Returns Element_Kinds:
--       A_Pragma
--       A_Statement
--
------------------------------------------------------------------------------
--  18.14 function Is_Declare_Block
------------------------------------------------------------------------------

   function Is_Declare_Block (Statement : in Asis.Statement) return Boolean;

------------------------------------------------------------------------------
--  Statement   - Specifies the statement to query
--
--  Returns True if the statement is a block_statement and it was created with
--  the use of the "declare" reserved word.  The presence or absence of any
--  declarative_item elements is not relevant.
--
--  Returns False if the "declare" reserved word does not appear in the
--  block_statement, or for any unexpected Element.
--
--  Expected Statement_Kinds:
--       A_Block_Statement
--
------------------------------------------------------------------------------
--  18.15 function Block_Declarative_Items
------------------------------------------------------------------------------

   function Block_Declarative_Items
     (Statement       : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Declarative_Item_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the block statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns a list of the declarations, representation_clause elements,
--  pragmas, and use_clause elements in the declarative_part of the
--  block_statement, in their order of appearance.
--
--  Returns a Nil_Element_List if there are no declarative items.
--
--  Appropriate Statement_Kinds:
--       A_Block_Statement
--
--  Returns Element_Kinds:
--       A_Declaration
--       A_Pragma
--       A_Clause
--

------------------------------------------------------------------------------
--  18.16 function Block_Statements
------------------------------------------------------------------------------

   function Block_Statements
     (Statement       : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the block statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns a list of the statements and pragmas for the block_statement, in
--  their order of appearance.
--
--  Returns a Nil_Element_List if there are no statements or pragmas.  This
--  can only occur for a block_statement obtained from the obsolescent query
--  Body_Block_Statement when its argument is a package_body
--  that has no sequence_of_statements.
--
--  Appropriate Statement_Kinds:
--       A_Block_Statement
--
--  Returns Element_Kinds:
--       A_Pragma
--       A_Statement
--
------------------------------------------------------------------------------
--  18.17 function Block_Exception_Handlers
------------------------------------------------------------------------------

   function Block_Exception_Handlers
     (Statement : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Exception_Handler_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the block statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns a list of the exception_handler elements of the block_statement,
--  in their order of appearance.
--
--  The only pragmas returned are those following the reserved word "exception"
--  and preceding the reserved word "when" of first exception handler.
--
--  Returns a Nil_Element_List if there are no exception_handler elements.
--
--  Appropriate Statement_Kinds:
--       A_Block_Statement
--
--  Returns Element_Kinds:
--       An_Exception_Handler
--       A_Pragma
--
------------------------------------------------------------------------------
--  18.18 function Exit_Loop_Name
------------------------------------------------------------------------------

   function Exit_Loop_Name
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the exit statement to query
--
--  Returns the name of the exited loop.
--
--  Returns a Nil_Element if no loop name is present.
--
--  Appropriate Statement_Kinds:
--       An_Exit_Statement
--

--  Returns Expression_Kinds:
--       Not_An_Expression
--       An_Identifier
--       A_Selected_Component
--
------------------------------------------------------------------------------
--  18.19 function Exit_Condition
------------------------------------------------------------------------------

   function Exit_Condition
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the exit statement to query
--
--  Returns the "when" condition of the exit statement.
--
--  Returns a Nil_Element if no condition is present.
--
--  Appropriate Statement_Kinds:
--       An_Exit_Statement
--
--  Returns Element_Kinds:
--       Not_An_Element
--       An_Expression
--
------------------------------------------------------------------------------
--  18.20 function Corresponding_Loop_Exited
------------------------------------------------------------------------------

   function Corresponding_Loop_Exited
     (Statement : in Asis.Statement)
      return Asis.Statement;

------------------------------------------------------------------------------
--  Statement   - Specifies the exit statement to query
--
--  Returns the loop statement exited by the exit statement.
--
--  Appropriate Statement_Kinds:
--       An_Exit_Statement
--
--  Returns Element_Kinds:
--       A_Loop_Statement
--       A_While_Loop_Statement
--       A_For_Loop_Statement
--
------------------------------------------------------------------------------
--  18.21 function Return_Expression
------------------------------------------------------------------------------
   function Return_Expression
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the return statement to query
--
--  Returns the expression in the return statement.
--
--  Returns a Nil_Element if no expression is present.
--
--  Appropriate Statement_Kinds:
--       A_Return_Statement
--
--  Returns Element_Kinds:
--       Not_An_Element
--       An_Expression
--

------------------------------------------------------------------------------
--  18.22 function Goto_Label
------------------------------------------------------------------------------

   function Goto_Label
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the goto statement to query
--
--  Returns the expression reference for the label, as specified by the goto
--  statement.
--
--  Appropriate Statement_Kinds:
--       A_Goto_Statement
--
--  Returns Expression_Kinds:
--       An_Identifier
--
------------------------------------------------------------------------------
--  18.23 function Corresponding_Destination_Statement
------------------------------------------------------------------------------

   function Corresponding_Destination_Statement
     (Statement : in Asis.Statement)
      return Asis.Statement;

------------------------------------------------------------------------------
--  Statement  - Specifies the goto statement to query
--
--  Returns the target statement specified by the goto statement.
--
--  Appropriate Statement_Kinds:
--       A_Goto_Statement
--
--  Returns Element_Kinds:
--       A_Statement
--
--  --|AN Application Note:
--  --|AN
--  --|AN The Reference Manual allows a pragma between a statement and a label
--  --|AN  attached to it. If so, when the label is passed as an actual
--  --|AN  parameter to this query, the query returns the statement, but not
--  --|AN  the label. The only way for an application to know that there are
--  --|AN  any pragmas between a statement and its label is to get the spans
--  --|AN  of these program elements and analyze the orresponding positions in
--  --|AN  the source text.
--
------------------------------------------------------------------------------
--  18.24 function Called_Name
------------------------------------------------------------------------------

   function Called_Name
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the procedure call or entry call statement to query
--
--  Returns the name of the called procedure or entry.  The name of an entry
--  family takes the form of An_Indexed_Component.
--
--  Appropriate Statement_Kinds:
--       An_Entry_Call_Statement
--       A_Procedure_Call_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--

------------------------------------------------------------------------------
--  18.25 function Corresponding_Called_Entity
------------------------------------------------------------------------------

   function Corresponding_Called_Entity
     (Statement : in Asis.Statement)
      return Asis.Declaration;

------------------------------------------------------------------------------
--  Statement   - Specifies the procedure_call_statement or
--                entry_call_statement to query
--
--  Returns the declaration of the procedure or entry denoted by the call.
--
--  Returns a Nil_Element if the:
--
--   - prefix of the call denotes an access to a procedure implicit
--     or explicit dereference,
--
--   - argument is a dispatching call,
--
--   - argument is a call to a dispatching operation of a tagged type which
--     is not statically determined.
--
--  If procedure_prefix denotes an attribute_reference, and if
--  the corresponding attribute is (re)defined by an attribute definition
--  clause, an implementation is encouraged, but not required, to return the
--  definition of the corresponding subprogram whose name is used after "use"
--  in this attribute definition clause. If an implementation cannot return
--  such a subprogram definition, a Nil_Element should be returned. For an
--  attribute reference which is not (re)defined by an attribute definition
--  clause, a Nil_Element should be returned.
--
--  Appropriate Statement_Kinds:
--       An_Entry_Call_Statement
--       A_Procedure_Call_Statement
--
--  Returns Declaration_Kinds:
--       Not_A_Declaration
--       A_Procedure_Declaration
--       A_Procedure_Body_Declaration
--       A_Procedure_Body_Stub
--       A_Procedure_Renaming_Declaration
--       A_Procedure_Instantiation
--       A_Formal_Procedure_Declaration
--       An_Entry_Declaration
--       A_Generic_Procedure_Declaration
--
--  --|IP Implementation Permissions
--  --|IP
--  --|IP An implementation may choose to return any part of multi-part
--  --|IP declarations and definitions. Multi-part declaration/definitions
--  --|IP can occur for:
--  --|IP
--  --|IP    - Subprogram specification in package specification, package body,
--  --|IP      and subunits (is separate);
--  --|IP    - Entries in package specification, package body, and subunits
--  --|IP      (is separate);
--  --|IP    - Private type and full type declarations;
--  --|IP    - Incomplete type and full type declarations; and
--  --|IP    - Deferred constant and full constant declarations.
--  --|IP
--  --|IP No guarantee is made that the element will be the first part or
--  --|IP that the determination will be made due to any visibility rules.
--  --|IP An application should make its own analysis for each case based
--  --|IP on which part is returned.
--

------------------------------------------------------------------------------
--  18.26 function Call_Statement_Parameters
------------------------------------------------------------------------------

   function Call_Statement_Parameters
     (Statement  : in Asis.Statement;
      Normalized : in Boolean := False)
      return Asis.Association_List;

------------------------------------------------------------------------------
--  Statement   - Specifies the procedure_call_statement or
--                entry_call_statement to query
--  Normalized  - Specifies whether the normalized form is desired
--
--  Returns a list of parameter_association elements of the call.
--
--  Returns a Nil_Element_List if there are no parameter_association elements.
--
--  An unnormalized list contains only explicit associations ordered as they
--  appear in the program text.  Each unnormalized association has an optional
--  formal_parameter_selector_name and an explicit_actual_parameter component.
--
--  A normalized list contains artificial associations representing all
--  explicit and default associations.  It has a length equal to the number of
--  parameter_specification elements of the formal_part of the
--  parameter_and_result_profile.  The order of normalized associations matches
--  the order of parameter_specification elements.
--
--  Each normalized association represents a one on one mapping of a
--  parameter_specification elements to the explicit or default expression.
--  A normalized association has one A_Defining_Name component that denotes the
--  parameter_specification, and one An_Expression component that is either the
--  explicit_actual_parameter or a default_expression.
--
--  If the prefix of the call denotes an access to a procedure implicit or
--  explicit deference, normalized associations are constructed on the basis
--  of the formal_part of the parameter_profile from the corresponding
--  access_to_subprogram definition.
--
--  Returns Nil_Element for normalized associations in the case where
--  the called procedure can be determined only dynamically (dispatching
--  calls). ASIS cannot produce any meaningful result in this case.
--
--  The exception ASIS_Inappropriate_Element is raised when the procedure
--  call is an attribute reference and Is_Normalized is True.
--
--  Appropriate Statement_Kinds:
--       An_Entry_Call_Statement
--       A_Procedure_Call_Statement
--
--  Returns Element_Kinds:
--       A_Parameter_Association
--
--  --|IR Implementation Requirements:
--  --|IR
--  --|IR Normalized associations are Is_Normalized and Is_Part_Of_Implicit.
--  --|IR Normalized associations provided by default are
--  --|IR Is_Defaulted_Association. Normalized associations are never
--  --|IR Is_Equal to unnormalized associations.
--  --|IR
--  --|IP Implementation Permissions:
--  --|IP
--  --|IP An implementation may choose to always include default parameters in
--  --|IP its internal representation.
--  --|IP
--  --|IP An implementation may also choose to normalize its representation
--  --|IP to use defining_identifier elements rather than
--  --|IP formal_parameter_selector_name elements.
--  --|IP
--  --|IP In either case, this query will return Is_Normalized associations
--  --|IP even if Normalized is False, and the query
--  --|IP Call_Statement_Parameters_Normalized will return True.
--

------------------------------------------------------------------------------
--  18.27 function Accept_Entry_Index
------------------------------------------------------------------------------

   function Accept_Entry_Index
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the accept statement to query
--
--  Returns the entry index expression in the accept statement.
--
--  Returns a Nil_Element if the statement has no explicit entry index,
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Element_Kinds:
--       Not_An_Element
--       An_Expression
--
------------------------------------------------------------------------------
--  18.28 function Accept_Entry_Direct_Name
------------------------------------------------------------------------------

   function Accept_Entry_Direct_Name
     (Statement : in Asis.Statement)
      return Asis.Name;

------------------------------------------------------------------------------
--  Statement   - Specifies the accept statement to query
--
--  Returns the direct name of the entry. The name follows the reserved word
--  "accept".
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Expression_Kinds:
--       An_Identifier
--
------------------------------------------------------------------------------
--  18.29 function Accept_Parameters
------------------------------------------------------------------------------

   function Accept_Parameters
     (Statement : in Asis.Statement)
      return Asis.Parameter_Specification_List;

------------------------------------------------------------------------------
--  Statement   - Specifies the accept statement to query
--
--  Returns a list of parameter specifications in the formal part of the accept
--  statement, in their order of appearance.
--
--  Returns a Nil_Element_List if the accept_statement has no parameters.
--
--  Results of this query may vary across ASIS implementations.  Some
--  implementations normalize all multiple name parameter specifications into
--  an equivalent sequence of corresponding single name parameter
--  specifications. See Reference Manual 3.3.1(7).
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Declaration_Kinds:
--       A_Parameter_Specification
--

------------------------------------------------------------------------------
--  18.30 function Accept_Body_Statements
------------------------------------------------------------------------------
   function Accept_Body_Statements
     (Statement       : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the accept statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns the list of statements and pragmas from the body of the accept
--  statement, in their order of appearance.
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Element_Kinds:
--       A_Pragma
--       A_Statement
--
------------------------------------------------------------------------------
--  18.31 function Accept_Body_Exception_Handlers
------------------------------------------------------------------------------

   function Accept_Body_Exception_Handlers
     (Statement       : in Asis.Statement;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Statement       - Specifies the accept statement to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns the list of exception handlers and pragmas from the body of the
--  accept statement, in their order of appearance.
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Element_Kinds:
--       A_Pragma
--       An_Exception_Handler
--
------------------------------------------------------------------------------
--  18.32 function Corresponding_Entry
------------------------------------------------------------------------------

   function Corresponding_Entry
     (Statement : in Asis.Statement)
      return Asis.Declaration;

------------------------------------------------------------------------------
--  Statement   - Specifies the accept statement to query
--
--  Returns the declaration of the entry accepted in this statement.
--
--  Appropriate Statement_Kinds:
--       An_Accept_Statement
--
--  Returns Declaration_Kinds:
--       An_Entry_Declaration
--

------------------------------------------------------------------------------
--  18.33 function Requeue_Entry_Name
------------------------------------------------------------------------------

   function Requeue_Entry_Name
     (Statement : in Asis.Statement)
      return Asis.Name;

------------------------------------------------------------------------------
--  Statement   - Specifies the requeue statement to query
--
--  Returns the entry name following the reserved word "accept".  The name of
--  an entry family takes the form of An_Indexed_Component.
--
--  Appropriate Statement_Kinds:
--       A_Requeue_Statement
--       A_Requeue_Statement_With_Abort
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.34 function Delay_Expression
------------------------------------------------------------------------------

   function Delay_Expression
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement   - Specifies the delay statement to query
--
--  Returns the expression for the duration of the delay.
--
--  Appropriate Statement_Kinds:
--       A_Delay_Until_Statement
--       A_Delay_Relative_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.35 function Guard
------------------------------------------------------------------------------

   function Guard (Path : in Asis.Path) return Asis.Expression;

------------------------------------------------------------------------------
--  Path - Specifies the select statement execution path to query
--
--  Returns the conditional expression guard for the path.
--
--  Returns a Nil_Element if there is no guard, or if the path is from a
--  timed_entry_call, a conditional_entry_call, or an asynchronous_select
--  statement where a guard is not legal.
--
--  Appropriate Path_Kinds:
--       A_Select_Path
--       An_Or_Path
--
--  Returns Element_Kinds:
--       Not_An_Element
--       An_Expression
--

------------------------------------------------------------------------------
--  18.36 function Aborted_Tasks
------------------------------------------------------------------------------

   function Aborted_Tasks
     (Statement : in Asis.Statement)
      return Asis.Expression_List;

------------------------------------------------------------------------------
--  Statement    - Specifies the abort statement to query
--
--  Returns a list of the task names from the ABORT statement, in their order
--  of appearance.
--
--  Appropriate Statement_Kinds:
--       An_Abort_Statement
--
--  Returns Element_Kinds:
--       An_Expression
--
------------------------------------------------------------------------------
--  18.37 function Choice_Parameter_Specification
------------------------------------------------------------------------------

   function Choice_Parameter_Specification
     (Handler : in Asis.Exception_Handler)
      return Asis.Declaration;

------------------------------------------------------------------------------
--  Handler - Specifies the exception handler to query
--
--  Returns the choice parameter specification following the reserved word
--  "when" in the exception handler.
--
--  Returns a Nil_Element if there is no explicit choice parameter.
--
--  Appropriate Element_Kinds:
--     An_Exception_Handler
--
--  Returns Declaration_Kinds:
--       Not_A_Declaration
--       A_Choice_Parameter_Specification
--
------------------------------------------------------------------------------
--  18.38 function Exception_Choices
------------------------------------------------------------------------------

   function Exception_Choices
     (Handler : in Asis.Exception_Handler)
      return Asis.Element_List;

------------------------------------------------------------------------------
--  Handler - Specifies the exception handler to query
--
--  Returns a list of the 'when <choice> | <choice>' elements, in their
--  order of appearance.  Choices are either the exception name expression or
--  an others choice.
--
--  Appropriate Element_Kinds:
--     An_Exception_Handler
--
--  Returns Expression_Kinds:
--       An_Identifier
--       A_Selected_Component
--
--  Returns Definition_Kinds:
--       An_Others_Choice
--

------------------------------------------------------------------------------
--  18.39 function Handler_Statements
------------------------------------------------------------------------------

   function Handler_Statements
     (Handler         : in Asis.Exception_Handler;
      Include_Pragmas : in Boolean := False)
      return Asis.Statement_List;

------------------------------------------------------------------------------
--  Handler         - Specifies the exception handler to query
--  Include_Pragmas - Specifies whether pragmas are to be returned
--
--  Returns the list of statements and pragmas from the body of the
--  exception handler, in their order of appearance.
--
--  Appropriate Element_Kinds:
--     An_Exception_Handler
--
--  Returns Element_Kinds:
--       A_Pragma
--       A_Statement
--
------------------------------------------------------------------------------
--  18.40 function Raised_Exception
------------------------------------------------------------------------------

   function Raised_Exception
      (Statement : in Asis.Statement)
       return Asis.Expression;

------------------------------------------------------------------------------
--  Statement - Specifies the raise statement to query
--
--  Returns the expression that names the raised exception.
--
--  Returns a Nil_Element if there is no explicitly named exception.
--
--  Appropriate Statement_Kinds:
--       A_Raise_Statement
--
--  Returns Expression_Kinds:
--       Not_An_Expression
--       An_Identifier
--       A_Selected_Component
--
------------------------------------------------------------------------------
--  18.41 function Qualified_Expression
------------------------------------------------------------------------------

   function Qualified_Expression
     (Statement : in Asis.Statement)
      return Asis.Expression;

------------------------------------------------------------------------------
--  Statement  - Specifies the code statement to query
--
--  Returns the qualified aggregate expression representing the code statement.
--
--  Appropriate Statement_Kinds:
--       A_Code_Statement
--
--  Returns Expression_Kinds:
--       A_Qualified_Expression
--

------------------------------------------------------------------------------
--  18.42        function Is_Dispatching_Call
------------------------------------------------------------------------------

   function Is_Dispatching_Call (Call : in Asis.Element) return Boolean;

------------------------------------------------------------------------------
--  Call - Specifies the element to query.
--
--  Returns True if the controlling tag of Call is dynamically determined.
--
--  This function shall always return False when pragma
--  Restrictions (No_Dispatch) applies.
--
--  Returns False for any unexpected Element.
--
--  Expected Element_Kinds:
--     A_Function_Call
--     A_Procedure_Call_Statement
--
------------------------------------------------------------------------------
--  18.43        function Is_Call_On_Dispatching_Operation
------------------------------------------------------------------------------

   function Is_Call_On_Dispatching_Operation
     (Call : in Asis.Element)
      return Boolean;

------------------------------------------------------------------------------
--  Call - Specifies the element to query.
--
--  Returns True if the name or prefix of Call denotes the declaration of a
--  primitive operation of a tagged type.
--
--  Returns False for any unexpected Element.
--
--  Expected Element_Kinds:
--     A_Function_Call
--     A_Procedure_Call_Statement
--
------------------------------------------------------------------------------

end Asis.Statements