(* M2StateCheck.def provide state check tracking for declarations.

Copyright (C) 2024-2025 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaiusmod2@gmail.com>.

This file is part of GNU Modula-2.

GNU Modula-2 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GNU Modula-2 is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY 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
along with GNU Modula-2; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  *)

DEFINITION MODULE M2StateCheck ;

(* This module provides state tracking for VAR, TYPE and CONST
   declarations.  It should be used by any pass creating
   symbols in these blocks and it will detect a constant
   being created from a variable, type from a variable,
   variable from a constant (instead of type) etc.  *)

TYPE
   StateCheck ;


(*
   InitState - returns a new initialized StateCheck.
*)

PROCEDURE InitState () : StateCheck ;


(*
   KillState - destructor for StateCheck.
*)

PROCEDURE KillState (VAR s: StateCheck) ;


(*
   PushState - duplicates the StateCheck s and chains the new copy to s.
               Return the copy.
*)

PROCEDURE PushState (VAR s: StateCheck) ;


(*
   PopState - pops the current state.
*)

PROCEDURE PopState (VAR s: StateCheck) ;


(*
   InclVar - s := s + {var}.
*)

PROCEDURE InclVar (s: StateCheck) ;


(*
   InclConst - s := s + {const}.
*)

PROCEDURE InclConst (s: StateCheck) ;


(*
   InclType - s := s + {type}.
*)

PROCEDURE InclType (s: StateCheck) ;


(*
   InclConstFunc - s := s + {constfunc}.
*)

PROCEDURE InclConstFunc (s: StateCheck) ;


(*
   InclVarParam - s := s + {varparam}.
*)

PROCEDURE InclVarParam (s: StateCheck) ;


(*
   InclConstructor - s := s + {constructor}.
*)

PROCEDURE InclConstructor (s: StateCheck) ;


(*
   ExclVar - s := s + {var}.
*)

PROCEDURE ExclVar (s: StateCheck) ;


(*
   ExclConst - s := s + {const}.
*)

PROCEDURE ExclConst (s: StateCheck) ;


(*
   ExclType - s := s + {type}.
*)

PROCEDURE ExclType (s: StateCheck) ;


(*
   ExclConstFunc - s := s + {constfunc}.
*)

PROCEDURE ExclConstFunc (s: StateCheck) ;


(*
   ExclVarParam - s := s + {varparam}.
*)

PROCEDURE ExclVarParam (s: StateCheck) ;


(*
   ExclConstructor - s := s - {varparam}.
*)

PROCEDURE ExclConstructor (s: StateCheck) ;


(*
   CheckQualident - checks to see that qualident sym is allowed in the state s.
*)

PROCEDURE CheckQualident (tok: CARDINAL; s: StateCheck; sym: CARDINAL) ;


END M2StateCheck.