{-# LANGUAGE CPP #-}

module Test.Tasty.AutoCollect.GHC.Shim_Common (
  ParsedDecl (..),
  FuncSingleDef (..),
  FuncGuardedBody (..),
  ParsedType (..),
  ParsedPat (..),
  ConstructorDetails (..),
) where

import GHC.Hs
#if __GLASGOW_HASKELL__ == 810
import BasicTypes (Boxity, PromotionFlag)
import RdrName (RdrName)
import SrcLoc (Located)
#elif __GLASGOW_HASKELL__ == 900
import GHC.Types.Basic (Boxity, PromotionFlag)
import GHC.Types.Name.Reader (RdrName)
import GHC.Types.SrcLoc (Located)
#elif __GLASGOW_HASKELL__ == 902
import GHC.Types.Basic (Boxity, PromotionFlag)
import GHC.Types.Name.Reader (RdrName)
import GHC.Types.SrcLoc (Located)
#endif

#if __GLASGOW_HASKELL__ < 902
type LocatedA = Located
type LocatedN = Located
#endif

data ParsedDecl
  = FuncSig [LocatedN RdrName] (LHsSigWcType GhcPs)
  | FuncDef (LocatedN RdrName) [LocatedA FuncSingleDef]

data FuncSingleDef = FuncSingleDef
  { FuncSingleDef -> [LPat GhcPs]
funcDefArgs :: [LPat GhcPs]
  , FuncSingleDef -> [FuncGuardedBody]
funcDefGuards :: [FuncGuardedBody]
  , FuncSingleDef -> HsLocalBinds GhcPs
funcDefWhereClause :: HsLocalBinds GhcPs
  }

data FuncGuardedBody = FuncGuardedBody
  { FuncGuardedBody -> [GuardLStmt GhcPs]
funcDefBodyGuards :: [GuardLStmt GhcPs]
  , FuncGuardedBody -> LHsExpr GhcPs
funcDefBody :: LHsExpr GhcPs
  }

data ParsedType
  = TypeVar PromotionFlag (LocatedN RdrName)
  | TypeList ParsedType

data ParsedPat
  = PatWildCard
  | PatVar (LocatedN RdrName)
  | PatLazy
  | PatAs
  | PatParens ParsedPat
  | PatBang
  | PatList [ParsedPat]
  | PatTuple [ParsedPat] Boxity
  | PatSum
  | PatConstructor (LocatedN RdrName) ConstructorDetails
  | PatView
  | PatSplice (HsSplice GhcPs)
  | PatLiteral (HsLit GhcPs)
  | PatOverloadedLit (Located (HsOverLit GhcPs))
  | PatNPlusK
  | PatTypeSig ParsedPat (LHsType GhcPs)

data ConstructorDetails
  = ConstructorPrefix [LHsType GhcPs] [ParsedPat]
  | ConstructorRecord (HsRecFields GhcPs ParsedPat)
  | ConstructorInfix ParsedPat ParsedPat