-- | UPattern matching on UModule-level AST fragments for refactorings.
{-# LANGUAGE PatternSynonyms #-}

module Language.Haskell.Tools.Rewrite.Match.Modules where

import Language.Haskell.Tools.AST
import Language.Haskell.Tools.Rewrite.ElementTypes

-- | The representation of a haskell module, that is a separate compilation unit.
-- It may or may not have a header.
pattern Module :: FilePragmaList -> MaybeModuleHead
              -> ImportDeclList -> DeclList -> Module
pattern Module filePrags head imps decls  <- Ann _ (UModule filePrags head imps decls )

-- | Module declaration with name and (optional) exports
pattern ModuleHead :: ModuleName -> MaybeModulePragma -> MaybeExportSpecs -> ModuleHead
pattern ModuleHead n pr es <- Ann _ (UModuleHead n pr es)

-- | A list of export specifications surrounded by parentheses
pattern ExportSpecs :: ExportSpecList -> ExportSpecs
pattern ExportSpecs specs <- Ann _ (UExportSpecs specs)

-- | Export a name and related names
pattern ExportSpec :: IESpec -> ExportSpec
pattern ExportSpec ieSpec <- Ann _ (UDeclExport ieSpec)

-- | The export of an imported module (@ module A @)
pattern ModuleExport :: ModuleName -> ExportSpec
pattern ModuleExport name <- Ann _ (UModuleExport name)

-- | Marks a name to be imported or exported with related names (subspecifier)
pattern IESpec :: MaybeImportModifier -> Name -> MaybeSubSpec -> IESpec
pattern IESpec modifier name ss <- Ann _ (UIESpec modifier name ss)

-- | @(..)@: a class exported with all of its methods, or a datatype exported with all of its constructors.
pattern SubAll :: SubSpec
pattern SubAll <- Ann _ USubSpecAll

-- | @(a,b,c)@: a class exported with some of its methods, or a datatype exported with some of its constructors.
pattern SubList :: NameList -> SubSpec
pattern SubList names <- Ann _ (USubSpecList names)


pattern ImportDecl :: MaybeImportSource -> MaybeImportQualified
                        -> MaybeImportSafe -> MaybeStringNode
                        -> ModuleName -> MaybeImportRenaming
                        -> MaybeImportSpec -> ImportDecl
pattern ImportDecl source qualified safe pkg name rename spec <- Ann _ (UImportDecl source qualified safe pkg name rename spec)

pattern ImportRenaming :: ModuleName -> ImportRenaming
pattern ImportRenaming name <- Ann _ (UImportRenaming name)

pattern ImportSpecList :: IESpecList -> ImportSpec
pattern ImportSpecList ieSpecs <- Ann _ (UImportSpecList ieSpecs)

pattern ImportHidingList :: IESpecList -> ImportSpec
pattern ImportHidingList hidings <- Ann _ (UImportSpecHiding hidings)

pattern ModuleName :: String -> ModuleName
pattern ModuleName s <- Ann _ (UModuleName s)

-- * Pragmas

-- | @LANGUAGE@ pragma, listing the enabled language extensions in that file
pattern LanguagePragma :: LanguageExtensionList -> FilePragma
pattern LanguagePragma exts <- Ann _ (ULanguagePragma exts)

-- | @OPTIONS@ pragma, possibly qualified with a tool, e.g. OPTIONS_GHC
pattern OptionsPragma :: String -> FilePragma
pattern OptionsPragma opt <- Ann _ (UOptionsPragma (Ann _ (UStringNode opt)))

-- | The name of the enabled language extension, for example (@ LambdaCase @)
pattern LanguageExtension :: String -> LanguageExtension
pattern LanguageExtension ext <- Ann _ (ULanguageExtension ext)

-- | A warning pragma attached to the module
pattern ModuleWarningPragma :: StringNodeList -> ModulePragma
pattern ModuleWarningPragma msgs <- Ann _ (UModuleWarningPragma msgs)

-- | A deprecated pragma attached to the module
pattern ModuleDeprecatedPragma :: StringNodeList -> ModulePragma
pattern ModuleDeprecatedPragma msgs <- Ann _ (UModuleDeprecatedPragma msgs)