-- | Data instances for Haskell AST (used for generics)
{-# LANGUAGE FlexibleContexts, StandaloneDeriving, DeriveDataTypeable #-}
module Language.Haskell.Tools.AST.Instances.Data where

import Data.Data

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

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

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

-- Literal
deriving instance (Domain dom, SourceInfo stage) => Data (Literal dom stage)
deriving instance (DomainWith k dom, SourceInfo stage, Typeable k, Data (k dom stage)) => Data (Promoted k dom stage)

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