{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module CabalFmt.Refactoring (
CommentsPragmas,
refactor,
) where
import qualified Distribution.Fields as C
import CabalFmt.Monad
import CabalFmt.Refactoring.ExpandExposedModules
import CabalFmt.Refactoring.Fragments
import CabalFmt.Refactoring.GlobFiles
import CabalFmt.Refactoring.Type
import CabalFmt.Fields.SourceFiles
refactor :: forall m r. MonadCabalFmt r m => [C.Field CommentsPragmas] -> m [C.Field CommentsPragmas]
refactor = rewriteFields rewrite
where
rewrite :: C.Field CommentsPragmas -> m (Maybe (C.Field CommentsPragmas))
rewrite f@(C.Field (C.Name _ n) _)
| n == "exposed-modules" || n == "other-modules" = combine
[ refactoringFragments
, refactoringExpandExposedModules
] f
| n `elem` fileFields = combine
[ refactoringFragments
, refactoringGlobFiles
] f
| otherwise = combine
[ refactoringFragments
] f
rewrite f@(C.Section _ _ _)
| otherwise = combine
[ refactoringFragments
] f
combine
:: Monad m
=> [C.Field CommentsPragmas -> m (Maybe (C.Field CommentsPragmas))]
-> C.Field CommentsPragmas -> m (Maybe (C.Field CommentsPragmas))
combine [] _ = return Nothing
combine (r:rs) f = do
m <- r f
case m of
Nothing -> combine rs f
Just f' -> return (Just f')