packages feed

clang-pure 0.2.0.4 → 0.2.0.5

raw patch · 7 files changed

+102/−30 lines, 7 filessetup-changed

Files

Setup.hs view
@@ -103,18 +103,6 @@    let verbosity = fromFlagOrDefault normal (configVerbosity flags) -  let addCSources libBuildInfo =-        libBuildInfo-#if !(MIN_VERSION_GLASGOW_HASKELL(8, 2, 1, 0) && MIN_VERSION_inline_c(0, 6, 0))-          { cSources = -- define the generated c-sources here so that they don't get picked up by sdist-#if defined(mingw32_HOST_OS) && !(MIN_VERSION_GLASGOW_HASKELL(8, 0, 2, 0))-              ["srcLanguageCClangInternalFFI.c"] -- work around a bug in hsc2hs-#else-              ["src/Language/C/Clang/Internal/FFI.c"]-#endif-          }-#endif-   addDirs <- case mbError of     Right () -> return id     Left (_ :: SomeException) -> do@@ -131,7 +119,7 @@   let lbi = libBuildInfo lib   return localBuildInfo     { localPkgDescr = pd-      { library = Just lib { libBuildInfo = addDirs $ addCSources lbi }+      { library = Just lib { libBuildInfo = addDirs lbi }       }     } 
clang-pure.cabal view
@@ -1,5 +1,5 @@ name:                  clang-pure-version:               0.2.0.4+version:               0.2.0.5 synopsis:              Pure C++ code analysis with libclang description:   Pure C++ code analysis with libclang.
src/Language/C/Clang.hs view
@@ -18,7 +18,9 @@   module C,   -- * Index   ClangIndex(),+  ClangIndexOption(..),   createIndex,+  createIndexWithOptions,   -- * Utilities   Clang(),   ClangOrd(..)
src/Language/C/Clang/Internal/Context.hs view
@@ -36,6 +36,7 @@   , (C.TypeName "CXFile", [t| CXFile |])   , (C.TypeName "CXType", [t| CXType |])   , (C.TypeName "CXToken", [t| CXToken |])+  , (C.Struct "CXUnsavedFile", [t| CXUnsavedFile |])   ]  clangCtx :: C.Context
src/Language/C/Clang/Internal/FFI.hsc view
@@ -18,11 +18,12 @@  module Language.C.Clang.Internal.FFI where +import Data.Bits import Data.ByteString (ByteString) import qualified Data.ByteString as BS+import qualified Data.ByteString.Unsafe as BS import Control.Exception import Control.Monad-import Data.Foldable import Data.Functor.Contravariant import Data.IORef import qualified Data.Vector.Storable as VS@@ -48,8 +49,15 @@   clang_disposeIndex :: Ptr CXIndexImpl -> Finalizer  createIndex :: IO ClangIndex-createIndex = do-  idxp <- [C.exp| CXIndex { clang_createIndex(0, 1) } |]+createIndex = createIndexWithOptions [ DisplayDiagnostics ]++createIndexWithOptions :: [ ClangIndexOption ] -> IO ClangIndex+createIndexWithOptions opts = do+  let excludeDecl = fromBool $ ExcludeDeclarationsFromPCH `elem` opts+      displayDiag = fromBool $ DisplayDiagnostics `elem` opts+  idxp <- [C.exp| CXIndex {+    clang_createIndex($(int excludeDecl), $(int displayDiag))+    } |]   ClangIndex <$> newRoot idxp (clang_disposeIndex idxp)  foreign import ccall "clang_disposeTranslationUnit"@@ -74,27 +82,70 @@  instance Exception ClangError +withCXUnsavedFile :: UnsavedFile -> (CXUnsavedFile -> IO a) -> IO a+withCXUnsavedFile ( path, contents ) f =+  withCString path $ \cPath ->+    BS.unsafeUseAsCStringLen contents $ \( cContents, cLength ) ->+      f $ CXUnsavedFile cPath cContents (fromIntegral cLength)++instance Storable CXUnsavedFile where+  sizeOf _ = #size struct CXUnsavedFile++  alignment _ = #alignment struct CXUnsavedFile++  peek ptr = do+    cFileName <- (#peek struct CXUnsavedFile, Filename) ptr+    cContents <- (#peek struct CXUnsavedFile, Contents) ptr+    cLength <- (#peek struct CXUnsavedFile, Length) ptr+    return $ CXUnsavedFile cFileName cContents cLength++  poke ptr (CXUnsavedFile cFileName cContents cLength) = do+    (#poke struct CXUnsavedFile, Filename) ptr cFileName+    (#poke struct CXUnsavedFile, Contents) ptr cContents+    (#poke struct CXUnsavedFile, Length) ptr cLength++toTranslationUnitFlag :: TranslationUnitOption -> CUInt+toTranslationUnitFlag = \case+  DetailedPreprocessingRecord -> #{const CXTranslationUnit_DetailedPreprocessingRecord}+  Incomplete -> #{const CXTranslationUnit_Incomplete}+  PrecompiledPreamble -> #{const CXTranslationUnit_PrecompiledPreamble}+  CacheCompletionResults -> #{const CXTranslationUnit_CacheCompletionResults}+  ForSerialization -> #{const CXTranslationUnit_ForSerialization}+  CXXChainedPCH -> #{const CXTranslationUnit_CXXChainedPCH}+  SkipFunctionBodies -> #{const CXTranslationUnit_SkipFunctionBodies}+  IncludeBriefCommentsInCodeCompletion -> #{const CXTranslationUnit_IncludeBriefCommentsInCodeCompletion}+  CreatePreambleOnFirstParse -> #{const CXTranslationUnit_CreatePreambleOnFirstParse}+ parseTranslationUnit :: ClangIndex -> FilePath -> [ String ] -> IO TranslationUnit-parseTranslationUnit idx path args = do+parseTranslationUnit idx path args = parseTranslationUnitWithOptions idx path args [] []++parseTranslationUnitWithOptions+  :: ClangIndex+  -> FilePath+  -> [ String ]+  -> [ UnsavedFile ]+  -> [ TranslationUnitOption ]+  -> IO TranslationUnit+parseTranslationUnitWithOptions idx path args unsavedFiles opts = do   tun <- newNode idx $ \idxp ->-    withCString path $ \cPath -> do-      ( tup, cres ) <- bracket-        (traverse newCString args)-        (traverse_ free) $-        \cArgList -> do+    withCString path $ \cPath ->+      withMany withCString args $ \cArgList ->+        withMany withCXUnsavedFile unsavedFiles $ \cUnsavedFileList -> do           let cArgs = VS.fromList cArgList-          C.withPtr $ \tupp -> [C.exp| int {+              cUnsavedFiles = VS.fromList cUnsavedFileList+              cFlags = foldr (.|.) 0 (map toTranslationUnitFlag opts)+          ( tup, cres ) <- C.withPtr $ \tupp -> [C.exp| int {             clang_parseTranslationUnit2(               $(CXIndex idxp),-              $(char* cPath),+              $(const char *cPath),               $vec-ptr:(const char * const * cArgs), $vec-len:cArgs,-              NULL, 0,-              0,+              $vec-ptr:(struct CXUnsavedFile *cUnsavedFiles), $vec-len:cUnsavedFiles,+              $(unsigned int cFlags),               $(CXTranslationUnit *tupp))             } |]-      let res = parseClangError cres-      when (res /= Success) $ throwIO res-      return ( tup, clang_disposeTranslationUnit tup )+          let res = parseClangError cres+          when (res /= Success) $ throwIO res+          return ( tup, clang_disposeTranslationUnit tup )   return $ TranslationUnitRef tun  translationUnitCursor :: TranslationUnit -> Cursor
src/Language/C/Clang/Internal/Types.hs view
@@ -21,8 +21,10 @@  module Language.C.Clang.Internal.Types where +import Data.ByteString (ByteString) import Data.Singletons.TH import Foreign+import Foreign.C  import Language.C.Clang.Internal.Refs @@ -32,6 +34,11 @@ newtype ClangIndex = ClangIndex (Root CXIndexImpl)   deriving (Parent, Clang) +data ClangIndexOption+  = ExcludeDeclarationsFromPCH+  | DisplayDiagnostics+    deriving (Eq, Ord, Show)+ instance Eq ClangIndex where (==) = pointerEq  data CXTranslationUnitImpl@@ -40,6 +47,26 @@ type instance ParentOf TranslationUnit = ClangIndex newtype TranslationUnit = TranslationUnitRef (Node ClangIndex CXTranslationUnitImpl)   deriving (Parent, Child, Clang)++data CXUnsavedFile = CXUnsavedFile+  { cxUnsavedFileName :: CString+  , cxUnsavedFileContents :: CString+  , cxUnsavedFileLength :: CULong+  }++type UnsavedFile = ( FilePath, ByteString )++data TranslationUnitOption+  = DetailedPreprocessingRecord+  | Incomplete+  | PrecompiledPreamble+  | CacheCompletionResults+  | ForSerialization+  | CXXChainedPCH+  | SkipFunctionBodies+  | IncludeBriefCommentsInCodeCompletion+  | CreatePreambleOnFirstParse+    deriving (Eq, Ord, Show)  instance Eq TranslationUnit where (==) = pointerEq 
src/Language/C/Clang/TranslationUnit.hs view
@@ -16,7 +16,10 @@  module Language.C.Clang.TranslationUnit   ( TranslationUnit()+  , TranslationUnitOption(..)+  , UnsavedFile   , parseTranslationUnit+  , parseTranslationUnitWithOptions   ) where