diff options
| author | Niklas Haas <git@nand.wakku.to> | 2014-03-10 21:03:22 +0100 | 
|---|---|---|
| committer | Niklas Haas <git@nand.wakku.to> | 2014-03-11 10:26:04 +0100 | 
| commit | 28e685d2589e4cd6847c21fe45a3b702c15090ea (patch) | |
| tree | e31e82b089480ab91c8e1454f0cf306751595821 /src | |
| parent | c40ee25c4a9cc4952b237d1b5a659eaeb0023c05 (diff) | |
Include fixity information in the Interface file
This resolves fixity information not appearing across package borders.
The binary file version has been increased accordingly.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Haddock/Interface/AttachInstances.hs | 55 | ||||
| -rw-r--r-- | src/Haddock/Interface/Create.hs | 1 | ||||
| -rw-r--r-- | src/Haddock/InterfaceFile.hs | 11 | ||||
| -rw-r--r-- | src/Haddock/Types.hs | 3 | 
4 files changed, 40 insertions, 30 deletions
| diff --git a/src/Haddock/Interface/AttachInstances.hs b/src/Haddock/Interface/AttachInstances.hs index 8c9d45c4..88512c1a 100644 --- a/src/Haddock/Interface/AttachInstances.hs +++ b/src/Haddock/Interface/AttachInstances.hs @@ -16,10 +16,12 @@ module Haddock.Interface.AttachInstances (attachInstances) where  import Haddock.Types  import Haddock.Convert +import Haddock.GhcUtils  import Control.Arrow  import Data.List  import Data.Ord (comparing) +import Data.Function (on)  import qualified Data.Map as Map  import qualified Data.Set as Set @@ -45,6 +47,7 @@ type ExportedNames = Set.Set Name  type Modules = Set.Set Module  type ExportInfo = (ExportedNames, Modules) +-- Also attaches fixities  attachInstances :: ExportInfo -> [Interface] -> InstIfaceMap -> Ghc [Interface]  attachInstances expInfo ifaces instIfaceMap = mapM attach ifaces    where @@ -59,19 +62,19 @@ attachInstances expInfo ifaces instIfaceMap = mapM attach ifaces  attachToExportItem :: ExportInfo -> Interface -> IfaceMap -> InstIfaceMap -> ExportItem Name -> Ghc (ExportItem Name)  attachToExportItem expInfo iface ifaceMap instIfaceMap export = -  case export of -    ExportDecl { expItemDecl = L _ (TyClD d) } -> do +  case attachFixities export of +    e@ExportDecl { expItemDecl = L _ (TyClD d) } -> do        mb_info <- getAllInfo (tcdName d)        let export' = -            export { +            e {                expItemInstances =                  case mb_info of                    Just (_, _, cls_instances, fam_instances) ->                      let fam_insts = [ (synifyFamInst i, n)                                      | i <- sortBy (comparing instFam) fam_instances -                                    , let n = lookupInstDoc (getName i) iface ifaceMap instIfaceMap +                                    , let n = instLookup instDocMap (getName i) iface ifaceMap instIfaceMap                                      ] -                        cls_insts = [ (synifyInstHead i, lookupInstDoc n iface ifaceMap instIfaceMap) +                        cls_insts = [ (synifyInstHead i, instLookup instDocMap n iface ifaceMap instIfaceMap)                                      | let is = [ (instanceHead' i, getName i) | i <- cls_instances ]                                      , (i@(_,_,cls,tys), n) <- sortBy (comparing $ first instHead) is                                      , not $ isInstanceHidden expInfo cls tys @@ -80,28 +83,28 @@ attachToExportItem expInfo iface ifaceMap instIfaceMap export =                    Nothing -> []              }        return export' -    _ -> return export - - -lookupInstDoc :: Name -> Interface -> IfaceMap -> InstIfaceMap -> Maybe (Doc Name) --- TODO: capture this pattern in a function (when we have streamlined the --- handling of instances) -lookupInstDoc name iface ifaceMap instIfaceMap = -  case Map.lookup name (ifaceDocMap iface) of -    Just doc -> Just doc -    Nothing -> -      case Map.lookup modName ifaceMap of -        Just iface2 -> -          case Map.lookup name (ifaceDocMap iface2) of -            Just doc -> Just doc -            Nothing -> Nothing -        Nothing -> -          case Map.lookup modName instIfaceMap of -            Just instIface -> Map.lookup name (instDocMap instIface) -            Nothing -> Nothing +    e -> return e    where -    modName = nameModule name - +    attachFixities e@ExportDecl{ expItemDecl = L _ d } = e { expItemFixities = +      nubBy ((==) `on` fst) $ expItemFixities e ++ +      [ (n',f) | n <- getMainDeclBinder d +              , Just subs <- [instLookup instSubMap n iface ifaceMap instIfaceMap] +              , n' <- n : subs +              , Just f <- [instLookup instFixMap n' iface ifaceMap instIfaceMap] +      ] } + +    attachFixities e = e + + +instLookup :: (InstalledInterface -> Map.Map Name a) -> Name +            -> Interface -> IfaceMap -> InstIfaceMap -> Maybe a +instLookup f name iface ifaceMap instIfaceMap = +  case Map.lookup name (f $ toInstalledIface iface) of +    res@(Just _) -> res +    Nothing -> do +      let ifaceMaps = Map.union (fmap toInstalledIface ifaceMap) instIfaceMap +      iface' <- Map.lookup (nameModule name) ifaceMaps +      Map.lookup name (f iface')  -- | Like GHC's 'instanceHead' but drops "silent" arguments.  instanceHead' :: ClsInst -> ([TyVar], ThetaType, Class, [Type]) diff --git a/src/Haddock/Interface/Create.hs b/src/Haddock/Interface/Create.hs index e23e9922..aef2cd8f 100644 --- a/src/Haddock/Interface/Create.hs +++ b/src/Haddock/Interface/Create.hs @@ -141,6 +141,7 @@ createInterface tm flags modMap instIfaceMap = do    , ifaceVisibleExports  = visibleNames    , ifaceDeclMap         = declMap    , ifaceSubMap          = subMap +  , ifaceFixMap          = fixMap    , ifaceModuleAliases   = aliases    , ifaceInstances       = instances    , ifaceFamInstances    = fam_instances diff --git a/src/Haddock/InterfaceFile.hs b/src/Haddock/InterfaceFile.hs index b4d5406d..924829d7 100644 --- a/src/Haddock/InterfaceFile.hs +++ b/src/Haddock/InterfaceFile.hs @@ -77,7 +77,7 @@ binaryInterfaceMagic = 0xD0Cface  --  binaryInterfaceVersion :: Word16  #if __GLASGOW_HASKELL__ == 709 -binaryInterfaceVersion = 24 +binaryInterfaceVersion = 25  binaryInterfaceVersionCompatibility :: [Word16]  binaryInterfaceVersionCompatibility = [binaryInterfaceVersion] @@ -365,15 +365,17 @@ instance Binary InterfaceFile where  instance Binary InstalledInterface where -  put_ bh (InstalledInterface modu info docMap argMap exps visExps opts subMap) = do +  put_ bh (InstalledInterface modu info docMap argMap +           exps visExps opts subMap fixMap) = do      put_ bh modu      put_ bh info      put_ bh docMap -    put_  bh argMap +    put_ bh argMap      put_ bh exps      put_ bh visExps      put_ bh opts      put_ bh subMap +    put_ bh fixMap    get bh = do      modu    <- get bh @@ -384,9 +386,10 @@ instance Binary InstalledInterface where      visExps <- get bh      opts    <- get bh      subMap  <- get bh +    fixMap  <- get bh      return (InstalledInterface modu info docMap argMap -            exps visExps opts subMap) +            exps visExps opts subMap fixMap)  instance Binary DocOption where diff --git a/src/Haddock/Types.hs b/src/Haddock/Types.hs index 179413ea..9538f3bf 100644 --- a/src/Haddock/Types.hs +++ b/src/Haddock/Types.hs @@ -100,6 +100,7 @@ data Interface = Interface    , ifaceRnArgMap        :: !(ArgMap DocName)    , ifaceSubMap          :: !(Map Name [Name]) +  , ifaceFixMap          :: !(Map Name Fixity)    , ifaceExportItems     :: ![ExportItem Name]    , ifaceRnExportItems   :: ![ExportItem DocName] @@ -158,6 +159,7 @@ data InstalledInterface = InstalledInterface    , instOptions        :: [DocOption]    , instSubMap         :: Map Name [Name] +  , instFixMap         :: Map Name Fixity    } @@ -172,6 +174,7 @@ toInstalledIface interface = InstalledInterface    , instVisibleExports = ifaceVisibleExports interface    , instOptions        = ifaceOptions        interface    , instSubMap         = ifaceSubMap         interface +  , instFixMap         = ifaceFixMap         interface    } | 
