LibClang-3.8.0: src/Clang/Range.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
-- | Functions for manipulating 'FFI.SourceRange's, which represent a range of
-- locations in the source code between two points.
--
-- This module is intended to be imported qualified.
module Clang.Range
(
-- * Creating ranges
create
, createInvalid
-- * Analyzing ranges
, getStart
, getEnd
, isInvalid
) where
import Control.Monad.IO.Class
import qualified Clang.Internal.FFI as FFI
import Clang.Internal.Monad
import System.IO.Unsafe (unsafePerformIO)
-- | Creates a 'FFI.SourceRange' representing the range between two locations.
create :: ClangBase m
=> FFI.SourceLocation s' -- ^ Starting location.
-> FFI.SourceLocation s'' -- ^ Ending location.
-> ClangT s m (FFI.SourceRange s)
create from to = liftIO $ FFI.getRange mkProxy from to
-- | Creates an invalid 'FFI.SourceRange'.
createInvalid :: ClangBase m => ClangT s m (FFI.SourceRange s)
createInvalid = liftIO $ FFI.getNullRange mkProxy
-- | Retrieves the beginning of the given range.
getStart :: ClangBase m => FFI.SourceRange s' -> ClangT s m (FFI.SourceLocation s)
getStart sr = liftIO $ FFI.getRangeStart mkProxy sr
-- | Retrieves the end of the given range.
getEnd :: ClangBase m => FFI.SourceRange s' -> ClangT s m (FFI.SourceLocation s)
getEnd sr = liftIO $ FFI.getRangeEnd mkProxy sr
-- | Returns 'True' if the given range is invalid.
isInvalid :: FFI.SourceRange s' -> Bool
isInvalid r = unsafePerformIO $ FFI.range_isNull r