Use existing function uniqAway instead of duplicating code
[ghc-hetmet.git] / compiler / rename / RnEnv.lhs
index 76360ca..32806f0 100644 (file)
@@ -179,7 +179,9 @@ lookupTopBndrRn rdr_name
   | otherwise
   = do { mb_gre <- lookupGreLocalRn rdr_name
        ; case mb_gre of
-               Nothing  -> unboundName rdr_name
+               Nothing  -> do
+                             traceRn $ text "lookupTopBndrRn"
+                             unboundName rdr_name
                Just gre -> returnM (gre_name gre) }
              
 -- lookupLocatedSigOccRn is used for type signatures and pragmas
@@ -244,15 +246,10 @@ newIPNameRn ip_rdr = newIPName (mapIPName rdrNameOcc ip_rdr)
 --
 lookupFamInstDeclBndr :: Module -> Located RdrName -> RnM Name
 lookupFamInstDeclBndr mod lrdr_name@(L _ rdr_name)
-  | not (isSrcRdrName rdr_name)
-  = lookupImportedName rdr_name        
-
-  | otherwise
-  =    -- First look up the name in the normal environment.
-   lookupGreRn_maybe rdr_name          `thenM` \ mb_gre ->
-   case mb_gre of {
-       Just gre -> returnM (gre_name gre) ;
-       Nothing  -> newTopSrcBinder mod lrdr_name }
+  = do { mb_gre <- lookupGreRn_maybe rdr_name
+       ; case mb_gre of
+           Just gre -> returnM (gre_name gre) ;
+          Nothing  -> newTopSrcBinder mod lrdr_name }
 
 --------------------------------------------------
 --             Occurrences
@@ -297,7 +294,8 @@ lookupGlobalOccRn rdr_name
    if isQual rdr_name && mod == iNTERACTIVE then       
                                        -- This test is not expensive,
        lookupQualifiedName rdr_name    -- and only happens for failed lookups
-   else        
+   else        do
+        traceRn $ text "lookupGlobalOccRn"
        unboundName rdr_name }
 
 lookupImportedName :: RdrName -> TcRnIf m n Name
@@ -353,7 +351,8 @@ lookupGreRn rdr_name
        ; case mb_gre of {
            Just gre -> return gre ;
            Nothing  -> do
-       { name <- unboundName rdr_name
+       { traceRn $ text "lookupGreRn"
+       ; name <- unboundName rdr_name
        ; return (GRE { gre_name = name, gre_par = NoParent,
                        gre_prov = LocalDef }) }}}
 
@@ -776,12 +775,12 @@ warnUnusedMatches    names = ifOptM Opt_WarnUnusedMatches (warnUnusedLocals name
 -------------------------
 --     Helpers
 warnUnusedGREs gres 
- = warnUnusedBinds [(n,Just p) | GRE {gre_name = n, gre_prov = p} <- gres]
+ = warnUnusedBinds [(n,p) | GRE {gre_name = n, gre_prov = p} <- gres]
 
 warnUnusedLocals names
- = warnUnusedBinds [(n,Nothing) | n<-names]
+ = warnUnusedBinds [(n,LocalDef) | n<-names]
 
-warnUnusedBinds :: [(Name,Maybe Provenance)] -> RnM ()
+warnUnusedBinds :: [(Name,Provenance)] -> RnM ()
 warnUnusedBinds names  = mappM_ warnUnusedName (filter reportable names)
  where reportable (name,_) 
        | isWiredInName name = False    -- Don't report unused wired-in names
@@ -791,23 +790,25 @@ warnUnusedBinds names  = mappM_ warnUnusedName (filter reportable names)
 
 -------------------------
 
-warnUnusedName :: (Name, Maybe Provenance) -> RnM ()
-warnUnusedName (name, prov)
-  = addWarnAt loc $
+warnUnusedName :: (Name, Provenance) -> RnM ()
+warnUnusedName (name, LocalDef)
+  = addUnusedWarning name (srcLocSpan (nameSrcLoc name)) 
+                    (ptext SLIT("Defined but not used"))
+
+warnUnusedName (name, Imported is)
+  = mapM_ warn is
+  where
+    warn spec = addUnusedWarning name span msg
+       where
+          span = importSpecLoc spec
+          pp_mod = quotes (ppr (importSpecModule spec))
+          msg = ptext SLIT("Imported from") <+> pp_mod <+> ptext SLIT("but not used")
+
+addUnusedWarning name span msg
+  = addWarnAt span $
     sep [msg <> colon, 
         nest 2 $ pprNonVarNameSpace (occNameSpace (nameOccName name))
                        <+> quotes (ppr name)]
-       -- TODO should be a proper span
-  where
-    (loc,msg) = case prov of
-                 Just (Imported is)
-                       -> (importSpecLoc imp_spec, imp_from (importSpecModule imp_spec))
-                       where
-                         imp_spec = head is
-                 other -> (srcLocSpan (nameSrcLoc name), unused_msg)
-
-    unused_msg   = text "Defined but not used"
-    imp_from mod = text "Imported from" <+> quotes (ppr mod) <+> text "but not used"
 \end{code}
 
 \begin{code}