mirror of
https://github.com/github/semantic.git
synced 2024-12-24 23:42:31 +03:00
Merge branch 'master' into grpc-server
This commit is contained in:
commit
df7f14fb04
@ -12,29 +12,31 @@ import Data.Source
|
||||
import Data.Span
|
||||
import Data.Term
|
||||
import Foreign
|
||||
import Foreign.C.Types (CBool(..))
|
||||
import Foreign.Marshal.Array (allocaArray)
|
||||
import qualified TreeSitter.Document as TS
|
||||
import qualified TreeSitter.Tree as TS
|
||||
import qualified TreeSitter.Parser as TS
|
||||
import qualified TreeSitter.Node as TS
|
||||
import qualified TreeSitter.Language as TS
|
||||
|
||||
-- | Parse 'Source' with the given 'TS.Language' and return its AST.
|
||||
parseToAST :: (Bounded grammar, Enum grammar) => Ptr TS.Language -> Blob -> IO (AST [] grammar)
|
||||
parseToAST language Blob{..} = bracket TS.ts_document_new TS.ts_document_free $ \ document -> do
|
||||
TS.ts_document_set_language document language
|
||||
root <- unsafeUseAsCStringLen (sourceBytes blobSource) $ \ (source, len) -> do
|
||||
TS.ts_document_set_input_string_with_length document source len
|
||||
TS.ts_document_parse_halt_on_error document
|
||||
parseToAST language Blob{..} = bracket TS.ts_parser_new TS.ts_parser_delete $ \ parser -> do
|
||||
TS.ts_parser_halt_on_error parser (CBool 1)
|
||||
TS.ts_parser_set_language parser language
|
||||
unsafeUseAsCStringLen (sourceBytes blobSource) $ \ (source, len) -> do
|
||||
alloca (\ rootPtr -> do
|
||||
TS.ts_document_root_node_p document rootPtr
|
||||
peek rootPtr)
|
||||
bracket (TS.ts_parser_parse_string parser nullPtr source len) TS.ts_tree_delete $ \ tree -> do
|
||||
TS.ts_tree_root_node_p tree rootPtr
|
||||
peek rootPtr >>= anaM toAST
|
||||
)
|
||||
|
||||
anaM toAST root
|
||||
|
||||
toAST :: forall grammar . (Bounded grammar, Enum grammar) => TS.Node -> IO (Base (AST [] grammar) TS.Node)
|
||||
toAST node@TS.Node{..} = do
|
||||
let count = fromIntegral nodeChildCount
|
||||
children <- allocaArray count $ \ childNodesPtr -> do
|
||||
_ <- with nodeTSNode (\ nodePtr -> TS.ts_node_copy_child_nodes nullPtr nodePtr childNodesPtr (fromIntegral count))
|
||||
_ <- with nodeTSNode (\ nodePtr -> TS.ts_node_copy_child_nodes nodePtr childNodesPtr (fromIntegral count))
|
||||
peekArray count childNodesPtr
|
||||
pure $! In (Node (toEnum (min (fromIntegral nodeSymbol) (fromEnum (maxBound :: grammar)))) (nodeRange node) (nodeSpan node)) children
|
||||
|
||||
|
2
vendor/haskell-tree-sitter
vendored
2
vendor/haskell-tree-sitter
vendored
@ -1 +1 @@
|
||||
Subproject commit 81d266c8d46609fb6c9e69c610121be6d97612a6
|
||||
Subproject commit 897785918ce87f51e541777978f33de09619dcc7
|
Loading…
Reference in New Issue
Block a user