-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Refactoring Tool for Haskell -- -- Contains a set of refactorings based on the Haskell-Tools framework to -- easily transform a Haskell program. For the descriptions of the -- implemented refactorings, see the homepage. @package haskell-tools-refactor @version 0.2.0.0 module Language.Haskell.Tools.Refactor.GetModules -- | Get modules of the project with the indicated root directory. If there -- is a cabal file, it uses that, otherwise it just scans the directory -- recursively for haskell sourcefiles. getModules :: FilePath -> IO [String] modulesFromCabalFile :: FilePath -> IO [String] modulesFromDirectory :: FilePath -> FilePath -> IO [String] module Language.Haskell.Tools.Refactor.RefactorBase type UnnamedModule dom = Ann Module dom SrcTemplateStage -- | The name of the module and the AST type ModuleDom dom = (String, UnnamedModule dom) -- | A refactoring that only affects one module type LocalRefactoring dom = UnnamedModule dom -> LocalRefactor dom (UnnamedModule dom) -- | The type of a refactoring type Refactoring dom = ModuleDom dom -> [ModuleDom dom] -> Refactor [RefactorChange dom] -- | Change in the project, modification or removal of a module. data RefactorChange dom ContentChanged :: (ModuleDom dom) -> RefactorChange dom [fromContentChanged] :: RefactorChange dom -> (ModuleDom dom) ModuleRemoved :: String -> RefactorChange dom [removedModuleName] :: RefactorChange dom -> String -- | Performs the given refactoring, transforming it into a Ghc action runRefactor :: (HasModuleInfo dom) => ModuleDom dom -> [ModuleDom dom] -> Refactoring dom -> Ghc (Either String [RefactorChange dom]) -- | Wraps a refactoring that only affects one module. Performs the -- per-module finishing touches. localRefactoring :: HasModuleInfo dom => LocalRefactoring dom -> Refactoring dom -- | Transform the result of the local refactoring localRefactoringRes :: HasModuleInfo dom => ((UnnamedModule dom -> UnnamedModule dom) -> a -> a) -> UnnamedModule dom -> LocalRefactor dom a -> Refactor a -- | Adds the imports that bring names into scope that are needed by the -- refactoring addGeneratedImports :: [Name] -> Ann Module dom SrcTemplateStage -> Ann Module dom SrcTemplateStage -- | Input and output information for the refactoring newtype LocalRefactorT dom m a LocalRefactorT :: WriterT [Name] (ReaderT (RefactorCtx dom) m) a -> LocalRefactorT dom m a [fromRefactorT] :: LocalRefactorT dom m a -> WriterT [Name] (ReaderT (RefactorCtx dom) m) a -- | The information a refactoring can use data RefactorCtx dom RefactorCtx :: Module -> Ann Module dom SrcTemplateStage -> [Ann ImportDecl dom SrcTemplateStage] -> RefactorCtx dom [refModuleName] :: RefactorCtx dom -> Module [refCtxRoot] :: RefactorCtx dom -> Ann Module dom SrcTemplateStage [refCtxImports] :: RefactorCtx dom -> [Ann ImportDecl dom SrcTemplateStage] -- | A monad that can be used to refactor class Monad m => RefactorMonad m refactError :: RefactorMonad m => String -> m a liftGhc :: RefactorMonad m => Ghc a -> m a -- | The refactoring monad for a given module type LocalRefactor dom = LocalRefactorT dom Refactor -- | The refactoring monad for the whole project type Refactor = ExceptT String Ghc registeredNamesFromPrelude :: [Name] otherNamesFromPrelude :: [String] qualifiedName :: Name -> String referenceName :: (HasImportInfo dom, HasModuleInfo dom) => Name -> LocalRefactor dom (Ann Name dom SrcTemplateStage) referenceOperator :: (HasImportInfo dom, HasModuleInfo dom) => Name -> LocalRefactor dom (Ann Operator dom SrcTemplateStage) -- | Create a name that references the definition. Generates an import if -- the definition is not yet imported. referenceName' :: (HasImportInfo dom, HasModuleInfo dom) => ([String] -> Name -> Ann nt dom SrcTemplateStage) -> Name -> LocalRefactor dom (Ann nt dom SrcTemplateStage) -- | Reference the name by the shortest suitable import referenceBy :: ([String] -> Name -> Ann nt dom SrcTemplateStage) -> Name -> [Ann ImportDecl dom SrcTemplateStage] -> Ann nt dom SrcTemplateStage -- | Different classes of definitions that have different kind of names. data NameClass -- | Normal value definitions: functions, variables Variable :: NameClass -- | Data constructors Ctor :: NameClass -- | Functions with operator-like names ValueOperator :: NameClass -- | Constructors with operator-like names DataCtorOperator :: NameClass -- | Type definitions with operator-like names SynonymOperator :: NameClass -- | Get which category does a given name belong to classifyName :: RefactorMonad m => Name -> m NameClass -- | Checks if a given name is a valid module name validModuleName :: String -> Bool -- | Check if a given name is valid for a given kind of definition nameValid :: NameClass -> String -> Bool isIdStartChar :: Char -> Bool isOperatorChar :: Char -> Bool instance GhcMonad.GhcMonad m => GhcMonad.GhcMonad (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance Exception.ExceptionMonad m => Exception.ExceptionMonad (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance (GHC.Base.Monad m, DynFlags.HasDynFlags m) => DynFlags.HasDynFlags (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance GHC.Base.Monad m => Control.Monad.Writer.Class.MonadWriter [Name.Name] (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader (Language.Haskell.Tools.Refactor.RefactorBase.RefactorCtx dom) (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance GHC.Base.Monad m => GHC.Base.Monad (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance GHC.Base.Applicative m => GHC.Base.Applicative (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance GHC.Base.Functor m => GHC.Base.Functor (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom m) instance (GhcMonad.GhcMonad m, GHC.Base.Monoid s) => GhcMonad.GhcMonad (Control.Monad.Trans.Writer.Lazy.WriterT s m) instance (Exception.ExceptionMonad m, GHC.Base.Monoid s) => Exception.ExceptionMonad (Control.Monad.Trans.Writer.Lazy.WriterT s m) instance GhcMonad.GhcMonad m => GhcMonad.GhcMonad (Control.Monad.Trans.Reader.ReaderT s m) instance Exception.ExceptionMonad m => Exception.ExceptionMonad (Control.Monad.Trans.Reader.ReaderT s m) instance GhcMonad.GhcMonad m => GhcMonad.GhcMonad (Control.Monad.Trans.Except.ExceptT s m) instance Exception.ExceptionMonad m => Exception.ExceptionMonad (Control.Monad.Trans.Except.ExceptT s m) instance Control.Monad.Trans.Class.MonadTrans (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactorT dom) instance Language.Haskell.Tools.Refactor.RefactorBase.RefactorMonad Language.Haskell.Tools.Refactor.RefactorBase.Refactor instance Language.Haskell.Tools.Refactor.RefactorBase.RefactorMonad (Language.Haskell.Tools.Refactor.RefactorBase.LocalRefactor dom) instance Language.Haskell.Tools.Refactor.RefactorBase.RefactorMonad m => Language.Haskell.Tools.Refactor.RefactorBase.RefactorMonad (Control.Monad.Trans.State.Lazy.StateT s m) module Language.Haskell.Tools.Refactor.ExtractBinding type Ann' e dom = Ann e dom SrcTemplateStage type AnnMaybe' e dom = AnnMaybe e dom SrcTemplateStage type ExtractBindingDomain dom = (Domain dom, HasNameInfo dom, HasDefiningInfo dom, HasScopeInfo dom) extractBinding' :: ExtractBindingDomain dom => RealSrcSpan -> String -> LocalRefactoring dom extractBinding :: forall dom. ExtractBindingDomain dom => Simple Traversal (Ann' Module dom) (Ann' ValueBind dom) -> Simple Traversal (Ann' ValueBind dom) (Ann' Expr dom) -> String -> LocalRefactoring dom isConflicting :: ExtractBindingDomain dom => String -> Ann' QualifiedName dom -> Bool extractThatBind :: ExtractBindingDomain dom => String -> Ann' Expr dom -> Ann' Expr dom -> StateT (Maybe (Ann' ValueBind dom)) (LocalRefactor dom) (Ann' Expr dom) addLocalBinding :: SrcSpan -> SrcSpan -> Ann' ValueBind dom -> ValueBind dom SrcTemplateStage -> State Bool (ValueBind dom SrcTemplateStage) insertLocalBind :: SrcSpan -> Ann' ValueBind dom -> AnnMaybe' LocalBinds dom -> AnnMaybe' LocalBinds dom -- | All expressions that are bound stronger than function application. isParenLikeExpr :: Expr dom st -> Bool doExtract :: ExtractBindingDomain dom => String -> Ann' Expr dom -> Ann' Expr dom -> StateT (Maybe (Ann' ValueBind dom)) (LocalRefactor dom) (Ann' Expr dom) -- | Gets the values that have to be passed to the extracted definition getExternalBinds :: ExtractBindingDomain dom => Ann' Expr dom -> Ann' Expr dom -> [Ann' Name dom] actualContainingExpr :: SourceInfo st => SrcSpan -> Simple Traversal (Ann ValueBind dom st) (Ann Expr dom st) -- | Generates the expression that calls the local binding generateCall :: String -> [Ann' Name dom] -> Ann' Expr dom -- | Generates the local binding for the selected expression generateBind :: String -> [Ann' Pattern dom] -> Ann' Expr dom -> Ann' ValueBind dom isValidBindingName :: String -> Bool module Language.Haskell.Tools.Refactor.RenameDefinition renameDefinition :: DomainRenameDefinition dom => Name -> [Name] -> String -> Refactoring dom renameDefinition' :: forall dom. DomainRenameDefinition dom => RealSrcSpan -> String -> Refactoring dom type DomainRenameDefinition dom = (HasNameInfo dom, HasScopeInfo dom, HasDefiningInfo dom, HasImplicitFieldsInfo dom, HasModuleInfo dom) module Language.Haskell.Tools.Refactor.GenerateExports type DomGenerateExports dom = (Domain dom, HasNameInfo dom) -- | Creates an export list that imports standalone top-level definitions -- with all of their contained definitions generateExports :: DomGenerateExports dom => LocalRefactoring dom -- | Get all the top-level definitions with flags that mark if they can -- contain other top-level definitions (classes and data declarations). getTopLevels :: DomGenerateExports dom => Ann Module dom SrcTemplateStage -> [(Name, Bool)] -- | Get all the standalone top level definitions (their GHC unique names) -- in a module. You could also do getting all the names with a biplate -- reference and select the top-level ones, but this is more efficient. getTopLevelDeclName :: DomGenerateExports dom => Decl dom SrcTemplateStage -> Maybe Name -- | Create the export for a give name. createExports :: DomGenerateExports dom => [(Name, Bool)] -> Ann ExportSpecList dom SrcTemplateStage module Language.Haskell.Tools.Refactor.GenerateTypeSignature -- | Perform the refactoring on either local or top-level definition generateTypeSignature :: GenerateSignatureDomain dom => Simple Traversal (Ann' Module dom) (AnnList' Decl dom) -> Simple Traversal (Ann' Module dom) (AnnList' LocalBind dom) -> (forall d. (Show (d dom SrcTemplateStage), Data (d dom SrcTemplateStage), Typeable d, BindingElem d) => AnnList' d dom -> Maybe (Ann' ValueBind dom)) -> LocalRefactoring dom generateTypeSignature' :: GenerateSignatureDomain dom => RealSrcSpan -> LocalRefactoring dom type GenerateSignatureDomain dom = (HasModuleInfo dom, HasIdInfo dom, HasImportInfo dom) module Language.Haskell.Tools.Refactor.OrganizeImports organizeImports :: forall dom. OrganizeImportsDomain dom => LocalRefactoring dom type OrganizeImportsDomain dom = (Domain dom, HasNameInfo dom, HasImportInfo dom) -- | Defines common utilities for using refactorings. Provides an interface -- for both demo, command line and integrated tools. module Language.Haskell.Tools.Refactor -- | Use the given source directories useDirs :: [FilePath] -> Ghc () -- | Set the given flags for the GHC session useFlags :: [String] -> Ghc [String] -- | Initialize GHC flags to default values that support refactoring initGhcFlags :: Ghc () -- | Translates module name and working directory into the name of the file -- where the given module should be defined toFileName :: String -> String -> FilePath -- | Translates module name and working directory into the name of the file -- where the boot module should be defined toBootFileName :: String -> String -> FilePath -- | Load the summary of a module given by the working directory and module -- name. loadModule :: String -> String -> Ghc ModSummary -- | The final version of our AST, with type infromation added type TypedModule = Ann Module IdDom SrcTemplateStage -- | Get the typed representation from a type-correct program. parseTyped :: ModSummary -> Ghc TypedModule -- | Executes a given command on the selected module and given other -- modules performCommand :: (HasModuleInfo dom, DomGenerateExports dom, OrganizeImportsDomain dom, DomainRenameDefinition dom, ExtractBindingDomain dom, GenerateSignatureDomain dom) => RefactorCommand -> ModuleDom dom -> [ModuleDom dom] -> Ghc (Either String [RefactorChange dom]) -- | A refactoring command data RefactorCommand NoRefactor :: RefactorCommand OrganizeImports :: RefactorCommand GenerateExports :: RefactorCommand GenerateSignature :: RealSrcSpan -> RefactorCommand RenameDefinition :: RealSrcSpan -> String -> RefactorCommand ExtractBinding :: RealSrcSpan -> String -> RefactorCommand readCommand :: String -> String -> RefactorCommand analyzeCommand :: String -> String -> [String] -> RefactorCommand readSrcSpan :: String -> String -> RealSrcSpan readSrcLoc :: String -> String -> RealSrcLoc data IsBoot NormalHs :: IsBoot IsHsBoot :: IsBoot tryRefactor :: Refactoring IdDom -> String -> IO () instance GHC.Show.Show Language.Haskell.Tools.Refactor.IsBoot instance GHC.Classes.Ord Language.Haskell.Tools.Refactor.IsBoot instance GHC.Classes.Eq Language.Haskell.Tools.Refactor.IsBoot instance GHC.Show.Show Language.Haskell.Tools.Refactor.RefactorCommand module Language.Haskell.Tools.Refactor.DataToNewtype dataToNewtype :: Domain dom => LocalRefactoring dom module Language.Haskell.Tools.Refactor.IfToGuards ifToGuards :: Domain dom => RealSrcSpan -> LocalRefactoring dom module Language.Haskell.Tools.Refactor.DollarApp dollarApp :: DollarDomain dom => RealSrcSpan -> LocalRefactoring dom