content: {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE FlexibleContexts #-}
  
  -- | Functions for manipulating 'Unified Symbol Resolution' values, or
  -- \'USRs\'. USRs are strings that provide an unambiguous reference to a
  -- symbol. Any two cursors that refer to the same semantic entity will
  -- have the same USR, even if they occur in different translation
  -- units. This is very useful when attempting to cross-reference
  -- between different source files in a project.
  --
  -- Most often, using USRs simply means retrieving the USR that
  -- corresponds to a 'Clang.Cursor'. You can do this using
  -- 'Clang.Cursor.getUSR', and then convert to a Haskell string using
  -- the functions in "Clang.String".
  --
  -- This module is intended to be imported qualified.
  module Clang.USR
  ( createFromObjCClass
  , createFromObjCCategory
  , createFromObjCProtocol
  , createFromObjCIvar
  , createFromObjCInstanceMethod
  , createFromObjCClassMethod
  , createFromObjCProperty
  ) where
  
  import qualified Clang.Internal.FFI as FFI
  import Clang.Internal.Monad
  
  -- | Construct a USR for the specified Objective-C class.
  createFromObjCClass :: ClangBase m
                      => String  -- ^ A class name.
                      -> ClangT s m (FFI.ClangString s)
  createFromObjCClass = FFI.constructUSR_ObjCClass
  
  -- | Construct a USR for the specified Objective-C category.
  createFromObjCCategory :: ClangBase m
                         => String  -- ^ A class name.
                         -> String  -- ^ A category name.
                         -> ClangT s m (FFI.ClangString s)
  createFromObjCCategory = FFI.constructUSR_ObjCCategory
  
  -- | Construct a USR for the specified Objective-C protocol.
  createFromObjCProtocol :: ClangBase m
                         => String  -- ^ A protocol name.
                         -> ClangT s m (FFI.ClangString s)
  createFromObjCProtocol = FFI.constructUSR_ObjCProtocol
  
  -- | Construct a USR for the specified Objective-C instance variable,
  -- given the USR for its containing class.
  createFromObjCIvar :: ClangBase m
                     => String              -- ^ An instance variable name.
                     -> FFI.ClangString s'  -- ^ A class USR.
                     -> ClangT s m (FFI.ClangString s)
  createFromObjCIvar = FFI.constructUSR_ObjCIvar
  
  -- | Construct a USR for the specified Objective-C instance method, given the USR
  -- for its containing class.
  createFromObjCInstanceMethod :: ClangBase m
                               => String              -- ^ A method name.
                               -> FFI.ClangString s'  -- ^ A class USR.
                               -> ClangT s m (FFI.ClangString s)
  createFromObjCInstanceMethod name = FFI.constructUSR_ObjCMethod name True
  
  -- | Construct a USR for the specified Objective-C class method, given the USR
  -- for its containing class.
  createFromObjCClassMethod :: ClangBase m
                            => String              -- ^ A method name.
                            -> FFI.ClangString s'  -- ^ A class USR.
                            -> ClangT s m (FFI.ClangString s)
  createFromObjCClassMethod name = FFI.constructUSR_ObjCMethod name False
  
  -- | Construct a USR for the specified Objective-C property, given the USR
  -- for its containing class.
  createFromObjCProperty :: ClangBase m
                         => String              -- ^ A property name.
                         -> FFI.ClangString s'  -- ^ A class USR.
                         -> ClangT s m (FFI.ClangString s)
  createFromObjCProperty = FFI.constructUSR_ObjCProperty
  