HaRe-0.6: tools/hs2html/RefsTypes.hs
module RefsTypes(module RefsTypes,Pos(..),sameModuleName,noModule) where
import HsName(ModuleName,sameModuleName,noModule)
import HsLexerPos(Pos(..))
import SrcLoc1(SrcLoc)
{-+
The cross reference information was once written to files by #tstModules#
and then read by #hs2html#. That is why there were #Show# and #Read# instances,
and why the constructor names are short.
<p>
Since hs2html has been integrated into pfe now, these types are rather
obsolete...
-}
--data SP = T | V deriving (Read)
data T = V | Co Name {-Ref-} | Me Name {-Ref-} | Fi Name {-Ref-} | T | Cl deriving (Eq,Show,Read)
data R = DT | DL | DC | DI | DP | U | Ex | Im deriving ({-Show,Read,-}Eq)
type Module = ModuleName
type Name = String
--type Pos = (Int,Int) -- (line,column)
type SrcPos = (FilePath,Pos) -- better to keep SrcLoc?
type Global = (Module,Name)
type Local = SrcPos
type Ref = Either Global Local
type Orig = (Name,R,T,[(T,Ref)])
type Refs = [(Pos,Orig)]
isDef U = False
isDef DI = False
isDef Ex = False
isDef Im = False
isDef _ = True
isType Cl = True
isType T = True
isType _ = False
shPos p = show (line p)++":"++show (column p)
shPos' p = show (line p)++"."++show (column p)
-- Merge a sorted list of reference info with a list of lexical tokens
-- (Designed to be lazy in the reference list)
merge rs [] = []
merge rs tts@(t@(_,(tp,_)):ts) = (t,optref):merge rs' ts
where
(optref,rs') = findref rs
findref [] = (Nothing,[])
findref rrs@((rp,ref):rs) =
case compare rp tp of
LT -> findref rs
EQ -> (Just ref,rs)
GT -> (Nothing,rrs)
{-
-- Strict merge (only marginally faster, it seems):
merge' rs [] = []
merge' [] ts = map (flip (,) Nothing) ts
merge' rrs@(r@(rp,ref):rs) tts@(t@(_,(tp,_)):ts) =
case compare rp tp of
LT -> merge' rs tts
EQ -> (t,Just ref):merge' rs ts
GT -> (t,Nothing):merge' rrs ts
-}