X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=adb1082e49185b5323139a9b3e9390f0514c3733;hb=bb88e732b7383c10496c0f60c3bdea2c22362cc6;hp=29b2b3eb0dc7cb805a071a47e003e094344dff76;hpb=f5eaddd403cee4691d326a256649477d6891fefb;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 29b2b3e..adb1082 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -10,6 +10,7 @@ module Name ( -- The Name type Name, -- Abstract + BuiltInSyntax(..), mkInternalName, mkSystemName, mkSystemNameEncoded, mkSysTvName, mkFCallName, mkIPName, @@ -23,7 +24,7 @@ module Name ( nameSrcLoc, nameParent, nameParent_maybe, isSystemName, isInternalName, isExternalName, - isTyVarName, isDllName, isWiredInName, + isTyVarName, isDllName, isWiredInName, isBuiltInSyntax, wiredInNameTyThing_maybe, nameIsLocalOrFrom, isHomePackageName, @@ -70,7 +71,7 @@ data NameSort -- e.g. data constructor of a data type, method of a class -- Nothing => not a subordinate - | WiredIn Module (Maybe Name) TyThing + | WiredIn Module (Maybe Name) TyThing BuiltInSyntax -- A variant of External, for wired-in things | Internal -- A user-defined Id or TyVar @@ -78,6 +79,11 @@ data NameSort | System -- A system-defined Id or TyVar. Typically the -- OccName is very uninformative (like 's') + +data BuiltInSyntax = BuiltInSyntax | UserSyntax +-- BuiltInSyntax is for things like (:), [], tuples etc, +-- which have special syntactic forms. They aren't "in scope" +-- as such. \end{code} Notes about the NameSorts: @@ -103,6 +109,14 @@ Notes about the NameSorts: If any desugarer sys-locals have survived that far, they get changed to "ds1", "ds2", etc. +Built-in syntax => It's a syntactic form, not "in scope" (e.g. []) + +Wired-in thing => The thing (Id, TyCon) is fully known to the compiler, + not read from an interface file. + E.g. Bool, True, Int, Float, and many others + +All built-in syntax is for wired-in things. + \begin{code} nameUnique :: Name -> Unique nameOccName :: Name -> OccName @@ -123,23 +137,26 @@ isSystemName :: Name -> Bool isHomePackageName :: Name -> Bool isWiredInName :: Name -> Bool -isWiredInName (Name {n_sort = WiredIn _ _ _}) = True -isWiredInName other = False +isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True +isWiredInName other = False wiredInNameTyThing_maybe :: Name -> Maybe TyThing -wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing}) = Just thing -wiredInNameTyThing_maybe other = Nothing +wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing +wiredInNameTyThing_maybe other = Nothing -isExternalName (Name {n_sort = External _ _}) = True -isExternalName (Name {n_sort = WiredIn _ _ _}) = True -isExternalName other = False +isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True +isBuiltInSyntax other = False + +isExternalName (Name {n_sort = External _ _}) = True +isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True +isExternalName other = False isInternalName name = not (isExternalName name) nameParent_maybe :: Name -> Maybe Name -nameParent_maybe (Name {n_sort = External _ p}) = p -nameParent_maybe (Name {n_sort = WiredIn _ p _}) = p -nameParent_maybe other = Nothing +nameParent_maybe (Name {n_sort = External _ p}) = p +nameParent_maybe (Name {n_sort = WiredIn _ p _ _}) = p +nameParent_maybe other = Nothing nameParent :: Name -> Name nameParent name = case nameParent_maybe name of @@ -149,9 +166,9 @@ nameParent name = case nameParent_maybe name of nameModule name = nameModule_maybe name `orElse` pprPanic "nameModule" (ppr name) nameModuleName name = moduleName (nameModule name) -nameModule_maybe (Name { n_sort = External mod _}) = Just mod -nameModule_maybe (Name { n_sort = WiredIn mod _ _}) = Just mod -nameModule_maybe name = Nothing +nameModule_maybe (Name { n_sort = External mod _}) = Just mod +nameModule_maybe (Name { n_sort = WiredIn mod _ _ _}) = Just mod +nameModule_maybe name = Nothing nameIsLocalOrFrom from name | isExternalName name = from == nameModule name @@ -195,10 +212,11 @@ mkExternalName uniq mod occ mb_parent loc = Name { n_uniq = uniq, n_sort = External mod mb_parent, n_occ = occ, n_loc = loc } -mkWiredInName :: Module -> OccName -> Unique -> Maybe Name -> TyThing -> Name -mkWiredInName mod occ uniq mb_parent thing +mkWiredInName :: Module -> OccName -> Unique + -> Maybe Name -> TyThing -> BuiltInSyntax -> Name +mkWiredInName mod occ uniq mb_parent thing built_in = Name { n_uniq = uniq, - n_sort = WiredIn mod mb_parent thing, + n_sort = WiredIn mod mb_parent thing built_in, n_occ = occ, n_loc = wiredInSrcLoc } mkSystemName :: Unique -> UserFS -> Name @@ -303,12 +321,14 @@ instance OutputableBndr Name where pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) = getPprStyle $ \ sty -> case sort of - External mod mb_p -> pprExternal sty uniq mod occ mb_p False - WiredIn mod mb_p thing -> pprExternal sty uniq mod occ mb_p True - System -> pprSystem sty uniq occ - Internal -> pprInternal sty uniq occ + WiredIn mod _ _ BuiltInSyntax -> pprOccName occ -- Built-in syntax is never qualified + WiredIn mod _ _ UserSyntax -> pprExternal sty uniq mod occ True + External mod _ -> pprExternal sty uniq mod occ False + System -> pprSystem sty uniq occ + Internal -> pprInternal sty uniq occ -pprExternal sty uniq mod occ mb_p is_wired +pprExternal sty uniq mod occ is_wired + | unqualStyle sty mod_name occ = pprOccName occ | codeStyle sty = ppr mod_name <> char '_' <> pprOccName occ | debugStyle sty = sep [ppr mod_name <> dot <> pprOccName occ, hsep [text "{-" @@ -318,7 +338,6 @@ pprExternal sty uniq mod occ mb_p is_wired -- Nothing -> empty -- Just n -> brackets (ppr n) , text "-}"]] - | unqualStyle sty mod_name occ = pprOccName occ | otherwise = ppr mod_name <> dot <> pprOccName occ where mod_name = moduleName mod