clang-pure-0.2.0.2: examples/ListTypes.hs
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
import Language.C.Clang
import Language.C.Clang.Cursor.Typed
import Control.Lens
import qualified Data.ByteString.Char8 as BS
import Data.Monoid
import System.Environment
main :: IO ()
main = do
args <- getArgs
case args of
path : clangArgs -> do
idx <- createIndex
tu <- parseTranslationUnit idx path clangArgs
let funDecs =
cursorDescendantsF -- fold over cursors recursively
. folding (matchKind @'FunctionDecl) -- find only FunctionDecls...
. filtered (isFromMainFile . rangeStart . cursorExtent) -- ...that are actually in the given file
. to (\funDec -> cursorSpelling funDec <> " :: " <> typeSpelling (cursorType funDec))
BS.putStrLn $ BS.unlines (translationUnitCursor tu ^.. funDecs)
_ -> putStrLn "usage: list-fun-types path [clang opts]"