-----------------------------------------------------------------------------
--
--- GHCi's :ctags and :etags commands
+-- GHCi's :ctags and :etags commands
--
-- (c) The GHC Team 2005-2007
--
import Name (nameOccName)
import OccName (pprOccName)
+import Data.Maybe
import Control.Exception
import Data.List
import Control.Monad
++ GHC.moduleNameString (GHC.moduleName m)
++ "' is not interpreted"))
mbModInfo <- GHC.getModuleInfo session m
- let unqual
- | Just modinfo <- mbModInfo,
- Just unqual <- GHC.modInfoPrintUnqualified modinfo = unqual
- | otherwise = GHC.alwaysQualify
-
+ unqual <-
+ case mbModInfo of
+ Just minf -> do
+ mb_print_unqual <- GHC.mkPrintUnqualifiedForModule session minf
+ return (fromMaybe GHC.alwaysQualify mb_print_unqual)
+ Nothing ->
+ return GHC.alwaysQualify
case mbModInfo of
Just modInfo -> return $! listTags unqual modInfo
_ -> return []
tagGroups <- mapM tagFileGroup groups
IO.try (writeFile file $ concat tagGroups)
where
- tagFileGroup group@[] = throwDyn (CmdLineError "empty tag file group??")
+ tagFileGroup [] = throwDyn (CmdLineError "empty tag file group??")
tagFileGroup group@((_,fileName,_,_):_) = do
file <- readFile fileName -- need to get additional info from sources..
let byLine (_,_,l1,_) (_,_,l2,_) = l1 <= l2
sortedGroup = sortLe byLine group
tags = unlines $ perFile sortedGroup 1 0 $ lines file
return $ "\x0c\n" ++ fileName ++ "," ++ show (length tags) ++ "\n" ++ tags
- perFile (tagInfo@(tag,file,lNo,colNo):tags) count pos (line:lines) | lNo>count =
- perFile (tagInfo:tags) (count+1) (pos+length line) lines
- perFile (tagInfo@(tag,file,lNo,colNo):tags) count pos lines@(line:_) | lNo==count =
- showETag tagInfo line pos : perFile tags count pos lines
- perFile tags count pos lines = []
+ perFile (tagInfo@(_tag, _file, lNo, _colNo):tags) count pos lines@(line:lines')
+ | lNo > count = perFile (tagInfo:tags) (count+1) (pos+length line) lines'
+ | lNo == count = showETag tagInfo line pos : perFile tags count pos lines
+ perFile _ _ _ _ = []
-- simple ctags format, for Vim et al
showTag :: TagInfo -> String
-showTag (tag,file,lineNo,colNo)
+showTag (tag, file, lineNo, _colNo)
= tag ++ "\t" ++ file ++ "\t" ++ show lineNo
-- etags format, for Emacs/XEmacs
showETag :: TagInfo -> String -> Int -> String
-showETag (tag,file,lineNo,colNo) line charPos
+showETag (tag, _file, lineNo, colNo) line charPos
= take colNo line ++ tag
++ "\x7f" ++ tag
++ "\x01" ++ show lineNo