file-modules 0.1.2.2 → 0.1.2.3
raw patch · 2 files changed
+40/−20 lines, 2 filesdep +regex-compatdep +regex-pcrePVP ok
version bump matches the API change (PVP)
Dependencies added: regex-compat, regex-pcre
API changes (from Hackage documentation)
Files
- file-modules.cabal +18/−14
- src/Development/FileModules.hs +22/−6
file-modules.cabal view
@@ -1,5 +1,5 @@ name: file-modules-version: 0.1.2.2+version: 0.1.2.3 cabal-version: >=1.10 build-type: Simple license: MIT@@ -18,25 +18,29 @@ exposed-modules: Development.FileModules build-depends:- MissingH -any,- directory -any,- async -any,- base >=4.5 && <5,- filepath -any,- haskell-src-exts >=1.17 && <2+ MissingH -any,+ async -any,+ base >=4.5 && <5,+ directory -any,+ filepath -any,+ haskell-src-exts >=1.17 && <2,+ regex-compat >= 0.95.1,+ regex-pcre default-language: Haskell2010 hs-source-dirs: src executable file-modules main-is: Main.hs build-depends:- base >=4.5 && <5,- MissingH -any,- directory -any,- async -any,- base >=4.5 && <5,- filepath -any,- haskell-src-exts >=1.17 && <2+ MissingH -any,+ async -any,+ base >=4.5 && <5,+ base >=4.5 && <5,+ directory -any,+ filepath -any,+ haskell-src-exts >=1.17 && <2,+ regex-compat >= 0.95.1,+ regex-pcre -any default-language: Haskell2010 hs-source-dirs: src ghc-options: -O2 -threaded
src/Development/FileModules.hs view
@@ -7,9 +7,10 @@ import Language.Haskell.Exts (ImportDecl (..), ModuleHeadAndImports (..), ModuleName (..), NonGreedy (..),- ParseResult (..), parse)+ ParseResult (..), SrcLoc (..), parse) import System.Directory import System.FilePath+import Text.Regex fileModulesRecur :: FilePath -> IO [String] fileModulesRecur fname = run fname@@ -28,15 +29,30 @@ fileModules :: FilePath -> IO [String] fileModules fname = do- result <- parse . sanitize <$> readFile fname- case result of- (ParseOk (NonGreedy{..})) -> do+ fcontents <- readFile fname+ case parse $ sanitize fcontents of+ (ParseOk NonGreedy{..}) -> do let (ModuleHeadAndImports _ _ mimports) = unNonGreedy forM mimports $ \imp -> let ModuleName iname = importModule imp in return iname- (ParseFailed _ _) -> error $ "Failed to parse module in " ++ fname+ (ParseFailed (SrcLoc _ line col) err) -> error $+ "Failed to parse module in " ++ fname ++ ":\n" +++ " (" ++ show line ++ ":" ++ show col ++ ") " ++ err ++ "\n" +++ " " ++ getLineCol fcontents (line, col) where- sanitize = unlines . map removeCpp . lines+ sanitize =+ unlines . map (removeMagicHash . removeCpp) . lines removeCpp ('#':_) = "" removeCpp l = l+ removeMagicHash l = subRegex r l o+ where+ r = mkRegex "#"+ o = ""+ getLineCol fcontents (line, col) =+ ln ++ "\n" +++ " " ++ replicate (col' - 3) ' ' ++ "^^^"+ where+ ln = lines fcontents !! line+ col' = let l = length ln+ in if col > l then l else col