Check in hsimport.hs and create hacking subdir
This commit is contained in:
parent
e2c83b3c31
commit
c0ef142c41
59
hacking/hsimport.hs
Normal file
59
hacking/hsimport.hs
Normal file
@ -0,0 +1,59 @@
|
||||
import Data.List
|
||||
import qualified Language.Haskell.Exts as HS
|
||||
import HsImport
|
||||
|
||||
main :: IO ()
|
||||
main = hsimport $ defaultConfig { prettyPrint = prettyPrint
|
||||
, findImportPos = findImportPos }
|
||||
where
|
||||
-- This is a bogus implementation of prettyPrint, because it doesn't
|
||||
-- handle the qualified import case nor does it considers any explicitely
|
||||
-- imported or hidden symbols.
|
||||
prettyPrint :: HS.ImportDecl -> String
|
||||
prettyPrint (HS.ImportDecl sloc modname qual _ _ mpkg mas mspec) =
|
||||
"import " ++ (ifStr qual "qualified") ++
|
||||
(maybe "" (\pkg -> " \"" ++ pkg ++ "\" ") mpkg) ++
|
||||
getMN modname ++ (maybe "" (\name -> " as " ++ getMN name) $ mas) ++
|
||||
specprint mspec
|
||||
|
||||
specprint :: Maybe (Bool, [HS.ImportSpec]) -> String
|
||||
specprint Nothing = ""
|
||||
specprint (Just (False, xs))
|
||||
= "\n (\n" ++ printImportSpecs xs ++ "\n )"
|
||||
specprint (Just (True, xs))
|
||||
= "\n hiding (\n" ++ printImportSpecs xs ++ "\n )"
|
||||
|
||||
printImportSpecs :: [HS.ImportSpec] -> String
|
||||
printImportSpecs ins
|
||||
= let (x:xs) = sort ins
|
||||
in " " ++ printSpec x ++ "\n" ++ go xs
|
||||
where
|
||||
go [] = ""
|
||||
go [x'] = " , " ++ printSpec x'
|
||||
go (x':xs') = " , " ++ printSpec x' ++ "\n" ++ go xs'
|
||||
printSpec :: HS.ImportSpec -> String
|
||||
printSpec = HS.prettyPrint
|
||||
|
||||
|
||||
-- This findImportPos implementation will always add the new import
|
||||
-- declaration at the end of the current ones. The data type ImportPos
|
||||
-- has the two constructors After and Before.
|
||||
findImportPos :: HS.ImportDecl -> [HS.ImportDecl] -> Maybe ImportPos
|
||||
findImportPos _ [] = Nothing
|
||||
findImportPos newImport currentImports = Just findPos
|
||||
where
|
||||
lastPos = After . last $ currentImports
|
||||
findPos = let xs = takeWhile (\x -> (getMN $ HS.importModule x)
|
||||
<
|
||||
(getMN $ HS.importModule newImport)
|
||||
)
|
||||
. sort
|
||||
$ currentImports
|
||||
in if null xs then lastPos else After . last $ xs
|
||||
|
||||
ifStr :: Bool -> String -> String
|
||||
ifStr True str = str
|
||||
ifStr False _ = ""
|
||||
|
||||
getMN :: HS.ModuleName -> String
|
||||
getMN (HS.ModuleName name) = name
|
Loading…
Reference in New Issue
Block a user