module Parser where import Diff import Range import Syntax import Term import TreeSitter import Control.Comonad.Cofree type Parser = String -> IO (Term String Info) parserForType :: String -> Parser parserForType mediaType = maybe lineByLineParser parseTreeSitterFile $ case mediaType of ".h" -> Just ts_language_c ".c" -> Just ts_language_c ".js" -> Just ts_language_javascript _ -> Nothing lineByLineParser :: Parser lineByLineParser input = return . root . Indexed $ case foldl annotateLeaves ([], 0) lines of (leaves, _) -> leaves where lines = Prelude.lines input root syntax = Info (Range 0 $ length input) mempty :< syntax leaf charIndex line = Info (Range charIndex $ charIndex + length line) mempty :< Leaf line annotateLeaves (accum, charIndex) line = (accum ++ [ leaf charIndex line ] , charIndex + length line + 1)