module Clang.Completion ( FFI.CompletionString ,FFI.CompletionResult ,FFI.CompletionChunkKind ,FFI.CodeCompleteFlags(..) ,FFI.CodeCompleteResults ,getChunkKind ,getChunkText ,getChunkCompletionString ,getNumChunks ,getPriority ,getAvailability ,defaultCodeCompleteOptions ,codeCompleteAt ) where import System.IO.Unsafe(unsafePerformIO) import Data.Bits((.&.)) import Data.Maybe(catMaybes) import Control.Monad(mzero) import Clang.Type import Clang.Source import qualified Clang.FFI as FFI getChunkKind cs i = unsafePerformIO (FFI.getCompletionChunkKind cs i) getChunkText cs i = unsafePerformIO (FFI.getCompletionChunkText cs i) getChunkCompletionString cs i = unsafePerformIO (FFI.getCompletionChunkCompletionString cs i) getNumChunks = unsafePerformIO . FFI.getNumCompletionChunks getPriority = unsafePerformIO . FFI.getCompletionPriority getAvailability = unsafePerformIO . FFI.getCompletionAvailability defaultCodeCompleteOptions = catMaybes [val1 defVal, val2 defVal] where defVal = unsafePerformIO FFI.defaultCodeCompleteOptions val1 v = if (v .&. 0x01) == 0x01 then return FFI.CodeComplete_IncludeMacros else mzero val2 v = if (v .&. 0x02) == 0x02 then return FFI.CodeComplete_IncludeCodePatterns else mzero codeCompleteAt :: FFI.TranslationUnit -> FilePath -- ^ Filename of the source file -> Int -- ^ Line in the source file -> Int -- ^ Column on the line -> [FFI.UnsavedFile] -- ^ Unsaved files so far -> [FFI.CodeCompleteFlags] -> IO FFI.CodeCompleteResults codeCompleteAt t fname l c ufs opts = FFI.codeCompleteAt t fname l c ufs (FFI.getCodeCompleteFlagsSum opts) sortResults = FFI.sortCodeCompletionResults getDiagnostics c = unsafePerformIO $ do numD <- FFI.codeCompleteGetNumDiagnostics c mapM (FFI.codeCompleteGetDiagnostic c) [0..(numD-1)]