-- | Generic instance for Haskell AST representation
{-# LANGUAGE FlexibleContexts, StandaloneDeriving, DeriveGeneric #-}
module Language.Haskell.Tools.AST.Instances.Generic where

import GHC.Generics

import Language.Haskell.Tools.AST.Modules
import Language.Haskell.Tools.AST.TH
import Language.Haskell.Tools.AST.Decls
import Language.Haskell.Tools.AST.Binds
import Language.Haskell.Tools.AST.Exprs
import Language.Haskell.Tools.AST.Stmts
import Language.Haskell.Tools.AST.Patterns
import Language.Haskell.Tools.AST.Types
import Language.Haskell.Tools.AST.Kinds
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Ann

-- Annotations
deriving instance (Generic a, Generic (e a)) => Generic (Ann e a)
deriving instance (Generic a, Generic (e a)) => Generic (AnnMaybe e a)
deriving instance (Generic a, Generic (e a)) => Generic (AnnList e a)

-- Modules
deriving instance Generic a => Generic (Module a)
deriving instance Generic a => Generic (ModuleHead a)
deriving instance Generic a => Generic (ExportSpecList a)
deriving instance Generic a => Generic (ExportSpec a)
deriving instance Generic a => Generic (IESpec a)
deriving instance Generic a => Generic (SubSpec a)
deriving instance Generic a => Generic (ModulePragma a)
deriving instance Generic a => Generic (FilePragma a)
deriving instance Generic a => Generic (ImportDecl a)
deriving instance Generic a => Generic (ImportSpec a)
deriving instance Generic a => Generic (ImportQualified a)
deriving instance Generic a => Generic (ImportSource a)
deriving instance Generic a => Generic (ImportSafe a)
deriving instance Generic a => Generic (TypeNamespace a)
deriving instance Generic a => Generic (ImportRenaming a)

-- Declarations
deriving instance Generic a => Generic (Decl a)
deriving instance Generic a => Generic (ClassBody a)
deriving instance Generic a => Generic (ClassElement a)
deriving instance Generic a => Generic (DeclHead a)
deriving instance Generic a => Generic (InstBody a)
deriving instance Generic a => Generic (InstBodyDecl a)
deriving instance Generic a => Generic (GadtConDecl a)
deriving instance Generic a => Generic (GadtConType a)
deriving instance Generic a => Generic (GadtField a)
deriving instance Generic a => Generic (FunDeps a)
deriving instance Generic a => Generic (FunDep a)
deriving instance Generic a => Generic (ConDecl a)
deriving instance Generic a => Generic (FieldDecl a)
deriving instance Generic a => Generic (Deriving a)
deriving instance Generic a => Generic (InstanceRule a)
deriving instance Generic a => Generic (InstanceHead a)
deriving instance Generic a => Generic (TypeEqn a)
deriving instance Generic a => Generic (KindConstraint a)
deriving instance Generic a => Generic (TyVar a)
deriving instance Generic a => Generic (Type a)
deriving instance Generic a => Generic (Kind a)
deriving instance Generic a => Generic (Context a)
deriving instance Generic a => Generic (Assertion a)
deriving instance Generic a => Generic (Expr a)
deriving instance (Generic a, Generic (expr a)) => Generic (Stmt' expr a)
deriving instance Generic a => Generic (CompStmt a)
deriving instance Generic a => Generic (ValueBind a)
deriving instance Generic a => Generic (Pattern a)
deriving instance Generic a => Generic (PatternField a)
deriving instance Generic a => Generic (Splice a)
deriving instance Generic a => Generic (QQString a)
deriving instance Generic a => Generic (Match a)
deriving instance (Generic a, Generic (expr a)) => Generic (Alt' expr a)
deriving instance Generic a => Generic (Rhs a)
deriving instance Generic a => Generic (GuardedRhs a)
deriving instance Generic a => Generic (FieldUpdate a)
deriving instance Generic a => Generic (Bracket a)
deriving instance Generic a => Generic (TopLevelPragma a)
deriving instance Generic a => Generic (Rule a)
deriving instance Generic a => Generic (AnnotationSubject a)
deriving instance Generic a => Generic (MinimalFormula a)
deriving instance Generic a => Generic (ExprPragma a)
deriving instance Generic a => Generic (SourceRange a)
deriving instance Generic a => Generic (Number a)
deriving instance Generic a => Generic (QuasiQuote a)
deriving instance Generic a => Generic (RhsGuard a)
deriving instance Generic a => Generic (LocalBind a)
deriving instance Generic a => Generic (LocalBinds a)
deriving instance Generic a => Generic (FixitySignature a)
deriving instance Generic a => Generic (TypeSignature a)
deriving instance Generic a => Generic (ListCompBody a)
deriving instance Generic a => Generic (TupSecElem a)
deriving instance Generic a => Generic (TypeFamily a)
deriving instance Generic a => Generic (TypeFamilySpec a)
deriving instance Generic a => Generic (InjectivityAnn a)
deriving instance (Generic a, Generic (expr a)) => Generic (CaseRhs' expr a)
deriving instance (Generic a, Generic (expr a)) => Generic (GuardedCaseRhs' expr a)
deriving instance Generic a => Generic (PatternSynonym a)
deriving instance Generic a => Generic (PatSynRhs a)
deriving instance Generic a => Generic (PatSynLhs a)
deriving instance Generic a => Generic (PatSynWhere a)
deriving instance Generic a => Generic (PatternTypeSignature a)
deriving instance Generic a => Generic (Role a)
deriving instance Generic a => Generic (Cmd a)
deriving instance Generic a => Generic (LanguageExtension a)
deriving instance Generic a => Generic (MatchLhs a)


-- Literal
deriving instance Generic a => Generic (Literal a)
deriving instance (Generic a, Generic (k a)) => Generic (Promoted k a)

-- Base
deriving instance Generic a => Generic (Operator a)
deriving instance Generic a => Generic (Name a)
deriving instance Generic a => Generic (SimpleName a)
deriving instance Generic a => Generic (UnqualName a)
deriving instance Generic a => Generic (StringNode a)
deriving instance Generic a => Generic (DataOrNewtypeKeyword a)
deriving instance Generic a => Generic (DoKind a)
deriving instance Generic a => Generic (TypeKeyword a)
deriving instance Generic a => Generic (OverlapPragma a)
deriving instance Generic a => Generic (CallConv a)
deriving instance Generic a => Generic (ArrowAppl a)
deriving instance Generic a => Generic (Safety a)
deriving instance Generic a => Generic (ConlikeAnnot a)
deriving instance Generic a => Generic (Assoc a)
deriving instance Generic a => Generic (Precedence a)
deriving instance Generic a => Generic (LineNumber a)
deriving instance Generic a => Generic (PhaseControl a)
deriving instance Generic a => Generic (PhaseNumber a)
deriving instance Generic a => Generic (PhaseInvert a)