content: module Fay.Exts where
  
  import qualified Language.Haskell.Exts as A
  
  type X = A.SrcSpanInfo
  
  type Alt = A.Alt X
  type BangType = A.BangType X
  type ClassDecl = A.ClassDecl X
  type Decl = A.Decl X
  type DeclHead = A.DeclHead X
  type Ex = A.Exp X
  type Exp = A.Exp X
  type ExportSpec = A.ExportSpec X
  type FieldDecl = A.FieldDecl X
  type FieldUpdate = A.FieldUpdate X
  type GadtDecl = A.GadtDecl X
  type GuardedRhs = A.GuardedRhs X
  type ImportDecl = A.ImportDecl X
  type ImportSpec = A.ImportSpec X
  type Literal = A.Literal X
  type Match = A.Match X
  type Module = A.Module X
  type ModuleName = A.ModuleName X
  type ModulePragma = A.ModulePragma X
  type Name = A.Name X
  type Pat = A.Pat X
  type PatField = A.PatField X
  type QName = A.QName X
  type QOp = A.QOp X
  type QualConDecl = A.QualConDecl X
  type QualStmt = A.QualStmt X
  type Rhs = A.Rhs X
  type SpecialCon = A.SpecialCon X
  type SrcLoc = A.SrcLoc
  type Stmt = A.Stmt X
  type TyVarBind = A.TyVarBind X
  type Type = A.Type X
  
  moduleName :: A.SrcInfo a => A.Module a -> A.ModuleName a
  moduleName (A.Module _ (Just (A.ModuleHead _ n _ _)) _ _ _) = n
  moduleName (A.Module a Nothing                     _ _ _) = A.ModuleName a "Main"
  moduleName m = error $ "moduleName: " ++ A.prettyPrint m
  
  moduleExports :: A.Module X -> Maybe (A.ExportSpecList X)
  moduleExports (A.Module _ (Just (A.ModuleHead _ _ _ e)) _ _ _) = e
  moduleExports (A.Module _ Nothing                     _ _ _) = Nothing
  moduleExports m = error $ "moduleExports: " ++ A.prettyPrint m
  
  moduleNameString :: A.ModuleName t -> String
  moduleNameString (A.ModuleName _ n) = n
  
  mkIdent :: String -> A.Name A.SrcSpanInfo
  mkIdent = A.Ident noI
  
  noI :: A.SrcSpanInfo
  noI = A.noInfoSpan (A.mkSrcSpan A.noLoc A.noLoc)
  
  convertFieldDecl :: A.FieldDecl a -> ([A.Name a], A.Type a)
  convertFieldDecl (A.FieldDecl _ ns b) = (ns, b)
  
  fieldDeclNames :: A.FieldDecl a -> [A.Name a]
  fieldDeclNames (A.FieldDecl _ ns _) = ns
  
  declHeadName :: A.DeclHead a -> A.Name a
  declHeadName d = case d of
    A.DHead _ n -> n
    A.DHInfix _ _ n -> n
    A.DHParen _ h -> declHeadName h
    A.DHApp _ h _ -> declHeadName h
  