packages feed

libclang-bindings-0.1.0.0: test/Test/Util/Clang.hs

{-# LANGUAGE OverloadedStrings #-}

-- | Convenience functions around the clang bindings
--
-- Intended for unqualified import.
module Test.Util.Clang (
    -- * Top-level call into clang
    withInput
  , parseUsing
  ) where

import Control.Exception
import Data.Default
import Test.Util.Input (TestInput (..))

import Clang.Enum.Simple
import Clang.HighLevel qualified as HighLevel
import Clang.HighLevel.Types
import Clang.LowLevel.Core

{-------------------------------------------------------------------------------
  Top-level call into clang
-------------------------------------------------------------------------------}

withInput :: TestInput -> (CXTranslationUnit -> IO a) -> IO a
withInput (TestInput input) onSuccess =
    HighLevel.withUnsavedFile "test.h" input $ \file ->
    HighLevel.withIndex DisplayDiagnostics   $ \ix   ->
    HighLevel.withTranslationUnit2
      ix
      (Just "test.h")
      def
      [file]
      mempty
      onFailure
      onSuccess
  where
    onFailure :: SimpleEnum CXErrorCode -> IO a
    onFailure = throwIO . userError . show

parseUsing :: Fold IO a -> TestInput -> IO [a]
parseUsing fold input = do
    withInput input $ \unit -> do
      root   <- clang_getTranslationUnitCursor unit
      HighLevel.clang_visitChildren root fold