diff options
Diffstat (limited to 'app/TreeGrepper/Comment.hs')
-rw-r--r-- | app/TreeGrepper/Comment.hs | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/app/TreeGrepper/Comment.hs b/app/TreeGrepper/Comment.hs deleted file mode 100644 index 7c2ca90..0000000 --- a/app/TreeGrepper/Comment.hs +++ /dev/null @@ -1,149 +0,0 @@ -module TreeGrepper.Comment - ( Comment (..), - getComments, - CommentStyle (..), - uncomment, - comment, - ) -where - -import Control.Exception (catch, throw) -import Data.Aeson qualified as A -import Data.Binary (Binary) -import Data.ByteString.Lazy.Char8 qualified as B -import Data.Function ((&)) -import Data.List (find) -import Data.Maybe (fromMaybe) -import Data.Text qualified as T -import Data.Text.Lazy.IO qualified as LT -import Exception qualified as E -import GHC.Generics (Generic) -import Git qualified -import Process (proc, sh) -import System.Directory (createDirectoryIfMissing) -import System.FilePath (takeDirectory, takeExtension, takeFileName, (</>)) -import System.IO.Temp (withSystemTempDirectory) -import System.Process.Typed qualified as P -import TreeGrepper.FileType (FileType (..)) -import TreeGrepper.FileType qualified as G -import TreeGrepper.Match (Match (..), Position (..)) -import TreeGrepper.Match qualified as G -import TreeGrepper.Result (Result (..)) -import TreeGrepper.Result qualified as G - -data Comment = Comment - { -- result fields - file :: String, - file_type :: FileType, - -- match fields - kind :: String, - name :: String, - text :: T.Text, - start :: Position, - end :: Position - } - deriving (Show, Generic) - -data CommentStyle - = LineStyle T.Text - | BlockStyle T.Text T.Text - deriving (Eq, Show, Generic, Binary) - -comment :: CommentStyle -> T.Text -> T.Text -comment (LineStyle linePrefix) = T.unlines . map ((linePrefix <> " ") <>) . T.lines -comment (BlockStyle blockStart blockEnd) = (blockStart <>) . (<> blockEnd) - -uncomment :: FileType -> T.Text -> (CommentStyle, T.Text) -uncomment fileType rawText = - maybe - ( ( LineStyle info.lineStart, - stripLineComments (G.info fileType).lineStart text - ) - ) - ( \(blockInfo, blockStart) -> - ( BlockStyle blockStart blockInfo.blockEnd, - stripBlockComment blockStart blockInfo.blockEnd text - ) - ) - $ do - blockInfo <- info.block - (,) blockInfo <$> find (`T.isPrefixOf` text) blockInfo.blockStart - where - info = G.info fileType - text = stripLines rawText - stripLines = T.intercalate "\n" . map T.strip . T.lines - -stripLineComments :: T.Text -> T.Text -> T.Text -stripLineComments lineStart text = - onLines - ( \line -> - fromMaybe line . fmap T.stripStart $ - T.stripPrefix lineStart line - ) - text - where - onLines f = T.intercalate "\n" . map f . T.lines - -stripBlockComment :: T.Text -> T.Text -> T.Text -> T.Text -stripBlockComment blockStart blockEnd text = - T.strip - . (fromMaybe text . T.stripSuffix blockEnd) - . (fromMaybe text . T.stripPrefix blockStart) - $ text - -fromMatch :: Result -> Match -> Comment -fromMatch Result {..} Match {..} = Comment {..} - -getComments :: Git.CommitHash -> FilePath -> IO [Comment] -getComments commitHash fn = do - let ext = takeExtension fn - s <- - catch - (Git.readTextFileOf commitHash fn) - (\(_ :: E.ProcessException) -> pure "") - withSystemTempDirectory (takeFileName fn) $ \cwd -> do - createDirectoryIfMissing True (cwd </> takeDirectory fn) - LT.writeFile (cwd </> fn) s - concatMap (\result -> map (fromMatch result) result.matches) - . map fixTreeGrepper - . decode - <$> sh - ( ( proc - "tree-grepper % --query % % --format json" - fn - (treeGrepperLanguage ext) - (treeGrepperQuery ext) - ) - & P.setWorkingDir cwd - ) - -decode :: B.ByteString -> [Result] -decode = either (throw . E.InvalidTreeGrepperResult) id . A.eitherDecode - -fixTreeGrepper :: G.Result -> G.Result -fixTreeGrepper treeGrepperResult = - treeGrepperResult {G.matches = G.merge treeGrepperResult.matches} - -treeGrepperLanguage :: String -> String -treeGrepperLanguage ext = - -- TODO Add support for all tree-grepper supported files - -- - -- tree-grepper supported files can be listed through `tree-grepper - -- --languages`. - -- - -- @backlog - case ext of - ".elm" -> "elm" - ".hs" -> "haskell" - ".nix" -> "nix" - ".sh" -> "sh" - _ -> throw (E.UnknownFileExtension ext) - -treeGrepperQuery :: String -> String -treeGrepperQuery ext = - case ext of - ".elm" -> "([(line_comment) (block_comment)])" - ".hs" -> "(comment)" - ".nix" -> "(comment)" - ".sh" -> "(comment)" - _ -> throw (E.UnknownFileExtension ext) |