Pure Haskell bindings to libclang
A Haskell library for pure C++ code analysis
module Main (main) where
import Control.Monad
import Language.C.Clang
main :: IO ()
main = do
idx <- createIndex
tu <- parseTranslationUnit idx "main.cpp" ["-I/usr/local/include"]
let root = translationUnitCursor tu
children = cursorChildren root
functionDecls = filter (\c -> cursorKind c == FunctionDecl) children
forM_ functionDecls (print . cursorSpelling)
idx <- createIndex
tu <- parseTranslationUnit idx path clangArgs
let funDecs =
-- fold over cursors recursively
cursorDescendantsF
-- finding FunctionDecls...
. folding (matchKind @'FunctionDecl)
-- ...that are actually in the given file
. filtered (isFromMainFile . rangeStart . cursorExtent)
-- and get their names and types
. to (\funDec -> cursorSpelling funDec <> " :: " <> typeSpelling (cursorType funDec))
BS.putStrLn $ BS.unlines (translationUnitCursor tu ^.. funDecs)