packages feed

hat-2.9.0.0: tools/Ident.hs

module Ident
  ( Ident(..)
  , getIdentAt		-- :: FileNode -> IO Ident
  ) where

import LowLevel		(FileNode(..))
import System.IO.Unsafe (unsafePerformIO)
import Foreign.Ptr      (Ptr)
import Foreign.Marshal.Alloc (free)
import Foreign.C.String	(CString, peekCString)

--foreign import ccall "malloc.h &free" finaliserFree :: FunPtr (Ptr a -> IO ())

-- All possible relevant information about an identifier
data Ident = Ident
  { i_name	:: String
  , i_modname	:: String
  , i_srcfile	:: String
  , i_fixity	:: Int
  , i_arity	:: Int
  , i_defnline	:: Int
  , i_defncol	:: Int
  , i_defnlineend :: Int
  , i_defncolend  :: Int
  , i_isTraced	:: Bool
  , i_caf       :: Bool
  , i_uses      :: Int
  , i_pending   :: Int
  , i_thunks    :: Int
  }

foreign import ccall "artutils.h" readAtomAt    :: FileNode -> IO (Ptr Ident)
foreign import ccall "artutils.h" identName     :: Ptr Ident -> IO CString
foreign import ccall "artutils.h" identModName  :: Ptr Ident -> IO CString
foreign import ccall "artutils.h" identSrcFile  :: Ptr Ident -> IO CString
foreign import ccall "artutils.h" identFixity   :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identArity    :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identDefnLine :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identDefnCol  :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identDefnLineEnd :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identDefnColEnd  :: Ptr Ident -> IO Int
foreign import ccall "artutils.h" identIsTraced :: Ptr Ident -> IO Bool

getIdentAt :: FileNode -> IO Ident
getIdentAt n = do
    p <- readAtomAt n	-- p is malloc'ed in C land
    nm  <- identName p
    mod <- identModName p
    src <- identSrcFile p
    fix <- identFixity p
    ar  <- identArity p
    dl  <- identDefnLine p
    dc  <- identDefnCol p
    dle <- identDefnLineEnd p
    dce <- identDefnColEnd p
    tr  <- identIsTraced p
    snm  <- peekCString nm
    smod <- peekCString mod
    ssrc <- peekCString src
    free p		-- dispose of p again
    return Ident
	{ i_name     = snm
	, i_modname  = smod
	, i_srcfile  = ssrc
	, i_fixity   = fix
	, i_arity    = ar
	, i_defnline = dl
	, i_defncol  = dc
        , i_defnlineend = dle
        , i_defncolend  = dce
	, i_isTraced = tr
        , i_caf = error "Ident.getIdentAt i_caf"
        , i_uses = error "Ident.getIdentAt i_uses"
        , i_pending = error "Ident.getIdentAt i_pending"
        , i_thunks = error "Ident.getIdentAt i_thunks"
	}

---------------------------------------------------------------------