content: -- The following code is temporarily taken from @alanz's fork of
  -- nominolo/ghc-syb. Argon will use the original ghc-syb when a new version
  -- is released on Hackage with @alanz's fixes.
  {-# LANGUAGE CPP #-}
  {-# LANGUAGE RankNTypes #-}
  module Argon.SYB.Utils (Stage(..), everythingStaged)
      where
  
  import GHC
  import NameSet (NameSet)
  import Data.Generics
  #if __GLASGOW_HASKELL__ <= 708
  import Coercion
  #endif
  
  
  -- | Ghc Ast types tend to have undefined holes, to be filled
  --   by later compiler phases. We tag Asts with their source,
  --   so that we can avoid such holes based on who generated the Asts.
  data Stage = Parser | Renamer | TypeChecker deriving (Eq, Ord, Show)
  
  -- | Like 'everything', but avoid known potholes, based on the 'Stage' that
  --   generated the Ast.
  everythingStaged :: Stage -> (r -> r -> r) -> r -> GenericQ r -> GenericQ r
  everythingStaged stage k z f x
    | (const False
  #if __GLASGOW_HASKELL__ <= 708
        `extQ` postTcType
        `extQ` nameList
        `extQ` coercion
        `extQ` cmdTable
  #endif
        `extQ` fixity `extQ` nameSet) x = z
    | otherwise = foldl k (f x) (gmapQ (everythingStaged stage k z f) x)
    where nameSet    = const (stage `elem` [Parser,TypeChecker]) :: NameSet -> Bool
  #if __GLASGOW_HASKELL__ <= 708
          postTcType = const (stage < TypeChecker)               :: PostTcType -> Bool
          nameList   = const (stage < TypeChecker)               :: [Name] -> Bool
          coercion   = const (stage < TypeChecker)               :: Coercion -> Bool
          cmdTable   = const (stage < TypeChecker)               :: CmdSyntaxTable RdrName -> Bool
  #endif
          fixity     = const (stage < Renamer)                   :: GHC.Fixity -> Bool
  