Add option to convert pre/post qualified
This commit is contained in:
parent
3bea6e1ccb
commit
d11e3fcfa5
37
app/Main.hs
37
app/Main.hs
@ -6,23 +6,29 @@ import Options.Applicative
|
||||
import SortImports (sortImports)
|
||||
import System.Environment (getArgs)
|
||||
import System.IO (hReady, stdin)
|
||||
import SortImports.Types (Qualified(..))
|
||||
|
||||
versionNumber :: String
|
||||
versionNumber = "v1.2.0"
|
||||
|
||||
version :: Parser Options
|
||||
version :: Parser Mode
|
||||
version = flag' Version $ mconcat
|
||||
[ long "version"
|
||||
, short 'v'
|
||||
, help "Version number"
|
||||
]
|
||||
|
||||
data Options
|
||||
data Mode
|
||||
= Version
|
||||
| FileInput FilePath
|
||||
| StdInput
|
||||
|
||||
fileInput :: Parser Options
|
||||
data Options = Options
|
||||
{ _options_mode :: Mode
|
||||
, _options_convert :: Maybe Qualified
|
||||
}
|
||||
|
||||
fileInput :: Parser Mode
|
||||
fileInput = FileInput <$> strOption (mconcat
|
||||
[ long "file"
|
||||
, short 'f'
|
||||
@ -30,27 +36,40 @@ fileInput = FileInput <$> strOption (mconcat
|
||||
, help "Input file"
|
||||
])
|
||||
|
||||
stdInput :: Parser Options
|
||||
stdInput :: Parser Mode
|
||||
stdInput = flag' StdInput $ mconcat
|
||||
[ long "stdin"
|
||||
, help "Read input from stdin"
|
||||
]
|
||||
|
||||
convertToQualifiedPost :: Parser Bool
|
||||
convertToQualifiedPost = switch (long "convert-to-qualified-post" <> help "Whether to convert all qualified imports to use ImportQualifiedPost")
|
||||
|
||||
convertToQualifiedPre :: Parser Bool
|
||||
convertToQualifiedPre = switch (long "convert-to-qualified-pre" <> help "Whether to convert all ImportQualifiedPost imports to use older \"import qualified\" syntax")
|
||||
|
||||
options :: Parser Options
|
||||
options = version <|> fileInput <|> stdInput
|
||||
options = Options
|
||||
<$> (version <|> fileInput <|> stdInput)
|
||||
<*> (post <|> pre)
|
||||
where
|
||||
post = ((\x -> if x then Just Qualified_Post else Nothing) <$> convertToQualifiedPost)
|
||||
pre = ((\x -> if x then Just Qualified_Pre else Nothing) <$> convertToQualifiedPre)
|
||||
|
||||
run :: Options -> IO ()
|
||||
run = \case
|
||||
run opts = case _options_mode opts of
|
||||
Version -> putStrLn versionNumber
|
||||
FileInput path -> readFile path >>= putStr . sortImports
|
||||
StdInput -> interact sortImports
|
||||
FileInput path -> readFile path >>= putStr . (sortImports convert)
|
||||
StdInput -> interact (sortImports convert)
|
||||
where
|
||||
convert = _options_convert opts
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
noArgs <- null <$> getArgs
|
||||
anyStdin <- hReady stdin
|
||||
if noArgs && anyStdin
|
||||
then run StdInput
|
||||
then run (Options StdInput Nothing)
|
||||
else execParser opts >>= run
|
||||
where opts = info (options <**> helper) $ mconcat
|
||||
[ briefDesc
|
||||
|
@ -93,8 +93,8 @@ exposure = do
|
||||
hiding <- isJust <$> optional (rword "hiding")
|
||||
(if hiding then Hidden else Exposed) <$> exports
|
||||
|
||||
module' :: Parser Module
|
||||
module' = do
|
||||
module' :: Maybe Qualified -> Parser Module
|
||||
module' cfgQualified = do
|
||||
void $ rword "import"
|
||||
_qualified' <- isJust <$> optional (rword "qualified")
|
||||
_name <- moduleName
|
||||
@ -102,15 +102,19 @@ module' = do
|
||||
_alias <- optional alias
|
||||
_exports <- optional exposure
|
||||
space
|
||||
let _qualified = if _qualified' then Just Qualified_Pre else if _qualified'' then Just Qualified_Post else Nothing
|
||||
let _qualified = case cfgQualified of
|
||||
Nothing -> if _qualified'
|
||||
then Just Qualified_Pre
|
||||
else if _qualified'' then Just Qualified_Post else Nothing
|
||||
Just q -> if (_qualified' || _qualified'') then Just q else Nothing
|
||||
pure Module {..}
|
||||
|
||||
sortExports :: Module -> Module
|
||||
sortExports m = m { _exports = fmap sort <$> _exports m }
|
||||
|
||||
lineType :: String -> LineType
|
||||
lineType x =
|
||||
case parse module' "" x of
|
||||
lineType :: Maybe Qualified -> String -> LineType
|
||||
lineType mq x =
|
||||
case parse (module' mq) "" x of
|
||||
Left _ -> CodeLine x
|
||||
Right m -> ModuleLine m
|
||||
|
||||
@ -127,12 +131,12 @@ sortIfModules xs@(ModuleLine _:_) = sort . fmap f $ xs
|
||||
where f (ModuleLine x) = ModuleLine $ sortExports x
|
||||
f x = x
|
||||
|
||||
sortImports :: String -> String
|
||||
sortImports
|
||||
sortImports :: Maybe Qualified -> String -> String
|
||||
sortImports mq
|
||||
= unlines
|
||||
. fmap (\case CodeLine x -> x
|
||||
ModuleLine x -> view x)
|
||||
. concatMap sortIfModules
|
||||
. groupLines
|
||||
. map lineType
|
||||
. map (lineType mq)
|
||||
. lines
|
||||
|
Loading…
x
Reference in New Issue
Block a user