LibClang 0.0.6 → 0.0.7
raw patch · 9 files changed
+282/−239 lines, 9 files
Files
- LibClang.cabal +2/−3
- configure +188/−187
- src/Clang/Cursor.hs +3/−1
- src/Clang/FFI.gc +34/−32
- src/Clang/File.hs +16/−0
- src/Clang/Token.hs +1/−1
- src/Clang/TranslationUnit.hs +20/−15
- src/Clang/Traversal.hs +14/−0
- src/Clang/Type.hs +4/−0
LibClang.cabal view
@@ -1,6 +1,6 @@ Name: LibClang Cabal-version: >= 1.6-Version: 0.0.6+Version: 0.0.7 Author: Chetan Taralekar <chetant@gmail.com> Maintainer: Chetan Taralekar <chetant@gmail.com> Homepage: https://github.com/chetant/LibClang/issues@@ -33,9 +33,8 @@ Library build-depends: base < 5, ffi, greencard- build-tools: greencard extensions: TypeSynonymInstances, EmptyDataDecls hs-source-dirs: src c-sources: src/Clang/FFI_stub_ffi.c exposed-modules:- Clang,Clang.FFI,Clang.Type,Clang.Cursor,Clang.CrossReference,Clang.Source,Clang.Diagnostic,Clang.TranslationUnit,Clang.Token,Clang.Debug,Clang.Completion+ Clang,Clang.FFI,Clang.Type,Clang.Cursor,Clang.CrossReference,Clang.Source,Clang.Diagnostic,Clang.TranslationUnit,Clang.Token,Clang.Debug,Clang.Completion,Clang.File,Clang.Traversal
configure view
@@ -1405,94 +1405,6 @@ } # ac_fn_c_try_compile -# ac_fn_c_try_link LINENO-# ------------------------# Try to link conftest.$ac_ext, and return whether this succeeded.-ac_fn_c_try_link ()-{- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack- rm -f conftest.$ac_objext conftest$ac_exeext- if { { ac_try="$ac_link"-case "(($ac_try" in- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;- *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5- (eval "$ac_link") 2>conftest.err- ac_status=$?- if test -s conftest.err; then- grep -v '^ *+' conftest.err >conftest.er1- cat conftest.er1 >&5- mv -f conftest.er1 conftest.err- fi- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5- test $ac_status = 0; } && {- test -z "$ac_c_werror_flag" ||- test ! -s conftest.err- } && test -s conftest$ac_exeext && {- test "$cross_compiling" = yes ||- $as_test_x conftest$ac_exeext- }; then :- ac_retval=0-else- $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5-- ac_retval=1-fi- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would- # interfere with the next link command; also delete a directory that is- # left behind by Apple's compiler. We do this before executing the actions.- rm -rf conftest.dSYM conftest_ipa8_conftest.oo- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}- as_fn_set_status $ac_retval--} # ac_fn_c_try_link--# ac_fn_c_try_run LINENO-# -----------------------# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes-# that executables *can* be run.-ac_fn_c_try_run ()-{- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack- if { { ac_try="$ac_link"-case "(($ac_try" in- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;- *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5- (eval "$ac_link") 2>&5- ac_status=$?- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'- { { case "(($ac_try" in- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;- *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5- (eval "$ac_try") 2>&5- ac_status=$?- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5- test $ac_status = 0; }; }; then :- ac_retval=0-else- $as_echo "$as_me: program exited with status $ac_status" >&5- $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5-- ac_retval=$ac_status-fi- rm -rf conftest.dSYM conftest_ipa8_conftest.oo- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}- as_fn_set_status $ac_retval--} # ac_fn_c_try_run- # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded.@@ -1617,6 +1529,48 @@ } # ac_fn_c_check_header_mongrel +# ac_fn_c_try_run LINENO+# ----------------------+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes+# that executables *can* be run.+ac_fn_c_try_run ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ if { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'+ { { case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_try") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; }; then :+ ac_retval=0+else+ $as_echo "$as_me: program exited with status $ac_status" >&5+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=$ac_status+fi+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}+ as_fn_set_status $ac_retval++} # ac_fn_c_try_run+ # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in@@ -1647,6 +1601,52 @@ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile++# ac_fn_c_try_link LINENO+# -----------------------+# Try to link conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_link ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ rm -f conftest.$ac_objext conftest$ac_exeext+ if { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>conftest.err+ ac_status=$?+ if test -s conftest.err; then+ grep -v '^ *+' conftest.err >conftest.er1+ cat conftest.er1 >&5+ mv -f conftest.er1 conftest.err+ fi+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } && {+ test -z "$ac_c_werror_flag" ||+ test ! -s conftest.err+ } && test -s conftest$ac_exeext && {+ test "$cross_compiling" = yes ||+ $as_test_x conftest$ac_exeext+ }; then :+ ac_retval=0+else+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=1+fi+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would+ # interfere with the next link command; also delete a directory that is+ # left behind by Apple's compiler. We do this before executing the actions.+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}+ as_fn_set_status $ac_retval++} # ac_fn_c_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake.@@ -2068,14 +2068,7 @@ fi fi -# Check whether --enable-llvm-shared was given.-if test "${enable_llvm_shared+set}" = set; then :- enableval=$enable_llvm_shared; llvm_shared=$enableval-fi--if test "$llvm_shared" != ""-then- ac_ext=c+ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'@@ -2866,96 +2859,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -as_ac_Lib=`$as_echo "ac_cv_lib_${llvm_shared}''_LLVMContextCreate" | $as_tr_sh`-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LLVMContextCreate in -l${llvm_shared}" >&5-$as_echo_n "checking for LLVMContextCreate in -l${llvm_shared}... " >&6; }-if eval "test \"\${$as_ac_Lib+set}\"" = set; then :- $as_echo_n "(cached) " >&6-else- ac_check_lib_save_LIBS=$LIBS-LIBS="-l${llvm_shared} $LIBS"-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h. */--/* Override any GCC internal prototype to avoid an error.- Use char because int might match the return type of a GCC- builtin and then its argument prototype would still apply. */-#ifdef __cplusplus-extern "C"-#endif-char LLVMContextCreate ();-int-main ()-{-return LLVMContextCreate ();- ;- return 0;-}-_ACEOF-if ac_fn_c_try_link "$LINENO"; then :- eval "$as_ac_Lib=yes"-else- eval "$as_ac_Lib=no"-fi-rm -f core conftest.err conftest.$ac_objext \- conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-eval ac_res=\$$as_ac_Lib- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :- llvm_shared_lib_found=yes-else- llvm_shared_lib_found=no-fi-- if test "$llvm_shared_lib_found" = no- then- as_fn_error $? "- -------------------------------------------------- llvm shared library ${llvm_shared} not found.- if the library is present, ensure it is available- on the lib search path (export LDFLAGS=...)- -------------------------------------------------" "$LINENO" 5- else- LDFLAGS="$LDFLAGS -l${llvm_shared}"- if test "$cross_compiling" = yes; then :- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "cannot run test program while cross compiling-See \`config.log' for more details" "$LINENO" 5 ; }-else- cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h. */-int main(int argc, int argv[]){LLVMContextCreate();return 0;}-_ACEOF-if ac_fn_c_try_run "$LINENO"; then :- llvm_shared_lib_present=yes-else- llvm_shared_lib_present=no-fi-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \- conftest.$ac_objext conftest.beam conftest.$ac_ext-fi-- if test "$llvm_shared_lib_present" = no- then- as_fn_error $? "- -------------------------------------------------------- specified llvm shared library ${llvm_shared} not found.- if the library is present, ensure it is available- on the lib search path (export LID_LIBRARY_PATH=...)- -------------------------------------------------------" "$LINENO" 5- fi- fi-else- if test "$llvm_config_found" = yes- then- LDFLAGS="$LDFLAGS `llvm-config --libs`"- fi-fi- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'@@ -3381,6 +3284,103 @@ -------------------------------------------------" "$LINENO" 5 fi +# Check whether --enable-llvm-shared was given.+if test "${enable_llvm_shared+set}" = set; then :+ enableval=$enable_llvm_shared; llvm_shared=$enableval+fi++if test "$llvm_shared" != ""+then+ as_ac_Lib=`$as_echo "ac_cv_lib_${llvm_shared}''_LLVMContextCreate" | $as_tr_sh`+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LLVMContextCreate in -l${llvm_shared}" >&5+$as_echo_n "checking for LLVMContextCreate in -l${llvm_shared}... " >&6; }+if eval "test \"\${$as_ac_Lib+set}\"" = set; then :+ $as_echo_n "(cached) " >&6+else+ ac_check_lib_save_LIBS=$LIBS+LIBS="-l${llvm_shared} $LIBS"+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++/* Override any GCC internal prototype to avoid an error.+ Use char because int might match the return type of a GCC+ builtin and then its argument prototype would still apply. */+#ifdef __cplusplus+extern "C"+#endif+char LLVMContextCreate ();+int+main ()+{+return LLVMContextCreate ();+ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_link "$LINENO"; then :+ eval "$as_ac_Lib=yes"+else+ eval "$as_ac_Lib=no"+fi+rm -f core conftest.err conftest.$ac_objext \+ conftest$ac_exeext conftest.$ac_ext+LIBS=$ac_check_lib_save_LIBS+fi+eval ac_res=\$$as_ac_Lib+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :+ llvm_shared_lib_found=yes+else+ llvm_shared_lib_found=no+fi++ if test "$llvm_shared_lib_found" = no+ then+ as_fn_error $? "+ -------------------------------------------------+ llvm shared library ${llvm_shared} not found.+ if the library is present, ensure it is available+ on the lib search path (export LDFLAGS=...)+ -------------------------------------------------" "$LINENO" 5+ else+ LDFLAGS="$LDFLAGS -l${llvm_shared}"+ if test "$cross_compiling" = yes; then :+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "cannot run test program while cross compiling+See \`config.log' for more details" "$LINENO" 5 ; }+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+int main(int argc, int argv[]){LLVMContextCreate();return 0;}+_ACEOF+if ac_fn_c_try_run "$LINENO"; then :+ llvm_shared_lib_present=yes+else+ llvm_shared_lib_present=no+fi+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \+ conftest.$ac_objext conftest.beam conftest.$ac_ext+fi++ if test "$llvm_shared_lib_present" = no+ then+ as_fn_error $? "+ -------------------------------------------------------+ specified llvm shared library ${llvm_shared} not found.+ if the library is present, ensure it is available+ on the lib search path (export LID_LIBRARY_PATH=...)+ -------------------------------------------------------" "$LINENO" 5+ fi+ fi+else+ if test "$llvm_config_found" = yes+ then+ LDFLAGS="$LDFLAGS `llvm-config --libs`"+ fi+fi+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang_getClangVersion in -lclang" >&5 $as_echo_n "checking for clang_getClangVersion in -lclang... " >&6; } if test "${ac_cv_lib_clang_clang_getClangVersion+set}" = set; then :@@ -3445,7 +3445,7 @@ as_fn_error $? "Cannot find inttypes.h" "$LINENO" 5 fi -ac_config_files="$ac_config_files LibClang.buildinfo"+ac_config_files="$ac_config_files LibClang.buildinfo test/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure@@ -4153,6 +4153,7 @@ do case $ac_config_target in "LibClang.buildinfo") CONFIG_FILES="$CONFIG_FILES LibClang.buildinfo" ;;+ "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac
src/Clang/Cursor.hs view
@@ -12,7 +12,7 @@ ,nullCursor ,getHash-,getKind+,Clang.Cursor.getKind ,getLinkage ,getAvailability ,getLanguage@@ -32,6 +32,7 @@ ,getCanonicalCursor ,getTemplateKind ,getSpecializedTemplate+,getTranslationUnitCursor -- attribute function ,getIBOutletCollectionType@@ -92,6 +93,7 @@ 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
@@ -93,6 +93,7 @@ ,getCursorExtent ,TypeKind(..) ,Type+,getTypeKind ,getCursorType ,equalTypes ,getCanonicalType@@ -186,10 +187,10 @@ -- typedef void *CXIndex; data IndexObj-type Index = ForeignPtr IndexObj+type Index = Ptr IndexObj -- CXIndex clang_createIndex(int excludeDeclarationsFromPCH, int displayDiagnostics);-%fun clang_createIndex :: Bool -> Bool -> IO Index+%fun clang_createIndex :: Bool -> Bool -> IO (ForeignPtr IndexObj) %call (bool a) (bool b) %code CXIndex r = clang_createIndex(a, b); %result (index (ptr r))@@ -202,13 +203,13 @@ -- typedef struct CXTranslationUnitImpl *CXTranslationUnit; data TranslationUnitObj-type TranslationUnit = ForeignPtr TranslationUnitObj+type TranslationUnit = Ptr TranslationUnitObj -- void clang_disposeTranslationUnit(CXTranslationUnit);-foreign import ccall unsafe "clang-c/Index.h &clang_disposeTranslationUnit" clang_disposeTranslationUnit :: FunPtr (Ptr TranslationUnitObj -> IO ())+foreign import ccall unsafe "clang-c/Index.h &clang_disposeTranslationUnit" clang_disposeTranslationUnitPtr :: FunPtr (Ptr TranslationUnitObj -> IO ()) unmarshall_translationUnit :: Ptr TranslationUnitObj -> IO (ForeignPtr TranslationUnitObj)-unmarshall_translationUnit = newForeignPtr clang_disposeTranslationUnit+unmarshall_translationUnit = newForeignPtr clang_disposeTranslationUnitPtr -- typedef void *CXClientData; data ClientDataObj@@ -267,7 +268,7 @@ -- CXFile clang_getFile(CXTranslationUnit tu, const char *file_name); %fun clang_getFile :: TranslationUnit -> String -> IO File-%call (fptr (ptr t)) (string s)+%call (ptr t) (string s) %code CXFile r = clang_getFile(t, s); %result (file r) @@ -318,7 +319,7 @@ -- unsigned line, -- unsigned column); %fun clang_getLocation :: TranslationUnit -> File -> Int -> Int -> IO SourceLocation-%call (fptr (ptr t)) (file f) (int i) (int j)+%call (ptr t) (file f) (int i) (int j) %code CXSourceLocation r = clang_getLocation((CXTranslationUnit)t, f, i, j); %result (sourceLocation {r.ptr_data[0]} {r.ptr_data[1]} {r.int_data}) @@ -326,7 +327,7 @@ -- CXFile file, -- unsigned offset); %fun clang_getLocationForOffset :: TranslationUnit -> File -> Int -> IO SourceLocation-%call (fptr (ptr t)) (file f) (int i)+%call (ptr t) (file f) (int i) %code CXSourceLocation r = clang_getLocationForOffset((CXTranslationUnit)t, f, i); %result (sourceLocation {r.ptr_data[0]} {r.ptr_data[1]} {r.int_data}) @@ -402,13 +403,13 @@ -- unsigned clang_getNumDiagnostics(CXTranslationUnit Unit); %fun clang_getNumDiagnostics :: TranslationUnit -> IO Int-%call (fptr (ptr t))+%call (ptr t) %code unsigned r = clang_getNumDiagnostics((CXTranslationUnit)t); %result (int r) -- CXDiagnostic clang_getDiagnostic(CXTranslationUnit Unit, unsigned Index); %fun clang_getDiagnostic :: TranslationUnit -> Int -> IO Diagnostic-%call (fptr (ptr t)) (int i)+%call (ptr t) (int i) %code CXDiagnostic r = clang_getDiagnostic((CXTranslationUnit)t, i); %result (diag (ptr r)) @@ -498,7 +499,7 @@ -- CXString -- clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit); %fun clang_getTranslationUnitSpelling :: TranslationUnit -> IO CXString-%call (fptr (ptr t))+%call (ptr t) %code CXString *r = mkStrObj();*r = clang_getTranslationUnitSpelling(t); %result (cxString (ptr r)) @@ -509,15 +510,15 @@ -- const char * const *clang_command_line_args, -- unsigned num_unsaved_files, -- struct CXUnsavedFile *unsaved_files);-%fun clang_createTranslationUnitFromSourceFile :: Index -> String -> [String] -> [UnsavedFile] -> IO TranslationUnit-%call (fptr (ptr i)) (string s) (listLenString ((fptr (ptr ss)), (int ns))) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs)))+%fun clang_createTranslationUnitFromSourceFile :: Index -> String -> [String] -> [UnsavedFile] -> IO (ForeignPtr TranslationUnitObj)+%call (ptr i) (string s) (listLenString ((fptr (ptr ss)), (int ns))) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) %code r = clang_createTranslationUnitFromSourceFile(i,s,ns,ss,nufs,ufs); %result (translationUnit (ptr r)) -- CXTranslationUnit clang_createTranslationUnit(CXIndex, -- const char *ast_filename);-%fun clang_createTranslationUnit :: Index -> String -> IO TranslationUnit-%call (fptr (ptr i)) (string s)+%fun clang_createTranslationUnit :: Index -> String -> IO (ForeignPtr TranslationUnitObj)+%call (ptr i) (string s) %code CXTranslationUnit r = clang_createTranslationUnit(i, s); %result (translationUnit (ptr r)) @@ -554,8 +555,8 @@ -- struct CXUnsavedFile *unsaved_files, -- unsigned num_unsaved_files, -- unsigned options);-%fun clang_parseTranslationUnit :: Index -> Maybe String -> [String] -> [UnsavedFile] -> Int -> IO (Maybe TranslationUnit)-%call (fptr (ptr i)) (maybeT {nullPtr} (string s)) (listLenString ((fptr (ptr ss)), (int ns))) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i2)+%fun clang_parseTranslationUnit :: Index -> Maybe String -> [String] -> [UnsavedFile] -> Int -> IO (Maybe (ForeignPtr TranslationUnitObj))+%call (ptr i) (maybeT {nullPtr} (string s)) (listLenString ((fptr (ptr ss)), (int ns))) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i2) %code r = clang_parseTranslationUnit(i,s,ss,ns,ufs,nufs,i2); %result (maybeT {nullPtr} (translationUnit (ptr r))) @@ -606,7 +607,7 @@ -- unsigned clang_defaultSaveOptions(CXTranslationUnit TU); %fun clang_defaultSaveOptions :: TranslationUnit -> IO Int-%call (fptr (ptr t))+%call (ptr t) %code r = clang_defaultSaveOptions(t); %result (int r) @@ -614,7 +615,7 @@ -- const char *FileName, -- unsigned options); %fun clang_saveTranslationUnit :: TranslationUnit -> String -> Int -> IO Bool-%call (fptr (ptr t)) (string s) (int i)+%call (ptr t) (string s) (int i) %code unsigned r = clang_saveTranslationUnit(t, s, i); %result (bool {r!=0?0:1}) @@ -629,7 +630,7 @@ -- unsigned clang_defaultReparseOptions(CXTranslationUnit TU); %fun clang_defaultReparseOptions :: TranslationUnit -> IO Int-%call (fptr (ptr t))+%call (ptr t) %code r = clang_defaultReparseOptions(t); %result (int r) @@ -638,7 +639,7 @@ -- struct CXUnsavedFile *unsaved_files, -- unsigned options); %fun clang_reparseTranslationUnit :: TranslationUnit -> [UnsavedFile] -> Int -> IO Bool-%call (fptr (ptr t)) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i)+%call (ptr t) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i) %code r = clang_reparseTranslationUnit(t, nufs, ufs, i); %result (bool r) @@ -746,7 +747,7 @@ -- CXCursor clang_getTranslationUnitCursor(CXTranslationUnit); %fun clang_getTranslationUnitCursor :: TranslationUnit -> IO Cursor-%call (fptr (ptr t))+%call (ptr t) %code CXCursor r = clang_getTranslationUnitCursor(t); %result (cursor {r.kind} {r.data[0]} {r.data[1]} {r.data[2]}) @@ -910,7 +911,7 @@ -- CXCursor clang_getCursor(CXTranslationUnit, CXSourceLocation); %fun clang_getCursor :: TranslationUnit -> SourceLocation -> IO Cursor-%call (fptr (ptr t)) (sourceLocation p1 p2 d)+%call (ptr t) (sourceLocation p1 p2 d) %code CXSourceLocation l = {{p1, p2}, d}; % CXCursor r = clang_getCursor(t, l); %result (cursor {r.kind} {r.data[0]} {r.data[1]} {r.data[2]})@@ -985,6 +986,8 @@ data Type = Type TypeKind (Ptr ()) (Ptr ()) %dis type k p1 p2 = Type (typeKind k) (ptr p1) (ptr p2) +getTypeKind (Type k _ _) = k+ -- CXType clang_getCursorType(CXCursor C); %fun clang_getCursorType :: Cursor -> IO Type %call (cursor k p1 p2 p3)@@ -1327,7 +1330,7 @@ -- CXString clang_getTokenSpelling(CXTranslationUnit, CXToken); %fun clang_getTokenSpelling :: TranslationUnit -> Token -> IO CXString-%call (fptr (ptr t)) (token w x y z p)+%call (ptr t) (token w x y z p) %code CXToken a = {{w, x, y, z}, p}; % CXString *r = mkStrObj();*r = clang_getTokenSpelling(t, a); %result (cxString (ptr r))@@ -1335,14 +1338,14 @@ -- CXSourceLocation clang_getTokenLocation(CXTranslationUnit, -- CXToken); %fun clang_getTokenLocation :: TranslationUnit -> Token -> IO SourceLocation-%call (fptr (ptr t)) (token w x y z p)+%call (ptr t) (token w x y z p) %code CXToken a = {{w, x, y, z}, p}; % CXSourceLocation r = clang_getTokenLocation(t, a); %result (sourceLocation {r.ptr_data[0]} {r.ptr_data[1]} {r.int_data}) -- CXSourceRange clang_getTokenExtent(CXTranslationUnit, CXToken); %fun clang_getTokenExtent :: TranslationUnit -> Token -> IO SourceRange-%call (fptr (ptr t)) (token w x y z p)+%call (ptr t) (token w x y z p) %code CXToken a = {{w, x, y, z}, p}; % CXSourceRange r = clang_getTokenExtent(t, a); %result (sourceRange {r.ptr_data[0]} {r.ptr_data[1]} {r.begin_int_data} {r.end_int_data})@@ -1393,7 +1396,7 @@ -- void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, -- CXToken **Tokens, unsigned *NumTokens); %fun clang_tokenize :: TranslationUnit -> SourceRange -> IO TokenList-%call (fptr (ptr t)) (sourceRange p1 p2 d1 d2)+%call (ptr t) (sourceRange p1 p2 d1 d2) %code CXSourceRange a = {{p1, p2}, d1, d2}; % CXToken * tokens;unsigned numTokens; % clang_tokenize(t, a, &tokens, &numTokens);@@ -1417,7 +1420,7 @@ -- CXToken *Tokens, unsigned NumTokens, -- CXCursor *Cursors); %fun clang_annotateTokens :: TranslationUnit -> TokenList -> IO CursorList-%call (fptr (ptr t)) (tokenList ((int nts), (fptr (ptr ts))))+%call (ptr t) (tokenList ((int nts), (fptr (ptr ts)))) %code CXCursor * cs = (CXCursor *)malloc(sizeof(CXCursor)*nts); % clang_annotateTokens(t, ts, nts, cs); %result (cursorListExt nts (ptr cs))@@ -1545,7 +1548,7 @@ -- unsigned num_unsaved_files, -- unsigned options); %fun clang_codeCompleteAt :: TranslationUnit -> String -> Int -> Int -> [UnsavedFile] -> Int -> IO CodeCompleteResults-%call (fptr (ptr t)) (string s) (int i1) (int i2) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i3)+%call (ptr t) (string s) (int i1) (int i2) (listLenUnsavedFile ((fptr (ptr ufs)), (int nufs))) (int i3) %code r = clang_codeCompleteAt(t, s, i1, i2, ufs, nufs, i3) %result (codeCompleteResults (ptr r)) @@ -1588,12 +1591,11 @@ type InclusionVisitor = File -> [SourceLocation] -> Ptr () -> IO () -- %fun clang_getInclusions :: TranslationUnit -> InclusionVisitor -> Ptr () -> IO ()--- %call (fptr (ptr t)) (inclusionVisitor (ptr f)) (ptr p)+-- %call (ptr t) (inclusionVisitor (ptr f)) (ptr p) -- %code clang_getInclusions(t, f, p); getInclusions :: TranslationUnit -> InclusionVisitor -> Ptr () -> IO ()-getInclusions tu iv p =- (marshall_fptr tu) >>= \ (t) ->+getInclusions t iv p = (marshall_inclusionVisitor iv) >>= \ (f) -> prim_getInclusions_ t f p >> freeHaskellFunPtr f
+ src/Clang/File.hs view
@@ -0,0 +1,16 @@+module Clang.File+(+ FFI.UnsavedFile+,FFI.File+,+) where++import Control.Monad((>=>))+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+getFile :: FFI.TranslationUnit -> FilePath -> FFI.File+getFile t f = unsafePerformIO $ FFI.getFile t f
src/Clang/Token.hs view
@@ -1,7 +1,7 @@ module Clang.Token ( FFI.Token-,getKind+,Clang.Token.getKind ,getSpelling ,Clang.Token.getLocation ,getExtent
src/Clang/TranslationUnit.hs view
@@ -3,11 +3,11 @@ FFI.Index ,FFI.TranslationUnitFlags(..) ,FFI.SaveTranslationUnitFlags(..)-,create-,createIndex ,getSpelling-,createFromSourceFile-,parse+,withCreateIndex+,withCreate+,withCreateFromSourceFile+,withParse ,defaultSaveOptions ,save ,defaultReparseOptions@@ -17,27 +17,34 @@ import System.IO.Unsafe(unsafePerformIO) import Data.Bits((.&.)) import Data.Maybe(catMaybes)-import Control.Monad(mzero)+import Control.Monad(mzero, (<=<))+import Foreign.ForeignPtr(withForeignPtr) import Clang.Type import Clang.Source import qualified Clang.FFI as FFI getSpelling = unsafePerformIO . FFI.getTranslationUnitSpelling-create = FFI.createTranslationUnit-createFromSourceFile :: FFI.Index -- ^ Index for the source+withCreate i s f = flip withForeignPtr f =<< FFI.createTranslationUnit i s++withCreateFromSourceFile :: FFI.Index -- ^ Index for the source -> FilePath -- ^ Source filename -> [String] -- ^ Command line arguments ( this can include all clang compatible flags) -> [FFI.UnsavedFile] -- ^ Unsaved files- -> IO FFI.TranslationUnit-createFromSourceFile = FFI.createTranslationUnitFromSourceFile-parse :: FFI.Index -- ^ Index for the source+ -> (FFI.TranslationUnit -> IO a) -- ^ Function that will process the TranslationUnit+ -> IO a+withCreateFromSourceFile i fn ss ufs f = flip withForeignPtr f =<< FFI.createTranslationUnitFromSourceFile i fn ss ufs++withParse :: FFI.Index -- ^ Index for the source -> Maybe FilePath -- ^ Source filename -> [String] -- ^ Command line arguments ( this can include all clang compatible flags) -> [FFI.UnsavedFile] -- ^ Unsaved files -> [FFI.TranslationUnitFlags] -- ^ TranslationUnit flags- -> IO (Maybe FFI.TranslationUnit)-parse i ms ss ufs opts = FFI.parseTranslationUnit i ms ss ufs (FFI.getTranslationUnitFlagsSum opts)+ -> (FFI.TranslationUnit -> IO a) -- ^ Function that will process the TranslationUnit+ -> IO a -- ^ Result to be returned if source couldn't be parsed+ -> IO a+withParse i ms ss ufs opts f nr = maybe nr (flip withForeignPtr f) =<< + FFI.parseTranslationUnit i ms ss ufs (FFI.getTranslationUnitFlagsSum opts) -- No other option right now defaultSaveOptions = [FFI.SaveTranslationUnit_None]@@ -50,8 +57,6 @@ -- No other option right now defaultReparseOptions = [FFI.Reparse_None]- -- where defVal = unsafePerformIO . FFI.defaultReparseOptions- -- val1 v = if (v .&. 0x1) == 0x1 then return FFI.Diagnostic_DisplaySourceLocation else mzero reparse :: FFI.TranslationUnit -- ^ TranslationUnit to save -> [FFI.UnsavedFile] -- ^ All the unsaved files@@ -60,4 +65,4 @@ reparse t ufs opts = FFI.reparseTranslationUnit t ufs (FFI.getReparseFlagsSum opts) -- index functions-createIndex = FFI.createIndex+withCreateIndex i1 i2 f = flip withForeignPtr f =<< FFI.createIndex i1 i2
+ src/Clang/Traversal.hs view
@@ -0,0 +1,14 @@+module Clang.Traversal+(+ annotateTokens+,FFI.ChildVisitor+,FFI.ChildVisitResult(..)+,FFI.visitChildren+) where++import qualified Clang.FFI as FFI++annotateTokens :: FFI.TranslationUnit -- ^ The translation unit related to the tokens+ -> [FFI.Token] -- ^ Token list that you want cursors for+ -> IO [FFI.Cursor] -- ^ Cursors corresponding to the tokens+annotateTokens = FFI.annotateTokens
src/Clang/Type.hs view
@@ -5,6 +5,7 @@ ,FFI.TypeKind(..) ,FFI.CXXAccessSpecifier(..) +,getKind ,getCanonicalType ,getPointeeType ,getResultType@@ -14,6 +15,7 @@ ,isRestrictQualifiedType ,isPODType ,isVirtualBase+,getTypeKindSpelling ) where @@ -25,6 +27,8 @@ instance Eq FFI.Type where a == b = unsafePerformIO (FFI.equalTypes a b)++getKind = FFI.getTypeKind getCanonicalType = unsafePerformIO . FFI.getCanonicalType getPointeeType = unsafePerformIO . FFI.getPointeeType