X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FSrcLoc.lhs;h=3dccd51cb18a6069567e730c71353c31dc87b107;hb=8d873902b0ba7e267089f9e1faf690368670fe62;hp=650de416a40f5bcd5c3e66f2784f9192b98c2cd7;hpb=2f51f1402e6869c0f049ffbe7b019bf6ab80558f;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/SrcLoc.lhs b/ghc/compiler/basicTypes/SrcLoc.lhs index 650de41..3dccd51 100644 --- a/ghc/compiler/basicTypes/SrcLoc.lhs +++ b/ghc/compiler/basicTypes/SrcLoc.lhs @@ -1,5 +1,5 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1994 +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % %************************************************************************ %* * @@ -8,24 +8,31 @@ %************************************************************************ \begin{code} -#include "HsVersions.h" - module SrcLoc ( - SrcLoc, -- abstract + SrcLoc, -- Abstract + + mkSrcLoc, + noSrcLoc, isNoSrcLoc, -- "I'm sorry, I haven't a clue" - mkSrcLoc, mkSrcLoc2, -- the usual - mkUnknownSrcLoc, -- "I'm sorry, I haven't a clue" mkIfaceSrcLoc, -- Unknown place in an interface -- (this one can die eventually ToDo) - mkBuiltinSrcLoc, -- something wired into the compiler - mkGeneratedSrcLoc, -- code generated within the compiler - unpackSrcLoc + + mkBuiltinSrcLoc, -- Something wired into the compiler + + mkGeneratedSrcLoc, -- Code generated within the compiler + + incSrcLine, replaceSrcLine, + + srcLocFile, -- return the file name part. + srcLocLine -- return the line part. ) where -import Ubiq +#include "HsVersions.h" -import PprStyle ( PprStyle(..) ) -import Pretty +import Util ( thenCmp ) +import Outputable +import FastString ( unpackFS ) +import GlaExts ( Int(..), (+#) ) \end{code} %************************************************************************ @@ -38,10 +45,12 @@ We keep information about the {\em definition} point for each entity; this is the obvious stuff: \begin{code} data SrcLoc - = SrcLoc FAST_STRING -- source file name - FAST_STRING -- line number in source file - | SrcLoc2 FAST_STRING -- same, but w/ an Int line# + = NoSrcLoc + + | SrcLoc FAST_STRING -- A precise location (file name) FAST_INT + + | UnhelpfulSrcLoc FAST_STRING -- Just a general indication \end{code} Note that an entity might be imported via more than one route, and @@ -57,15 +66,28 @@ rare case. Things to make 'em: \begin{code} -mkSrcLoc = SrcLoc -mkSrcLoc2 x IBOX(y) = SrcLoc2 x y -mkUnknownSrcLoc = SrcLoc SLIT("") SLIT("") -mkIfaceSrcLoc = SrcLoc SLIT("") SLIT("") -mkBuiltinSrcLoc = SrcLoc SLIT("") SLIT("") -mkGeneratedSrcLoc = SrcLoc SLIT("") SLIT("") - -unpackSrcLoc (SrcLoc src_file src_line) = (src_file, src_line) -unpackSrcLoc (SrcLoc2 src_file src_line) = (src_file, _PK_ (show IBOX(src_line))) +noSrcLoc = NoSrcLoc +mkSrcLoc x IBOX(y) = SrcLoc x y + +mkIfaceSrcLoc = UnhelpfulSrcLoc SLIT("") +mkBuiltinSrcLoc = UnhelpfulSrcLoc SLIT("") +mkGeneratedSrcLoc = UnhelpfulSrcLoc SLIT("") + +isNoSrcLoc NoSrcLoc = True +isNoSrcLoc other = False + +srcLocFile :: SrcLoc -> FAST_STRING +srcLocFile (SrcLoc fname _) = fname + +srcLocLine :: SrcLoc -> FAST_INT +srcLocLine (SrcLoc _ l) = l + +incSrcLine :: SrcLoc -> SrcLoc +incSrcLine (SrcLoc s l) = SrcLoc s (l +# 1#) +incSrcLine loc = loc + +replaceSrcLine :: SrcLoc -> FAST_INT -> SrcLoc +replaceSrcLine (SrcLoc s _) l = SrcLoc s l \end{code} %************************************************************************ @@ -75,14 +97,45 @@ unpackSrcLoc (SrcLoc2 src_file src_line) = (src_file, _PK_ (show IBOX(src_line)) %************************************************************************ \begin{code} +-- SrcLoc is an instance of Ord so that we can sort error messages easily +instance Eq SrcLoc where + loc1 == loc2 = case loc1 `cmpSrcLoc` loc2 of + EQ -> True + other -> False + +instance Ord SrcLoc where + compare = cmpSrcLoc + +cmpSrcLoc NoSrcLoc NoSrcLoc = EQ +cmpSrcLoc NoSrcLoc other = LT + +cmpSrcLoc (UnhelpfulSrcLoc s1) (UnhelpfulSrcLoc s2) = s1 `compare` s2 +cmpSrcLoc (UnhelpfulSrcLoc s1) other = GT + +cmpSrcLoc (SrcLoc s1 l1) NoSrcLoc = GT +cmpSrcLoc (SrcLoc s1 l1) (UnhelpfulSrcLoc _) = LT +cmpSrcLoc (SrcLoc s1 l1) (SrcLoc s2 l2) = (s1 `compare` s2) `thenCmp` (l1 `cmpline` l2) + where + l1 `cmpline` l2 | l1 <# l2 = LT + | l1 ==# l2 = EQ + | otherwise = GT + instance Outputable SrcLoc where - ppr PprForUser (SrcLoc src_file src_line) - = ppBesides [ ppChar '"', ppPStr src_file, ppPStr SLIT("\", line "), ppPStr src_line ] + ppr (SrcLoc src_path src_line) + = getPprStyle $ \ sty -> + if userStyle sty then + hcat [ text src_file, char ':', int IBOX(src_line) ] + else + if debugStyle sty then + hcat [ ptext src_path, char ':', int IBOX(src_line) ] + else + hcat [text "{-# LINE ", int IBOX(src_line), space, + char '\"', ptext src_path, text " #-}"] + where + src_file = unpackFS src_path -- Leave the directory prefix intact, + -- so emacs can find the file - ppr sty (SrcLoc src_file src_line) - = ppBesides [ppPStr SLIT("{-# LINE "), ppPStr src_line, ppSP, - ppChar '"', ppPStr src_file, ppPStr SLIT("\" #-}")] + ppr (UnhelpfulSrcLoc s) = ptext s - ppr sty (SrcLoc2 src_file src_line) - = ppr sty (SrcLoc src_file (_PK_ (show IBOX(src_line)))) + ppr NoSrcLoc = text "" \end{code}