Type checking of type signatures in interface files
\begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
module TcIface (
tcImportDecl, checkWiredInTyCon, tcHiBootIface, typecheckIface,
tcIfaceDecl, tcIfaceInst, tcIfaceFamInst, tcIfaceRules,
, md_rules = rules
, md_vect_info = vect_info
, md_exports = exports
- , md_modBreaks = emptyModBreaks
}
}
\end{code}
})
= do { vVars <- mapM vectVarMapping vars
; tyConRes1 <- mapM vectTyConMapping tycons
- ; tyConRes2 <- mapM vectTyConReuseMapping tycons
- ; let (vTyCons, vDataCons, vIsos) = unzip3 (tyConRes1 ++ tyConRes2)
+ ; tyConRes2 <- mapM vectTyConReuseMapping tyconsReuse
+ ; let (vTyCons, vDataCons, vPAs, vIsos) = unzip4 (tyConRes1 ++ tyConRes2)
; return $ VectInfo
{ vectInfoVar = mkVarEnv vVars
, vectInfoTyCon = mkNameEnv vTyCons
, vectInfoDataCon = mkNameEnv (concat vDataCons)
+ , vectInfoPADFun = mkNameEnv vPAs
, vectInfoIso = mkNameEnv vIsos
}
}
}
vectTyConMapping name
= do { vName <- lookupOrig mod (mkVectTyConOcc (nameOccName name))
+ ; paName <- lookupOrig mod (mkPADFunOcc (nameOccName name))
; isoName <- lookupOrig mod (mkVectIsoOcc (nameOccName name))
; let { tycon = lookupTyCon name
; vTycon = lookupTyCon vName
+ ; paTycon = lookupVar paName
; isoTycon = lookupVar isoName
}
; vDataCons <- mapM vectDataConMapping (tyConDataCons tycon)
; return ((name, (tycon, vTycon)), -- (T, T_v)
vDataCons, -- list of (Ci, Ci_v)
+ (vName, (vTycon, paTycon)), -- (T_v, paT)
(name, (tycon, isoTycon))) -- (T, isoT)
}
vectTyConReuseMapping name
- = do { isoName <- lookupOrig mod (mkVectIsoOcc (nameOccName name))
+ = do { paName <- lookupOrig mod (mkPADFunOcc (nameOccName name))
+ ; isoName <- lookupOrig mod (mkVectIsoOcc (nameOccName name))
; let { tycon = lookupTyCon name
+ ; paTycon = lookupVar paName
; isoTycon = lookupVar isoName
; vDataCons = [ (dataConName dc, (dc, dc))
| dc <- tyConDataCons tycon]
}
; return ((name, (tycon, tycon)), -- (T, T)
vDataCons, -- list of (Ci, Ci)
+ (name, (tycon, paTycon)), -- (T, paT)
(name, (tycon, isoTycon))) -- (T, isoT)
}
vectDataConMapping datacon