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

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

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

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

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