1
1
mirror of https://github.com/github/semantic.git synced 2024-11-24 08:54:07 +03:00
semantic/app/Parser.hs

28 lines
880 B
Haskell

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 ".h" = parseTreeSitterFile ts_language_c
parserForType ".c" = parseTreeSitterFile ts_language_c
parserForType ".js" = parseTreeSitterFile ts_language_javascript
parserForType _ = lineByLineParser
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)