1
1
mirror of https://github.com/github/semantic.git synced 2024-12-01 00:33:59 +03:00
semantic/app/Parsers.hs

25 lines
787 B
Haskell
Raw Normal View History

2015-12-17 00:21:49 +03:00
module Parsers where
2015-12-09 17:49:24 +03:00
import Diff
import Range
import Parser
2015-12-24 08:20:47 +03:00
import Source hiding ((++))
import Syntax
2015-12-15 22:35:11 +03:00
import TreeSitter
import Control.Comonad.Cofree
2015-12-24 02:01:31 +03:00
import Data.Foldable
2015-12-09 17:49:24 +03:00
2015-12-15 22:36:25 +03:00
parserForType :: String -> Parser
parserForType mediaType = maybe lineByLineParser parseTreeSitterFile $ languageForType mediaType
2015-12-15 22:36:25 +03:00
lineByLineParser :: Parser
2015-12-24 02:01:31 +03:00
lineByLineParser input = return . root . Indexed $ case foldl' annotateLeaves ([], 0) lines of
2015-12-14 23:52:39 +03:00
(leaves, _) -> leaves
where
2015-12-24 08:20:47 +03:00
lines = actualLines input
2015-12-15 22:35:37 +03:00
root syntax = Info (Range 0 $ length input) mempty :< syntax
2015-12-24 08:20:47 +03:00
leaf charIndex line = Info (Range charIndex $ charIndex + length line) mempty :< Leaf (Source.toList line)
2015-12-14 23:52:39 +03:00
annotateLeaves (accum, charIndex) line =
(accum ++ [ leaf charIndex line ]
, charIndex + length line + 1)