mirror of
https://github.com/github/semantic.git
synced 2024-11-24 00:42:33 +03:00
29 lines
1.0 KiB
Haskell
29 lines
1.0 KiB
Haskell
module Parsers (parserForType, Parser, lineByLineParser) where
|
|
|
|
import Diff
|
|
import Range
|
|
import Parser
|
|
import Source hiding ((++))
|
|
import Syntax
|
|
import TreeSitter
|
|
import Control.Comonad.Cofree
|
|
import qualified Data.Text as T
|
|
import Data.Foldable
|
|
|
|
-- | Return a parser based on the file extension (including the ".").
|
|
parserForType :: T.Text -> Parser
|
|
parserForType mediaType = maybe lineByLineParser parseTreeSitterFile $ languageForType mediaType
|
|
|
|
-- | A fallback parser that treats a file simply as rows of strings.
|
|
lineByLineParser :: Parser
|
|
lineByLineParser input = return . root . Indexed $ case foldl' annotateLeaves ([], 0) lines of
|
|
(leaves, _) -> leaves
|
|
where
|
|
lines = actualLines input
|
|
root syntax = Info (Range 0 $ length input) mempty :< syntax
|
|
leaf charIndex line = Info (Range charIndex $ charIndex + T.length line) mempty :< Leaf line
|
|
annotateLeaves (accum, charIndex) line =
|
|
(accum ++ [ leaf charIndex (toText line) ]
|
|
, charIndex + length line)
|
|
toText = T.pack . Source.toString
|