mirror of
https://github.com/github/semantic.git
synced 2024-12-22 14:21:31 +03:00
We don’t need to preserve the node name.
This commit is contained in:
parent
11cbaf009c
commit
acae391e50
@ -18,7 +18,7 @@ type Parser = Source Char -> IO (Term Text Info)
|
||||
|
||||
-- | Given a source string, the term's range, production name, and
|
||||
-- | production/child pairs, construct the term.
|
||||
type Constructor = Source Char -> Range -> String -> [(String, Term Text Info)] -> Term Text Info
|
||||
type Constructor = Source Char -> Range -> String -> [Term Text Info] -> Term Text Info
|
||||
|
||||
-- | Categories that are treated as keyed nodes.
|
||||
keyedCategories :: Set.Set Category
|
||||
@ -35,10 +35,10 @@ termConstructor mapping source range name = (Info range categories :<) . constru
|
||||
where
|
||||
categories = mapping name
|
||||
construct [] = Leaf . pack . toList $ slice range source
|
||||
construct children | categories `intersect` fixedCategories = Fixed $ fmap snd children
|
||||
construct children | categories `intersect` fixedCategories = Fixed children
|
||||
construct children | categories `intersect` keyedCategories = Keyed . Map.fromList $ assignKey <$> children
|
||||
construct children = Indexed $ snd <$> children
|
||||
construct children = Indexed children
|
||||
intersect a b = not . Set.null $ Set.intersection a b
|
||||
assignKey (_, node@(Info _ categories :< Fixed (key : _))) | Set.member Pair categories = (getSubstring key, node)
|
||||
assignKey (_, node) = (getSubstring node, node)
|
||||
assignKey node@(Info _ categories :< Fixed (key : _)) | Set.member Pair categories = (getSubstring key, node)
|
||||
assignKey node = (getSubstring node, node)
|
||||
getSubstring (Info range _ :< _) = pack . toList $ slice range source
|
||||
|
@ -69,8 +69,7 @@ defaultCategoryForNodeName name = case name of
|
||||
documentToTerm :: Constructor -> Ptr TSDocument -> Parser
|
||||
documentToTerm constructor document contents = alloca $ \ root -> do
|
||||
ts_document_root_node_p document root
|
||||
(_, term) <- toTerm root
|
||||
return term
|
||||
toTerm root
|
||||
where toTerm node = do
|
||||
name <- ts_node_p_name node document
|
||||
name <- peekCString name
|
||||
@ -79,7 +78,7 @@ documentToTerm constructor document contents = alloca $ \ root -> do
|
||||
-- Note: The strict application here is semantically important. Without it, we may not evaluate the range until after we’ve exited the scope that `node` was allocated within, meaning `alloca` will free it & other stack data may overwrite it.
|
||||
range <- return $! Range { start = fromIntegral $ ts_node_p_start_char node, end = fromIntegral $ ts_node_p_end_char node }
|
||||
|
||||
return (name, constructor contents range name children)
|
||||
return $! constructor contents range name children
|
||||
getChild node n out = do
|
||||
_ <- ts_node_p_named_child node n out
|
||||
toTerm out
|
||||
|
Loading…
Reference in New Issue
Block a user