module Clang.Diagnostic
(
FFI.DiagnosticSeverity(..)
,FFI.DiagnosticDisplayOptions(..)
,FFI.Diagnostic
,getDiagnostics
,getDefaultDisplayOptions
,formatDiagnostic
,getSeverity
,getSpelling
,getOptions
,getCategory
,getRanges
,getFixIts
,getCategoryName
) 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
getDiagnostics :: FFI.TranslationUnit -> [FFI.Diagnostic]
getDiagnostics t = unsafePerformIO $ do
numDiags <- FFI.getNumDiagnostics t
mapM (FFI.getDiagnostic t) [0..(numDiags1)]
formatDiagnostic :: [FFI.DiagnosticDisplayOptions] -> FFI.Diagnostic -> IO String
formatDiagnostic [] diag = FFI.getCString =<< FFI.formatDiagnostic diag =<< FFI.defaultDiagnosticDisplayOptions
formatDiagnostic opts diag = FFI.getCString =<< FFI.formatDiagnostic diag (FFI.getDiagnosticDispOptSum opts)
getSeverity = unsafePerformIO . FFI.getDiagnosticSeverity
getSpelling = unsafePerformIO . FFI.getDiagnosticSpelling
getOptions = unsafePerformIO . FFI.getDiagnosticOption
getDefaultDisplayOptions = catMaybes [val1 defVal, val2 defVal, val3 defVal, val4 defVal, val5 defVal, val6 defVal]
where defVal = unsafePerformIO FFI.defaultDiagnosticDisplayOptions
val1 v = if (v .&. 0x1) == 0x1 then return FFI.Diagnostic_DisplaySourceLocation else mzero
val2 v = if (v .&. 0x2) == 0x2 then return FFI.Diagnostic_DisplayColumn else mzero
val3 v = if (v .&. 0x4) == 0x4 then return FFI.Diagnostic_DisplaySourceRanges else mzero
val4 v = if (v .&. 0x8) == 0x8 then return FFI.Diagnostic_DisplayOption else mzero
val5 v = if (v .&. 0x10) == 0x10 then return FFI.Diagnostic_DisplayCategoryId else mzero
val6 v = if (v .&. 0x20) == 0x20 then return FFI.Diagnostic_DisplayCategoryName else mzero
getCategory = unsafePerformIO . FFI.getDiagnosticCategory
getRanges :: FFI.Diagnostic -> [FFI.SourceRange]
getRanges d = unsafePerformIO $ do
numRanges <- FFI.getDiagnosticNumRanges d
mapM (FFI.getDiagnosticRange d) [0..(numRanges1)]
getFixIts :: FFI.Diagnostic -> [(FFI.SourceRange, FFI.CXString)]
getFixIts d = unsafePerformIO $ do
numFixes <- FFI.getDiagnosticNumFixIts d
mapM (FFI.getDiagnosticFixIt d) [0..(numFixes1)]
getCategoryName = unsafePerformIO . FFI.getDiagnosticCategoryName