module Language.CIL.StmtCore
  ( Stmt  (..)
  ) where

import Language.C hiding (Name)

import Language.CIL.Types

-- | Statements.
data Stmt
  = Null
  | Compound [Name] [Stmt] Position
  | TypeDecl Name Type Position
  | VariableDef Name Type (Maybe Init) Position
  | FunctionDef Name Type [(Name, Type)] Stmt Position
  | AssignApply Expr Apply Position
  | AssignExpr Expr Expr Position
  | StmtApply Apply Position
  | While Expr Stmt Position
  | If Expr Stmt Stmt Position
  | Return (Maybe Expr) Position
  | Goto Name Position
  | Break Position
  | Switch Expr Stmt Position
  | Case Expr Stmt Position
  | Default Stmt Position
  deriving (Show, Eq)

instance Pos Stmt where
  posOf a = case a of
    Null -> undefined
    Compound _ _ p -> p
    TypeDecl _ _ p -> p
    VariableDef _ _ _ p -> p
    FunctionDef _ _ _ _ p -> p
    AssignExpr _ _ p -> p
    AssignApply _ _ p -> p
    StmtApply _ p -> p
    While _ _ p -> p
    If _ _ _ p -> p
    Return _ p -> p
    Goto _ p -> p
    Break p -> p
    Switch _ _ p -> p
    Case _ _ p -> p
    Default _ p -> p