-- | 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 (Domain dom, SourceInfo stage, Generic (e dom stage)) => Generic (Ann e dom stage)
deriving instance (Domain dom, SourceInfo stage, Generic (e dom stage)) => Generic (AnnMaybe e dom stage)
deriving instance (Domain dom, SourceInfo stage, Generic (e dom stage)) => Generic (AnnList e dom stage)

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

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


-- Literal
deriving instance (Domain dom, SourceInfo stage) => Generic (Literal dom stage)
deriving instance (Domain dom, SourceInfo stage, Generic (k dom stage)) => Generic (Promoted k dom stage)

-- Base
deriving instance (Domain dom, SourceInfo stage) => Generic (Operator dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (Name dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (QualifiedName dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (ModuleName dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (UnqualName dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (StringNode dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (DataOrNewtypeKeyword dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (DoKind dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (TypeKeyword dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (OverlapPragma dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (CallConv dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (ArrowAppl dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (Safety dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (ConlikeAnnot dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (Assoc dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (Precedence dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (LineNumber dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (PhaseControl dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (PhaseNumber dom stage)
deriving instance (Domain dom, SourceInfo stage) => Generic (PhaseInvert dom stage)