LibClang 0.0.8 → 0.0.9
raw patch · 9 files changed
+88/−67 lines, 9 filesdep +time
Dependencies added: time
Files
- LibClang.cabal +2/−2
- src/Clang/Cursor.hs +0/−2
- src/Clang/FFI.gc +57/−37
- src/Clang/FFI_stub_ffi.c +0/−6
- src/Clang/File.hs +8/−4
- src/Clang/TranslationUnit.hs +3/−0
- src/Clang/Traversal.hs +2/−0
- test/Test_ChildVisitor.hs +5/−7
- test/Test_InclusionVisitor.hs +11/−9
LibClang.cabal view
@@ -1,6 +1,6 @@ Name: LibClang Cabal-version: >= 1.6-Version: 0.0.8+Version: 0.0.9 Author: Chetan Taralekar <chetant@gmail.com> Maintainer: Chetan Taralekar <chetant@gmail.com> Homepage: https://github.com/chetant/LibClang/issues@@ -32,7 +32,7 @@ location: git://github.com/chetant/LibClang.git Library- build-depends: base < 5, ffi, greencard+ build-depends: base < 5, time, ffi, greencard extensions: TypeSynonymInstances, EmptyDataDecls hs-source-dirs: src c-sources: src/Clang/FFI_stub_ffi.c
src/Clang/Cursor.hs view
@@ -32,7 +32,6 @@ ,getCanonicalCursor ,getTemplateKind ,getSpecializedTemplate-,getTranslationUnitCursor -- attribute function ,getIBOutletCollectionType@@ -93,7 +92,6 @@ getCanonicalCursor = unsafePerformIO . FFI.getCanonicalCursor getTemplateKind = unsafePerformIO . FFI.getTemplateCursorKind getSpecializedTemplate = unsafePerformIO . FFI.getSpecializedCursorTemplate-getTranslationUnitCursor = unsafePerformIO . FFI.getTranslationUnitCursor -- attribute function getIBOutletCollectionType = unsafePerformIO . FFI.getIBOutletCollectionType
src/Clang/FFI.gc view
@@ -173,6 +173,8 @@ import Foreign.ForeignPtr import Foreign.Ptr import System.IO.Unsafe(unsafePerformIO)+import Data.Maybe(fromJust)+import Control.Monad(when) %#include <inttypes.h> %#include <stdlib.h>@@ -222,7 +224,7 @@ -- }; data UnsavedFile = UnsavedFile { unsavedFilename :: FilePath, unsavedContents :: String } -%enum AvailabilityKind Int [CXAvailability_Available, CXAvailability_Deprecated, CXAvailability_NotAvailable]+%enum AvailabilityKind (Eq) Int [CXAvailability_Available, CXAvailability_Deprecated, CXAvailability_NotAvailable] -- enum CXAvailabilityKind { -- CXAvailability_Available, -- CXAvailability_Deprecated,@@ -264,7 +266,9 @@ %result (cxString (ptr r)) -- time_t clang_getFileTime(CXFile SFile);-%fun clang_getFileTime :: File -> IO Word32+-- %fun clang_getFileTime :: File -> IO CTime+getFileTime (File ptr) = clang_getFileTime ptr+foreign import ccall unsafe "clang-c/Index.h clang_getFileTime" clang_getFileTime :: Ptr () -> IO CTime -- CXFile clang_getFile(CXTranslationUnit tu, const char *file_name); %fun clang_getFile :: TranslationUnit -> String -> IO File@@ -388,7 +392,7 @@ -- CXDiagnostic_Error = 3, -- CXDiagnostic_Fatal = 4 -- };-%enum DiagnosticSeverity Int [CXDiagnostic_Ignored, CXDiagnostic_Note, CXDiagnostic_Warning, CXDiagnostic_Error, CXDiagnostic_Fatal]+%enum DiagnosticSeverity (Eq) Int [CXDiagnostic_Ignored, CXDiagnostic_Note, CXDiagnostic_Warning, CXDiagnostic_Error, CXDiagnostic_Fatal] -- typedef void *CXDiagnostic; data DiagnosticObj@@ -423,7 +427,7 @@ -- CXDiagnostic_DisplayCategoryId = 0x10, -- CXDiagnostic_DisplayCategoryName = 0x20 -- };-%enum DiagnosticDisplayOptions Int [CXDiagnostic_DisplaySourceLocation,CXDiagnostic_DisplayColumn,CXDiagnostic_DisplaySourceRanges, CXDiagnostic_DisplayOption, CXDiagnostic_DisplayCategoryId,CXDiagnostic_DisplayCategoryName]+%enum DiagnosticDisplayOptions (Eq) Int [CXDiagnostic_DisplaySourceLocation,CXDiagnostic_DisplayColumn,CXDiagnostic_DisplaySourceRanges, CXDiagnostic_DisplayOption, CXDiagnostic_DisplayCategoryId,CXDiagnostic_DisplayCategoryName] getDiagnosticDispOptSum :: [DiagnosticDisplayOptions] -> Int getDiagnosticDispOptSum = sum . (map toVal_)@@ -533,7 +537,7 @@ -- CXTranslationUnit_CXXPrecompiledPreamble = 0x10, -- CXTranslationUnit_CXXChainedPCH = 0x20 -- };-%enum TranslationUnitFlags Int [CXTranslationUnit_None, CXTranslationUnit_DetailedPreprocessingRecord, CXTranslationUnit_Incomplete, CXTranslationUnit_PrecompiledPreamble, CXTranslationUnit_CacheCompletionResults, CXTranslationUnit_CXXPrecompiledPreamble, CXTranslationUnit_CXXChainedPCH]+%enum TranslationUnitFlags (Eq) Int [CXTranslationUnit_None, CXTranslationUnit_DetailedPreprocessingRecord, CXTranslationUnit_Incomplete, CXTranslationUnit_PrecompiledPreamble, CXTranslationUnit_CacheCompletionResults, CXTranslationUnit_CXXPrecompiledPreamble, CXTranslationUnit_CXXChainedPCH] getTranslationUnitFlagsSum :: [TranslationUnitFlags] -> Int getTranslationUnitFlagsSum = sum . (map toVal_)@@ -599,7 +603,7 @@ -- enum CXSaveTranslationUnit_Flags { -- CXSaveTranslationUnit_None = 0x0 -- };-%enum SaveTranslationUnitFlags Int [CXSaveTranslationUnit_None]+%enum SaveTranslationUnitFlags (Eq) Int [CXSaveTranslationUnit_None] getSaveTranslationUnitFlagsSum :: [SaveTranslationUnitFlags] -> Int getSaveTranslationUnitFlagsSum = sum . (map toVal_)@@ -622,7 +626,7 @@ -- enum CXReparse_Flags { -- CXReparse_None = 0x0 -- };-%enum ReparseFlags Int [CXReparse_None]+%enum ReparseFlags (Eq) Int [CXReparse_None] getReparseFlagsSum :: [ReparseFlags] -> Int getReparseFlagsSum = sum . (map toVal_)@@ -731,7 +735,7 @@ -- CXCursor_FirstPreprocessing = CXCursor_PreprocessingDirective, -- CXCursor_LastPreprocessing = CXCursor_InclusionDirective -- };-%enum CursorKind Int [CXCursor_UnexposedDecl,CXCursor_StructDecl,CXCursor_UnionDecl,CXCursor_ClassDecl,CXCursor_EnumDecl,CXCursor_FieldDecl,CXCursor_EnumConstantDecl,CXCursor_FunctionDecl,CXCursor_VarDecl,CXCursor_ParmDecl,CXCursor_ObjCInterfaceDecl,CXCursor_ObjCCategoryDecl,CXCursor_ObjCProtocolDecl,CXCursor_ObjCPropertyDecl,CXCursor_ObjCIvarDecl,CXCursor_ObjCInstanceMethodDecl,CXCursor_ObjCClassMethodDecl,CXCursor_ObjCImplementationDecl,CXCursor_ObjCCategoryImplDecl,CXCursor_TypedefDecl,CXCursor_CXXMethod,CXCursor_Namespace,CXCursor_LinkageSpec,CXCursor_Constructor,CXCursor_Destructor,CXCursor_ConversionFunction,CXCursor_TemplateTypeParameter,CXCursor_NonTypeTemplateParameter,CXCursor_TemplateTemplateParameter,CXCursor_FunctionTemplate,CXCursor_ClassTemplate,CXCursor_ClassTemplatePartialSpecialization,CXCursor_NamespaceAlias,CXCursor_UsingDirective,CXCursor_UsingDeclaration,CXCursor_FirstDecl,CXCursor_LastDecl,CXCursor_FirstRef,CXCursor_ObjCSuperClassRef,CXCursor_ObjCProtocolRef,CXCursor_ObjCClassRef,CXCursor_TypeRef,CXCursor_CXXBaseSpecifier,CXCursor_TemplateRef,CXCursor_NamespaceRef,CXCursor_MemberRef,CXCursor_LabelRef, CXCursor_OverloadedDeclRef, CXCursor_LastRef,CXCursor_FirstInvalid,CXCursor_InvalidFile,CXCursor_NoDeclFound,CXCursor_NotImplemented,CXCursor_InvalidCode,CXCursor_LastInvalid,CXCursor_FirstExpr,CXCursor_UnexposedExpr,CXCursor_DeclRefExpr,CXCursor_MemberRefExpr,CXCursor_CallExpr,CXCursor_ObjCMessageExpr,CXCursor_BlockExpr,CXCursor_LastExpr,CXCursor_FirstStmt,CXCursor_UnexposedStmt, CXCursor_LabelStmt, CXCursor_LastStmt,CXCursor_TranslationUnit,CXCursor_FirstAttr,CXCursor_UnexposedAttr,CXCursor_IBActionAttr,CXCursor_IBOutletAttr,CXCursor_IBOutletCollectionAttr,CXCursor_LastAttr, CXCursor_PreprocessingDirective,CXCursor_MacroDefinition,CXCursor_MacroInstantiation,CXCursor_InclusionDirective,CXCursor_FirstPreprocessing,CXCursor_LastPreprocessing]+%enum CursorKind (Eq) Int [CXCursor_UnexposedDecl,CXCursor_StructDecl,CXCursor_UnionDecl,CXCursor_ClassDecl,CXCursor_EnumDecl,CXCursor_FieldDecl,CXCursor_EnumConstantDecl,CXCursor_FunctionDecl,CXCursor_VarDecl,CXCursor_ParmDecl,CXCursor_ObjCInterfaceDecl,CXCursor_ObjCCategoryDecl,CXCursor_ObjCProtocolDecl,CXCursor_ObjCPropertyDecl,CXCursor_ObjCIvarDecl,CXCursor_ObjCInstanceMethodDecl,CXCursor_ObjCClassMethodDecl,CXCursor_ObjCImplementationDecl,CXCursor_ObjCCategoryImplDecl,CXCursor_TypedefDecl,CXCursor_CXXMethod,CXCursor_Namespace,CXCursor_LinkageSpec,CXCursor_Constructor,CXCursor_Destructor,CXCursor_ConversionFunction,CXCursor_TemplateTypeParameter,CXCursor_NonTypeTemplateParameter,CXCursor_TemplateTemplateParameter,CXCursor_FunctionTemplate,CXCursor_ClassTemplate,CXCursor_ClassTemplatePartialSpecialization,CXCursor_NamespaceAlias,CXCursor_UsingDirective,CXCursor_UsingDeclaration,CXCursor_FirstDecl,CXCursor_LastDecl,CXCursor_FirstRef,CXCursor_ObjCSuperClassRef,CXCursor_ObjCProtocolRef,CXCursor_ObjCClassRef,CXCursor_TypeRef,CXCursor_CXXBaseSpecifier,CXCursor_TemplateRef,CXCursor_NamespaceRef,CXCursor_MemberRef,CXCursor_LabelRef, CXCursor_OverloadedDeclRef, CXCursor_LastRef,CXCursor_FirstInvalid,CXCursor_InvalidFile,CXCursor_NoDeclFound,CXCursor_NotImplemented,CXCursor_InvalidCode,CXCursor_LastInvalid,CXCursor_FirstExpr,CXCursor_UnexposedExpr,CXCursor_DeclRefExpr,CXCursor_MemberRefExpr,CXCursor_CallExpr,CXCursor_ObjCMessageExpr,CXCursor_BlockExpr,CXCursor_LastExpr,CXCursor_FirstStmt,CXCursor_UnexposedStmt, CXCursor_LabelStmt, CXCursor_LastStmt,CXCursor_TranslationUnit,CXCursor_FirstAttr,CXCursor_UnexposedAttr,CXCursor_IBActionAttr,CXCursor_IBOutletAttr,CXCursor_IBOutletCollectionAttr,CXCursor_LastAttr, CXCursor_PreprocessingDirective,CXCursor_MacroDefinition,CXCursor_MacroInstantiation,CXCursor_InclusionDirective,CXCursor_FirstPreprocessing,CXCursor_LastPreprocessing] -- typedef struct { -- enum CXCursorKind kind;@@ -797,7 +801,7 @@ -- CXLinkage_UniqueExternal, -- CXLinkage_External -- };-%enum LinkageKind Int [CXLinkage_Invalid,CXLinkage_NoLinkage,CXLinkage_Internal,CXLinkage_UniqueExternal,CXLinkage_External]+%enum LinkageKind (Eq) Int [CXLinkage_Invalid,CXLinkage_NoLinkage,CXLinkage_Internal,CXLinkage_UniqueExternal,CXLinkage_External] -- enum CXLinkageKind clang_getCursorLinkage(CXCursor cursor); %fun clang_getCursorLinkage :: Cursor -> IO LinkageKind@@ -819,7 +823,7 @@ -- CXLanguage_ObjC, -- CXLanguage_CPlusPlus -- };-%enum LanguageKind Int [CXLanguage_Invalid,CXLanguage_C,CXLanguage_ObjC,CXLanguage_CPlusPlus]+%enum LanguageKind (Eq) Int [CXLanguage_Invalid,CXLanguage_C,CXLanguage_ObjC,CXLanguage_CPlusPlus] -- enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor); %fun clang_getCursorLanguage :: Cursor -> IO LanguageKind@@ -977,7 +981,7 @@ -- CXType_FunctionProto = 111 -- }; -%enum TypeKind Int [CXType_Invalid,CXType_Unexposed,CXType_Void,CXType_Bool,CXType_Char_U,CXType_UChar,CXType_Char16,CXType_Char32,CXType_UShort,CXType_UInt,CXType_ULong,CXType_ULongLong,CXType_UInt128,CXType_Char_S,CXType_SChar,CXType_WChar,CXType_Short,CXType_Int,CXType_Long,CXType_LongLong,CXType_Int128,CXType_Float,CXType_Double,CXType_LongDouble,CXType_NullPtr,CXType_Overload,CXType_Dependent,CXType_ObjCId,CXType_ObjCClass,CXType_ObjCSel,CXType_FirstBuiltin,CXType_LastBuiltin,CXType_Complex,CXType_Pointer,CXType_BlockPointer,CXType_LValueReference,CXType_RValueReference,CXType_Record,CXType_Enum,CXType_Typedef,CXType_ObjCInterface,CXType_ObjCObjectPointer,CXType_FunctionNoProto,CXType_FunctionProto]+%enum TypeKind (Eq) Int [CXType_Invalid,CXType_Unexposed,CXType_Void,CXType_Bool,CXType_Char_U,CXType_UChar,CXType_Char16,CXType_Char32,CXType_UShort,CXType_UInt,CXType_ULong,CXType_ULongLong,CXType_UInt128,CXType_Char_S,CXType_SChar,CXType_WChar,CXType_Short,CXType_Int,CXType_Long,CXType_LongLong,CXType_Int128,CXType_Float,CXType_Double,CXType_LongDouble,CXType_NullPtr,CXType_Overload,CXType_Dependent,CXType_ObjCId,CXType_ObjCClass,CXType_ObjCSel,CXType_FirstBuiltin,CXType_LastBuiltin,CXType_Complex,CXType_Pointer,CXType_BlockPointer,CXType_LValueReference,CXType_RValueReference,CXType_Record,CXType_Enum,CXType_Typedef,CXType_ObjCInterface,CXType_ObjCObjectPointer,CXType_FunctionNoProto,CXType_FunctionProto] -- typedef struct { -- enum CXTypeKind kind;@@ -1092,7 +1096,7 @@ -- CX_CXXProtected, -- CX_CXXPrivate -- };-%enum CXXAccessSpecifier Int [CX_CXXInvalidAccessSpecifier, CX_CXXPublic, CX_CXXProtected, CX_CXXPrivate]+%enum CXXAccessSpecifier (Eq) Int [CX_CXXInvalidAccessSpecifier, CX_CXXPublic, CX_CXXProtected, CX_CXXPrivate] -- enum CX_CXXAccessSpecifier clang_getCXXAccessSpecifier(CXCursor); %fun clang_getCXXAccessSpecifier :: Cursor -> IO CXXAccessSpecifier@@ -1128,7 +1132,7 @@ -- CXChildVisit_Continue, -- CXChildVisit_Recurse -- };-%enum ChildVisitResult Int [CXChildVisit_Break, CXChildVisit_Continue, CXChildVisit_Recurse]+%enum ChildVisitResult (Eq) Int [CXChildVisit_Break, CXChildVisit_Continue, CXChildVisit_Recurse] -- TODO: test me -- typedef enum CXChildVisitResult (*CXCursorVisitor)(CXCursor cursor,@@ -1136,27 +1140,36 @@ -- CXClientData client_data); type ChildVisitorRaw = Int -> Ptr () -> Ptr () -> Ptr () -> Int -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> IO Int-type ChildVisitor = Cursor -- ^ Current cursor- -> Cursor -- ^ Parent cursor- -> Ptr () -- ^ User data- -> IO ChildVisitResult -- ^ Visitor result code indicating direction of visit+type ChildVisitor a = Cursor -- ^ Current cursor+ -> Cursor -- ^ Parent cursor+ -> Maybe a -- ^ User data+ -> IO (Maybe a, ChildVisitResult) -- ^ (user data to pass on, Visitor result code) foreign import ccall "wrapper" wrapChildVisitorRaw :: ChildVisitorRaw -> IO (FunPtr ChildVisitorRaw)-wrapChildVisitor :: ChildVisitor -> ChildVisitorRaw+wrapChildVisitor :: (Storable a) => ChildVisitor a -> ChildVisitorRaw wrapChildVisitor f = \ck cp1 cp2 cp3- pk pp1 pp2 pp3 pd -> marshall_ChildVisitResult <$> - f (Cursor (unmarshall_CursorKind ck) cp1 cp2 cp3)- (Cursor (unmarshall_CursorKind pk) pp1 pp2 pp3)- pd+ pk pp1 pp2 pp3 pd -> do+ let child = Cursor (unmarshall_CursorKind ck) cp1 cp2 cp3+ parent = Cursor (unmarshall_CursorKind pk) pp1 pp2 pp3+ dataPtr = castPtr pd+ (rData, vRes) <- if dataPtr == nullPtr+ then f child parent Nothing+ else peek dataPtr >>= \d -> f child parent (Just d)+ maybe (return ()) (poke dataPtr) rData+ return (marshall_ChildVisitResult vRes) -- unsigned clang_visitChildren(CXCursor parent, -- CXCursorVisitor visitor, -- CXClientData client_data);-visitChildren :: Cursor -> ChildVisitor -> Ptr () -> IO Int-visitChildren (Cursor k p1 p2 p3) f pd = do+visitChildren :: (Storable a) => Cursor -> ChildVisitor a -> Maybe a -> IO (Maybe a, Bool)+visitChildren (Cursor k p1 p2 p3) f d = do fp <- wrapChildVisitorRaw (wrapChildVisitor f)- retVal <- fromIntegral <$> prim_visitChildren_ (marshall_CursorKind k) p1 p2 p3 pd fp+ pd <- maybe (return nullPtr) (\x -> malloc >>= \p -> poke p x >> return p) d+ retVal <- fromIntegral <$> prim_visitChildren_ (marshall_CursorKind k) p1 p2 p3 (castPtr pd) fp+ rData <- if pd == nullPtr+ then return Nothing+ else peek pd >>= \d -> free pd >> return (Just d) freeHaskellFunPtr fp- return retVal+ return (rData, retVal == 0) %C typedef enum CXChildVisitResult (*HSCursorVisitor) % (HsInt ck,HsPtr cp1, HsPtr cp2,HsPtr cp3,@@ -1312,7 +1325,7 @@ -- CXToken_Literal, -- CXToken_Comment -- } CXTokenKind;-%enum TokenKind Int [CXToken_Punctuation, CXToken_Keyword, CXToken_Identifier, CXToken_Literal, CXToken_Comment]+%enum TokenKind (Eq) Int [CXToken_Punctuation, CXToken_Keyword, CXToken_Identifier, CXToken_Literal, CXToken_Comment] -- typedef struct { -- unsigned int_data[4];@@ -1481,7 +1494,7 @@ -- CXCompletionChunk_HorizontalSpace, -- CXCompletionChunk_VerticalSpace -- };-%enum CompletionChunkKind Int [CXCompletionChunk_Optional,CXCompletionChunk_TypedText,CXCompletionChunk_Text,CXCompletionChunk_Placeholder,CXCompletionChunk_Informative,CXCompletionChunk_CurrentParameter,CXCompletionChunk_LeftParen,CXCompletionChunk_RightParen,CXCompletionChunk_LeftBracket,CXCompletionChunk_RightBracket,CXCompletionChunk_LeftBrace,CXCompletionChunk_RightBrace,CXCompletionChunk_LeftAngle,CXCompletionChunk_RightAngle,CXCompletionChunk_Comma,CXCompletionChunk_ResultType,CXCompletionChunk_Colon,CXCompletionChunk_SemiColon,CXCompletionChunk_Equal,CXCompletionChunk_HorizontalSpace,CXCompletionChunk_VerticalSpace]+%enum CompletionChunkKind (Eq) Int [CXCompletionChunk_Optional,CXCompletionChunk_TypedText,CXCompletionChunk_Text,CXCompletionChunk_Placeholder,CXCompletionChunk_Informative,CXCompletionChunk_CurrentParameter,CXCompletionChunk_LeftParen,CXCompletionChunk_RightParen,CXCompletionChunk_LeftBracket,CXCompletionChunk_RightBracket,CXCompletionChunk_LeftBrace,CXCompletionChunk_RightBrace,CXCompletionChunk_LeftAngle,CXCompletionChunk_RightAngle,CXCompletionChunk_Comma,CXCompletionChunk_ResultType,CXCompletionChunk_Colon,CXCompletionChunk_SemiColon,CXCompletionChunk_Equal,CXCompletionChunk_HorizontalSpace,CXCompletionChunk_VerticalSpace] -- enum CXCompletionChunkKind -- clang_getCompletionChunkKind(CXCompletionString completion_string,@@ -1517,7 +1530,7 @@ -- CXCodeComplete_IncludeMacros = 0x01, -- CXCodeComplete_IncludeCodePatterns = 0x02 -- };-%enum CodeCompleteFlags Int [CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatterns]+%enum CodeCompleteFlags (Eq) Int [CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatterns] getCodeCompleteFlagsSum :: [CodeCompleteFlags] -> Int getCodeCompleteFlagsSum = sum . (map toVal_)@@ -1588,26 +1601,33 @@ -- CXClientData client_data); type InclusionVisitorRaw = File -> Ptr () -> CUInt -> Ptr () -> IO ()-type InclusionVisitor = File -> [SourceLocation] -> Ptr () -> IO ()+type InclusionVisitor a = File -> [SourceLocation] -> Maybe a -> IO (Maybe a) -- %fun clang_getInclusions :: TranslationUnit -> InclusionVisitor -> Ptr () -> IO () -- %call (ptr t) (inclusionVisitor (ptr f)) (ptr p) -- %code clang_getInclusions(t, f, p); -getInclusions :: TranslationUnit -> InclusionVisitor -> Ptr () -> IO ()-getInclusions t iv p =- (marshall_inclusionVisitor iv) >>= \ (f) ->- prim_getInclusions_ t f p >> freeHaskellFunPtr f+getInclusions :: (Storable a) => TranslationUnit -> InclusionVisitor a -> Maybe a -> IO ()+getInclusions t iv d = do+ f <- marshall_inclusionVisitor iv+ p <- maybe (return nullPtr) (\x -> malloc >>= \p -> poke p x >> return p) d+ prim_getInclusions_ t f (castPtr p)+ when (p /= nullPtr) $ free p+ freeHaskellFunPtr f %C void prim_getInclusions_(HsPtr t,HsPtr f,HsPtr p){ do { clang_getInclusions(t, f, p);} while(0);} foreign import ccall safe "FFI_stub_ffi.h prim_getInclusions_" prim_getInclusions_ :: Ptr a1 -> FunPtr InclusionVisitorRaw -> Ptr a3 -> IO () foreign import ccall "wrapper" wrapInclusionVisitorRaw :: InclusionVisitorRaw -> IO (FunPtr InclusionVisitorRaw) -wrapInclusionVisitor :: InclusionVisitor -> InclusionVisitorRaw+wrapInclusionVisitor :: (Storable a) => InclusionVisitor a -> InclusionVisitorRaw wrapInclusionVisitor f = \file pSrcLoc nSrcLoc pData -> do srcLocs <- unmarshall_SrcLocList pSrcLoc nSrcLoc- f file srcLocs pData+ let dataPtr = castPtr pData+ rdat <- if dataPtr == nullPtr+ then f file srcLocs Nothing+ else peek dataPtr >>= \dat -> f file srcLocs (Just dat)+ maybe (return ()) (poke dataPtr) rdat -marshall_inclusionVisitor :: InclusionVisitor -> IO (FunPtr InclusionVisitorRaw)+marshall_inclusionVisitor :: (Storable a) => InclusionVisitor a -> IO (FunPtr InclusionVisitorRaw) marshall_inclusionVisitor f = wrapInclusionVisitorRaw (wrapInclusionVisitor f)
src/Clang/FFI_stub_ffi.c view
@@ -40,12 +40,6 @@ return((HsPtr)(r));} while(0); }-HsWord32 prim_getFileTime(HsPtr arg1)-{ HsWord32 res1;- do {res1 = clang_getFileTime(arg1);- - return((HsWord32)(res1));} while(0);-} HsPtr prim_getFile(HsPtr t,char * s) { HsPtr r; do { CXFile r = clang_getFile(t, s);
src/Clang/File.hs view
@@ -2,15 +2,19 @@ ( FFI.UnsavedFile ,FFI.File-,+,getName+,getTime+,getFile ) where import Control.Monad((>=>))+import Control.Applicative((<$>))+import Data.Time.Clock.POSIX(POSIXTime, posixSecondsToUTCTime) import System.IO.Unsafe(unsafePerformIO) import qualified Clang.FFI as FFI -getFileName :: FFI.File -> FilePath-getFileName = unsafePerformIO . (FFI.getFileName >=> FFI.getCString)-getFileTime = unsafePerformIO . FFI.getFileTime+getName :: FFI.File -> FilePath+getName = unsafePerformIO . (FFI.getFileName >=> FFI.getCString)+getTime f = unsafePerformIO $ posixSecondsToUTCTime . realToFrac <$> FFI.getFileTime f getFile :: FFI.TranslationUnit -> FilePath -> FFI.File getFile t f = unsafePerformIO $ FFI.getFile t f
src/Clang/TranslationUnit.hs view
@@ -12,6 +12,7 @@ ,save ,defaultReparseOptions ,reparse+,getCursor ) where import System.IO.Unsafe(unsafePerformIO)@@ -63,6 +64,8 @@ -> [FFI.ReparseFlags] -- ^ reparse options -> IO Bool reparse t ufs opts = FFI.reparseTranslationUnit t ufs (FFI.getReparseFlagsSum opts)++getCursor = unsafePerformIO . FFI.getTranslationUnitCursor -- index functions withCreateIndex i1 i2 f = flip withForeignPtr f =<< FFI.createIndex i1 i2
src/Clang/Traversal.hs view
@@ -4,6 +4,8 @@ ,FFI.ChildVisitor ,FFI.ChildVisitResult(..) ,FFI.visitChildren+,FFI.InclusionVisitor+,FFI.getInclusions ) where import qualified Clang.FFI as FFI
test/Test_ChildVisitor.hs view
@@ -2,21 +2,19 @@ import Data.Maybe(maybe) import Control.Monad((<=<)) import Control.Applicative((<$>))-import Clang.TranslationUnit(withCreateIndex, withParse, TranslationUnitFlags(..))-import Clang.Traversal(visitChildren, ChildVisitResult(..))-import Clang.Cursor(getTranslationUnitCursor)-import Clang.Traversal(ChildVisitor, ChildVisitResult(..))+import Clang.TranslationUnit(withCreateIndex, withParse, TranslationUnitFlags(..), getCursor)+import Clang.Traversal(ChildVisitor, visitChildren, ChildVisitResult(..)) import qualified Clang.FFI as FFI import Foreign.Ptr(nullPtr) -visitor :: ChildVisitor+visitor :: ChildVisitor Int visitor c p d = do tk <- FFI.getTypeKind <$> FFI.getCursorType c str <- (FFI.getCString <=< FFI.getTypeKindSpelling) tk putStrLn $ "Type:" ++ str- return ChildVisit_Continue+ return (d, ChildVisit_Continue) -test tu = visitChildren (getTranslationUnitCursor tu) visitor nullPtr+test tu = visitChildren (getCursor tu) visitor Nothing main = do (arg:args) <- getArgs
test/Test_InclusionVisitor.hs view
@@ -1,18 +1,20 @@ import System(getArgs) import Control.Monad(when) import Data.Maybe(fromJust, isNothing)-import qualified Clang.FFI as FFI-import qualified Clang.TranslationUnit as Clang+import Clang.TranslationUnit(withCreateIndex, withParse, TranslationUnitFlags(..)) import qualified Clang.Source as Clang-import Foreign.Ptr(nullPtr)+import Clang.Traversal+import Clang.File(getFileName) -printInclusions f sls p = do- name <- FFI.getFileName f- putStrLn $ "Included:" ++ show name+printInclusions :: InclusionVisitor Int+printInclusions f sls d = do+ let name = getFileName f+ putStrLn $ "Included:" ++ name+ return d -test tu = FFI.getInclusions tu printInclusions nullPtr+test tu = getInclusions tu printInclusions Nothing main = do (arg:args) <- getArgs- Clang.withCreateIndex False False $ \index -> - Clang.withParse index (Just arg) args [] [Clang.TranslationUnit_None] test (error "No TXUnit!")+ withCreateIndex False False $ \index -> + withParse index (Just arg) args [] [TranslationUnit_None] test (error "No TXUnit!")