Add Data and Typeable instances to HsSyn
[ghc-hetmet.git] / compiler / basicTypes / RdrName.lhs
index 5baebbc..69b791f 100644 (file)
@@ -4,6 +4,7 @@
 %
 
 \begin{code}
+{-# LANGUAGE DeriveDataTypeable #-}
 
 -- |
 -- #name_types#
@@ -40,7 +41,7 @@ module RdrName (
        showRdrName,
 
        -- * Local mapping of 'RdrName' to 'Name.Name'
-       LocalRdrEnv, emptyLocalRdrEnv, extendLocalRdrEnv,
+       LocalRdrEnv, emptyLocalRdrEnv, extendLocalRdrEnv, extendLocalRdrEnvList,
        lookupLocalRdrEnv, lookupLocalRdrOcc, elemLocalRdrEnv,
 
        -- * Global mapping of 'RdrName' to 'GlobalRdrElt's
@@ -48,7 +49,7 @@ module RdrName (
        lookupGlobalRdrEnv, extendGlobalRdrEnv,
        pprGlobalRdrEnv, globalRdrEnvElts,
        lookupGRE_RdrName, lookupGRE_Name, getGRE_NameQualifier_maybes,
-        hideSomeUnquals, findLocalDupsRdrEnv,
+        hideSomeUnquals, findLocalDupsRdrEnv, pickGREs,
 
        -- ** Global 'RdrName' mapping elements: 'GlobalRdrElt', 'Provenance', 'ImportSpec'
        GlobalRdrElt(..), isLocalGRE, unQualOK, qualSpecOK, unQualSpecOK,
@@ -67,6 +68,8 @@ import SrcLoc
 import FastString
 import Outputable
 import Util
+
+import Data.Data
 \end{code}
 
 %************************************************************************
@@ -107,6 +110,7 @@ data RdrName
        --  (2) By Template Haskell, when TH has generated a unique name
        --
        -- Such a 'RdrName' can be created by using 'getRdrName' on a 'Name'
+  deriving (Data, Typeable)
 \end{code}
 
 
@@ -143,7 +147,8 @@ setRdrNameSpace :: RdrName -> NameSpace -> RdrName
 setRdrNameSpace (Unqual occ) ns = Unqual (setOccNameSpace ns occ)
 setRdrNameSpace (Qual m occ) ns = Qual m (setOccNameSpace ns occ)
 setRdrNameSpace (Orig m occ) ns = Orig m (setOccNameSpace ns occ)
-setRdrNameSpace (Exact n)    ns = Orig (nameModule n)
+setRdrNameSpace (Exact n)    ns = ASSERT( isExternalName n ) 
+                                 Orig (nameModule n)
                                       (setOccNameSpace ns (nameOccName n))
 \end{code}
 
@@ -163,7 +168,8 @@ mkOrig mod occ = Orig mod occ
 -- is derived from that of it's parent using the supplied function
 mkDerivedRdrName :: Name -> (OccName -> OccName) -> RdrName
 mkDerivedRdrName parent mk_occ
-  = mkOrig (nameModule parent) (mk_occ (nameOccName parent))
+  = ASSERT2( isExternalName parent, ppr parent )
+    mkOrig (nameModule parent) (mk_occ (nameOccName parent))
 
 ---------------
        -- These two are used when parsing source files
@@ -249,7 +255,7 @@ instance Outputable RdrName where
     ppr (Exact name)   = ppr name
     ppr (Unqual occ)   = ppr occ
     ppr (Qual mod occ) = ppr mod <> dot <> ppr occ
-    ppr (Orig mod occ) = ppr mod <> dot <> ppr occ
+    ppr (Orig mod occ) = getPprStyle (\sty -> pprModulePrefix sty mod occ <> ppr occ)
 
 instance OutputableBndr RdrName where
     pprBndr _ n 
@@ -314,8 +320,12 @@ type LocalRdrEnv = OccEnv Name
 emptyLocalRdrEnv :: LocalRdrEnv
 emptyLocalRdrEnv = emptyOccEnv
 
-extendLocalRdrEnv :: LocalRdrEnv -> [Name] -> LocalRdrEnv
-extendLocalRdrEnv env names
+extendLocalRdrEnv :: LocalRdrEnv -> Name -> LocalRdrEnv
+extendLocalRdrEnv env name
+  = extendOccEnv env (nameOccName name) name
+
+extendLocalRdrEnvList :: LocalRdrEnv -> [Name] -> LocalRdrEnv
+extendLocalRdrEnvList env names
   = extendOccEnvList env [(nameOccName n, n) | n <- names]
 
 lookupLocalRdrEnv :: LocalRdrEnv -> RdrName -> Maybe Name
@@ -351,6 +361,12 @@ type GlobalRdrEnv = OccEnv [GlobalRdrElt]
 --
 -- INVARIANT: All the members of the list have distinct 
 --           'gre_name' fields; that is, no duplicate Names
+--
+-- INVARIANT: Imported provenance => Name is an ExternalName
+--           However LocalDefs can have an InternalName.  This
+--           happens only when type-checking a [d| ... |] Template
+--           Haskell quotation; see this note in RnNames
+--           Note [Top-level Names in Template Haskell decl quotes]
 
 -- | An element of the 'GlobalRdrEnv'
 data GlobalRdrElt 
@@ -359,6 +375,12 @@ data GlobalRdrElt
          gre_prov :: Provenance        -- ^ Why it's in scope
     }
 
+-- | The children of a Name are the things that are abbreviated by the ".."
+--   notation in export lists.  Specifically:
+--     TyCon   Children are * data constructors
+--                          * record field ids
+--     Class   Children are * class operations
+-- Each child has the parent thing as its Parent
 data Parent = NoParent | ParentIs Name
              deriving (Eq)
 
@@ -410,10 +432,9 @@ lookupGlobalRdrEnv env occ_name = case lookupOccEnv env occ_name of
                                        Just gres -> gres
 
 extendGlobalRdrEnv :: GlobalRdrEnv -> GlobalRdrElt -> GlobalRdrEnv
-extendGlobalRdrEnv env gre = extendOccEnv_C add env occ [gre]
+extendGlobalRdrEnv env gre = extendOccEnv_Acc (:) singleton env occ gre
   where
     occ = nameOccName (gre_name gre)
-    add gres _ = gre:gres
 
 lookupGRE_RdrName :: RdrName -> GlobalRdrEnv -> [GlobalRdrElt]
 lookupGRE_RdrName rdr_name env
@@ -459,16 +480,17 @@ pickGREs rdr_name gres
 
     pick :: GlobalRdrElt -> Maybe GlobalRdrElt
     pick gre@(GRE {gre_prov = LocalDef, gre_name = n})         -- Local def
-       | rdr_is_unqual                         = Just gre
-       | Just (mod,_) <- rdr_is_qual, 
-         mod == moduleName (nameModule n)      = Just gre
-       | otherwise                             = Nothing
+       | rdr_is_unqual                    = Just gre
+       | Just (mod,_) <- rdr_is_qual        -- Qualified name
+       , Just n_mod <- nameModule_maybe n   -- Binder is External
+       , mod == moduleName n_mod          = Just gre
+       | otherwise                        = Nothing
     pick gre@(GRE {gre_prov = Imported [is]})  -- Single import (efficiency)
        | rdr_is_unqual,
-         not (is_qual (is_decl is))            = Just gre
+         not (is_qual (is_decl is))    = Just gre
        | Just (mod,_) <- rdr_is_qual, 
-         mod == is_as (is_decl is)             = Just gre
-       | otherwise                             = Nothing
+         mod == is_as (is_decl is)     = Just gre
+       | otherwise                     = Nothing
     pick gre@(GRE {gre_prov = Imported is})    -- Multiple import
        | null filtered_is = Nothing
        | otherwise        = Just (gre {gre_prov = Imported filtered_is})
@@ -496,9 +518,9 @@ mkGlobalRdrEnv :: [GlobalRdrElt] -> GlobalRdrEnv
 mkGlobalRdrEnv gres
   = foldr add emptyGlobalRdrEnv gres
   where
-    add gre env = extendOccEnv_C (foldr insertGRE) env 
-                                (nameOccName (gre_name gre)) 
-                                [gre]
+    add gre env = extendOccEnv_Acc insertGRE singleton env 
+                                  (nameOccName (gre_name gre)) 
+                                  gre
 
 findLocalDupsRdrEnv :: GlobalRdrEnv -> [OccName] -> (GlobalRdrEnv, [[Name]])
 -- ^ For each 'OccName', see if there are multiple local definitions
@@ -556,7 +578,7 @@ hideSomeUnquals rdr_env occs
     qual_gre gre@(GRE { gre_name = name, gre_prov = LocalDef })
        = gre { gre_prov = Imported [imp_spec] }
        where   -- Local defs get transfomed to (fake) imported things
-         mod = moduleName (nameModule name)
+         mod = ASSERT2( isExternalName name, ppr name) moduleName (nameModule name)
          imp_spec = ImpSpec { is_item = ImpAll, is_decl = decl_spec }
          decl_spec = ImpDeclSpec { is_mod = mod, is_as = mod, 
                                    is_qual = True, 
@@ -601,7 +623,7 @@ data ImpDeclSpec
                                    -- should be a Maybe PackageId here too.
        is_as       :: ModuleName, -- ^ Import alias, e.g. from @as M@ (or @Muggle@ if there is no @as@ clause)
        is_qual     :: Bool,       -- ^ Was this import qualified?
-       is_dloc     :: SrcSpan     -- ^ The location of the import declaration
+       is_dloc     :: SrcSpan     -- ^ The location of the entire import declaration
     }
 
 -- | Describes import info a particular Name