PageRenderTime 61ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/compiler/basicTypes/OccName.hs

http://github.com/ghc/ghc
Haskell | 944 lines | 481 code | 125 blank | 338 comment | 12 complexity | f309c5250be381e96f88ed0797db77de MD5 | raw file
Possible License(s): MIT, BSD-3-Clause, GPL-3.0
  1. {-
  2. (c) The University of Glasgow 2006
  3. (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
  4. -}
  5. {-# LANGUAGE DeriveDataTypeable #-}
  6. {-# LANGUAGE BangPatterns #-}
  7. {-# LANGUAGE OverloadedStrings #-}
  8. -- |
  9. -- #name_types#
  10. -- GHC uses several kinds of name internally:
  11. --
  12. -- * 'OccName.OccName' represents names as strings with just a little more information:
  13. -- the \"namespace\" that the name came from, e.g. the namespace of value, type constructors or
  14. -- data constructors
  15. --
  16. -- * 'RdrName.RdrName': see "RdrName#name_types"
  17. --
  18. -- * 'Name.Name': see "Name#name_types"
  19. --
  20. -- * 'Id.Id': see "Id#name_types"
  21. --
  22. -- * 'Var.Var': see "Var#name_types"
  23. module OccName (
  24. -- * The 'NameSpace' type
  25. NameSpace, -- Abstract
  26. nameSpacesRelated,
  27. -- ** Construction
  28. -- $real_vs_source_data_constructors
  29. tcName, clsName, tcClsName, dataName, varName,
  30. tvName, srcDataName,
  31. -- ** Pretty Printing
  32. pprNameSpace, pprNonVarNameSpace, pprNameSpaceBrief,
  33. -- * The 'OccName' type
  34. OccName, -- Abstract, instance of Outputable
  35. pprOccName,
  36. -- ** Construction
  37. mkOccName, mkOccNameFS,
  38. mkVarOcc, mkVarOccFS,
  39. mkDataOcc, mkDataOccFS,
  40. mkTyVarOcc, mkTyVarOccFS,
  41. mkTcOcc, mkTcOccFS,
  42. mkClsOcc, mkClsOccFS,
  43. mkDFunOcc,
  44. setOccNameSpace,
  45. demoteOccName,
  46. HasOccName(..),
  47. -- ** Derived 'OccName's
  48. isDerivedOccName,
  49. mkDataConWrapperOcc, mkWorkerOcc,
  50. mkMatcherOcc, mkBuilderOcc,
  51. mkDefaultMethodOcc,
  52. mkNewTyCoOcc, mkClassOpAuxOcc,
  53. mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
  54. mkClassDataConOcc, mkDictOcc, mkIPOcc,
  55. mkSpecOcc, mkForeignExportOcc, mkRepEqOcc,
  56. mkGenR, mkGen1R,
  57. mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc,
  58. mkSuperDictSelOcc, mkSuperDictAuxOcc,
  59. mkLocalOcc, mkMethodOcc, mkInstTyTcOcc,
  60. mkInstTyCoOcc, mkEqPredCoOcc,
  61. mkVectOcc, mkVectTyConOcc, mkVectDataConOcc, mkVectIsoOcc,
  62. mkPDataTyConOcc, mkPDataDataConOcc,
  63. mkPDatasTyConOcc, mkPDatasDataConOcc,
  64. mkPReprTyConOcc,
  65. mkPADFunOcc,
  66. mkRecFldSelOcc,
  67. mkTyConRepOcc,
  68. -- ** Deconstruction
  69. occNameFS, occNameString, occNameSpace,
  70. isVarOcc, isTvOcc, isTcOcc, isDataOcc, isDataSymOcc, isSymOcc, isValOcc,
  71. parenSymOcc, startsWithUnderscore,
  72. isTcClsNameSpace, isTvNameSpace, isDataConNameSpace, isVarNameSpace, isValNameSpace,
  73. -- * The 'OccEnv' type
  74. OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
  75. lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
  76. occEnvElts, foldOccEnv, plusOccEnv, plusOccEnv_C, extendOccEnv_C,
  77. extendOccEnv_Acc, filterOccEnv, delListFromOccEnv, delFromOccEnv,
  78. alterOccEnv, pprOccEnv,
  79. -- * The 'OccSet' type
  80. OccSet, emptyOccSet, unitOccSet, mkOccSet, extendOccSet,
  81. extendOccSetList,
  82. unionOccSets, unionManyOccSets, minusOccSet, elemOccSet,
  83. isEmptyOccSet, intersectOccSet, intersectsOccSet,
  84. filterOccSet,
  85. -- * Tidying up
  86. TidyOccEnv, emptyTidyOccEnv, initTidyOccEnv,
  87. tidyOccName,
  88. tidyOccNames, avoidClashesOccEnv,
  89. -- FsEnv
  90. FastStringEnv, emptyFsEnv, lookupFsEnv, extendFsEnv, mkFsEnv
  91. ) where
  92. import Util
  93. import Unique
  94. import DynFlags
  95. import UniqFM
  96. import UniqSet
  97. import FastString
  98. import FastStringEnv
  99. import Outputable
  100. import Lexeme
  101. import Binary
  102. import Control.DeepSeq
  103. import Data.List (mapAccumL)
  104. import Data.Char
  105. import Data.Data
  106. {-
  107. ************************************************************************
  108. * *
  109. \subsection{Name space}
  110. * *
  111. ************************************************************************
  112. -}
  113. data NameSpace = VarName -- Variables, including "real" data constructors
  114. | DataName -- "Source" data constructors
  115. | TvName -- Type variables
  116. | TcClsName -- Type constructors and classes; Haskell has them
  117. -- in the same name space for now.
  118. deriving( Eq, Ord )
  119. {-! derive: Binary !-}
  120. -- Note [Data Constructors]
  121. -- see also: Note [Data Constructor Naming] in DataCon.hs
  122. --
  123. -- $real_vs_source_data_constructors
  124. -- There are two forms of data constructor:
  125. --
  126. -- [Source data constructors] The data constructors mentioned in Haskell source code
  127. --
  128. -- [Real data constructors] The data constructors of the representation type, which may not be the same as the source type
  129. --
  130. -- For example:
  131. --
  132. -- > data T = T !(Int, Int)
  133. --
  134. -- The source datacon has type @(Int, Int) -> T@
  135. -- The real datacon has type @Int -> Int -> T@
  136. --
  137. -- GHC chooses a representation based on the strictness etc.
  138. tcName, clsName, tcClsName :: NameSpace
  139. dataName, srcDataName :: NameSpace
  140. tvName, varName :: NameSpace
  141. -- Though type constructors and classes are in the same name space now,
  142. -- the NameSpace type is abstract, so we can easily separate them later
  143. tcName = TcClsName -- Type constructors
  144. clsName = TcClsName -- Classes
  145. tcClsName = TcClsName -- Not sure which!
  146. dataName = DataName
  147. srcDataName = DataName -- Haskell-source data constructors should be
  148. -- in the Data name space
  149. tvName = TvName
  150. varName = VarName
  151. isDataConNameSpace :: NameSpace -> Bool
  152. isDataConNameSpace DataName = True
  153. isDataConNameSpace _ = False
  154. isTcClsNameSpace :: NameSpace -> Bool
  155. isTcClsNameSpace TcClsName = True
  156. isTcClsNameSpace _ = False
  157. isTvNameSpace :: NameSpace -> Bool
  158. isTvNameSpace TvName = True
  159. isTvNameSpace _ = False
  160. isVarNameSpace :: NameSpace -> Bool -- Variables or type variables, but not constructors
  161. isVarNameSpace TvName = True
  162. isVarNameSpace VarName = True
  163. isVarNameSpace _ = False
  164. isValNameSpace :: NameSpace -> Bool
  165. isValNameSpace DataName = True
  166. isValNameSpace VarName = True
  167. isValNameSpace _ = False
  168. pprNameSpace :: NameSpace -> SDoc
  169. pprNameSpace DataName = text "data constructor"
  170. pprNameSpace VarName = text "variable"
  171. pprNameSpace TvName = text "type variable"
  172. pprNameSpace TcClsName = text "type constructor or class"
  173. pprNonVarNameSpace :: NameSpace -> SDoc
  174. pprNonVarNameSpace VarName = empty
  175. pprNonVarNameSpace ns = pprNameSpace ns
  176. pprNameSpaceBrief :: NameSpace -> SDoc
  177. pprNameSpaceBrief DataName = char 'd'
  178. pprNameSpaceBrief VarName = char 'v'
  179. pprNameSpaceBrief TvName = text "tv"
  180. pprNameSpaceBrief TcClsName = text "tc"
  181. -- demoteNameSpace lowers the NameSpace if possible. We can not know
  182. -- in advance, since a TvName can appear in an HsTyVar.
  183. -- See Note [Demotion] in RnEnv
  184. demoteNameSpace :: NameSpace -> Maybe NameSpace
  185. demoteNameSpace VarName = Nothing
  186. demoteNameSpace DataName = Nothing
  187. demoteNameSpace TvName = Nothing
  188. demoteNameSpace TcClsName = Just DataName
  189. {-
  190. ************************************************************************
  191. * *
  192. \subsection[Name-pieces-datatypes]{The @OccName@ datatypes}
  193. * *
  194. ************************************************************************
  195. -}
  196. -- | Occurrence Name
  197. --
  198. -- In this context that means:
  199. -- "classified (i.e. as a type name, value name, etc) but not qualified
  200. -- and not yet resolved"
  201. data OccName = OccName
  202. { occNameSpace :: !NameSpace
  203. , occNameFS :: !FastString
  204. }
  205. instance Eq OccName where
  206. (OccName sp1 s1) == (OccName sp2 s2) = s1 == s2 && sp1 == sp2
  207. instance Ord OccName where
  208. -- Compares lexicographically, *not* by Unique of the string
  209. compare (OccName sp1 s1) (OccName sp2 s2)
  210. = (s1 `compare` s2) `thenCmp` (sp1 `compare` sp2)
  211. instance Data OccName where
  212. -- don't traverse?
  213. toConstr _ = abstractConstr "OccName"
  214. gunfold _ _ = error "gunfold"
  215. dataTypeOf _ = mkNoRepType "OccName"
  216. instance HasOccName OccName where
  217. occName = id
  218. instance NFData OccName where
  219. rnf x = x `seq` ()
  220. {-
  221. ************************************************************************
  222. * *
  223. \subsection{Printing}
  224. * *
  225. ************************************************************************
  226. -}
  227. instance Outputable OccName where
  228. ppr = pprOccName
  229. instance OutputableBndr OccName where
  230. pprBndr _ = ppr
  231. pprInfixOcc n = pprInfixVar (isSymOcc n) (ppr n)
  232. pprPrefixOcc n = pprPrefixVar (isSymOcc n) (ppr n)
  233. pprOccName :: OccName -> SDoc
  234. pprOccName (OccName sp occ)
  235. = getPprStyle $ \ sty ->
  236. if codeStyle sty
  237. then ztext (zEncodeFS occ)
  238. else pp_occ <> pp_debug sty
  239. where
  240. pp_debug sty | debugStyle sty = braces (pprNameSpaceBrief sp)
  241. | otherwise = empty
  242. pp_occ = sdocWithDynFlags $ \dflags ->
  243. if gopt Opt_SuppressUniques dflags
  244. then text (strip_th_unique (unpackFS occ))
  245. else ftext occ
  246. -- See Note [Suppressing uniques in OccNames]
  247. strip_th_unique ('[' : c : _) | isAlphaNum c = []
  248. strip_th_unique (c : cs) = c : strip_th_unique cs
  249. strip_th_unique [] = []
  250. {-
  251. Note [Suppressing uniques in OccNames]
  252. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  253. This is a hack to de-wobblify the OccNames that contain uniques from
  254. Template Haskell that have been turned into a string in the OccName.
  255. See Note [Unique OccNames from Template Haskell] in Convert.hs
  256. ************************************************************************
  257. * *
  258. \subsection{Construction}
  259. * *
  260. ************************************************************************
  261. -}
  262. mkOccName :: NameSpace -> String -> OccName
  263. mkOccName occ_sp str = OccName occ_sp (mkFastString str)
  264. mkOccNameFS :: NameSpace -> FastString -> OccName
  265. mkOccNameFS occ_sp fs = OccName occ_sp fs
  266. mkVarOcc :: String -> OccName
  267. mkVarOcc s = mkOccName varName s
  268. mkVarOccFS :: FastString -> OccName
  269. mkVarOccFS fs = mkOccNameFS varName fs
  270. mkDataOcc :: String -> OccName
  271. mkDataOcc = mkOccName dataName
  272. mkDataOccFS :: FastString -> OccName
  273. mkDataOccFS = mkOccNameFS dataName
  274. mkTyVarOcc :: String -> OccName
  275. mkTyVarOcc = mkOccName tvName
  276. mkTyVarOccFS :: FastString -> OccName
  277. mkTyVarOccFS fs = mkOccNameFS tvName fs
  278. mkTcOcc :: String -> OccName
  279. mkTcOcc = mkOccName tcName
  280. mkTcOccFS :: FastString -> OccName
  281. mkTcOccFS = mkOccNameFS tcName
  282. mkClsOcc :: String -> OccName
  283. mkClsOcc = mkOccName clsName
  284. mkClsOccFS :: FastString -> OccName
  285. mkClsOccFS = mkOccNameFS clsName
  286. -- demoteOccName lowers the Namespace of OccName.
  287. -- see Note [Demotion]
  288. demoteOccName :: OccName -> Maybe OccName
  289. demoteOccName (OccName space name) = do
  290. space' <- demoteNameSpace space
  291. return $ OccName space' name
  292. -- Name spaces are related if there is a chance to mean the one when one writes
  293. -- the other, i.e. variables <-> data constructors and type variables <-> type constructors
  294. nameSpacesRelated :: NameSpace -> NameSpace -> Bool
  295. nameSpacesRelated ns1 ns2 = ns1 == ns2 || otherNameSpace ns1 == ns2
  296. otherNameSpace :: NameSpace -> NameSpace
  297. otherNameSpace VarName = DataName
  298. otherNameSpace DataName = VarName
  299. otherNameSpace TvName = TcClsName
  300. otherNameSpace TcClsName = TvName
  301. {- | Other names in the compiler add additional information to an OccName.
  302. This class provides a consistent way to access the underlying OccName. -}
  303. class HasOccName name where
  304. occName :: name -> OccName
  305. {-
  306. ************************************************************************
  307. * *
  308. Environments
  309. * *
  310. ************************************************************************
  311. OccEnvs are used mainly for the envts in ModIfaces.
  312. Note [The Unique of an OccName]
  313. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  314. They are efficient, because FastStrings have unique Int# keys. We assume
  315. this key is less than 2^24, and indeed FastStrings are allocated keys
  316. sequentially starting at 0.
  317. So we can make a Unique using
  318. mkUnique ns key :: Unique
  319. where 'ns' is a Char representing the name space. This in turn makes it
  320. easy to build an OccEnv.
  321. -}
  322. instance Uniquable OccName where
  323. -- See Note [The Unique of an OccName]
  324. getUnique (OccName VarName fs) = mkVarOccUnique fs
  325. getUnique (OccName DataName fs) = mkDataOccUnique fs
  326. getUnique (OccName TvName fs) = mkTvOccUnique fs
  327. getUnique (OccName TcClsName fs) = mkTcOccUnique fs
  328. newtype OccEnv a = A (UniqFM a)
  329. deriving Data
  330. emptyOccEnv :: OccEnv a
  331. unitOccEnv :: OccName -> a -> OccEnv a
  332. extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
  333. extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
  334. lookupOccEnv :: OccEnv a -> OccName -> Maybe a
  335. mkOccEnv :: [(OccName,a)] -> OccEnv a
  336. mkOccEnv_C :: (a -> a -> a) -> [(OccName,a)] -> OccEnv a
  337. elemOccEnv :: OccName -> OccEnv a -> Bool
  338. foldOccEnv :: (a -> b -> b) -> b -> OccEnv a -> b
  339. occEnvElts :: OccEnv a -> [a]
  340. extendOccEnv_C :: (a->a->a) -> OccEnv a -> OccName -> a -> OccEnv a
  341. extendOccEnv_Acc :: (a->b->b) -> (a->b) -> OccEnv b -> OccName -> a -> OccEnv b
  342. plusOccEnv :: OccEnv a -> OccEnv a -> OccEnv a
  343. plusOccEnv_C :: (a->a->a) -> OccEnv a -> OccEnv a -> OccEnv a
  344. mapOccEnv :: (a->b) -> OccEnv a -> OccEnv b
  345. delFromOccEnv :: OccEnv a -> OccName -> OccEnv a
  346. delListFromOccEnv :: OccEnv a -> [OccName] -> OccEnv a
  347. filterOccEnv :: (elt -> Bool) -> OccEnv elt -> OccEnv elt
  348. alterOccEnv :: (Maybe elt -> Maybe elt) -> OccEnv elt -> OccName -> OccEnv elt
  349. emptyOccEnv = A emptyUFM
  350. unitOccEnv x y = A $ unitUFM x y
  351. extendOccEnv (A x) y z = A $ addToUFM x y z
  352. extendOccEnvList (A x) l = A $ addListToUFM x l
  353. lookupOccEnv (A x) y = lookupUFM x y
  354. mkOccEnv l = A $ listToUFM l
  355. elemOccEnv x (A y) = elemUFM x y
  356. foldOccEnv a b (A c) = foldUFM a b c
  357. occEnvElts (A x) = eltsUFM x
  358. plusOccEnv (A x) (A y) = A $ plusUFM x y
  359. plusOccEnv_C f (A x) (A y) = A $ plusUFM_C f x y
  360. extendOccEnv_C f (A x) y z = A $ addToUFM_C f x y z
  361. extendOccEnv_Acc f g (A x) y z = A $ addToUFM_Acc f g x y z
  362. mapOccEnv f (A x) = A $ mapUFM f x
  363. mkOccEnv_C comb l = A $ addListToUFM_C comb emptyUFM l
  364. delFromOccEnv (A x) y = A $ delFromUFM x y
  365. delListFromOccEnv (A x) y = A $ delListFromUFM x y
  366. filterOccEnv x (A y) = A $ filterUFM x y
  367. alterOccEnv fn (A y) k = A $ alterUFM fn y k
  368. instance Outputable a => Outputable (OccEnv a) where
  369. ppr x = pprOccEnv ppr x
  370. pprOccEnv :: (a -> SDoc) -> OccEnv a -> SDoc
  371. pprOccEnv ppr_elt (A env) = pprUniqFM ppr_elt env
  372. type OccSet = UniqSet OccName
  373. emptyOccSet :: OccSet
  374. unitOccSet :: OccName -> OccSet
  375. mkOccSet :: [OccName] -> OccSet
  376. extendOccSet :: OccSet -> OccName -> OccSet
  377. extendOccSetList :: OccSet -> [OccName] -> OccSet
  378. unionOccSets :: OccSet -> OccSet -> OccSet
  379. unionManyOccSets :: [OccSet] -> OccSet
  380. minusOccSet :: OccSet -> OccSet -> OccSet
  381. elemOccSet :: OccName -> OccSet -> Bool
  382. isEmptyOccSet :: OccSet -> Bool
  383. intersectOccSet :: OccSet -> OccSet -> OccSet
  384. intersectsOccSet :: OccSet -> OccSet -> Bool
  385. filterOccSet :: (OccName -> Bool) -> OccSet -> OccSet
  386. emptyOccSet = emptyUniqSet
  387. unitOccSet = unitUniqSet
  388. mkOccSet = mkUniqSet
  389. extendOccSet = addOneToUniqSet
  390. extendOccSetList = addListToUniqSet
  391. unionOccSets = unionUniqSets
  392. unionManyOccSets = unionManyUniqSets
  393. minusOccSet = minusUniqSet
  394. elemOccSet = elementOfUniqSet
  395. isEmptyOccSet = isEmptyUniqSet
  396. intersectOccSet = intersectUniqSets
  397. intersectsOccSet s1 s2 = not (isEmptyOccSet (s1 `intersectOccSet` s2))
  398. filterOccSet = filterUniqSet
  399. {-
  400. ************************************************************************
  401. * *
  402. \subsection{Predicates and taking them apart}
  403. * *
  404. ************************************************************************
  405. -}
  406. occNameString :: OccName -> String
  407. occNameString (OccName _ s) = unpackFS s
  408. setOccNameSpace :: NameSpace -> OccName -> OccName
  409. setOccNameSpace sp (OccName _ occ) = OccName sp occ
  410. isVarOcc, isTvOcc, isTcOcc, isDataOcc :: OccName -> Bool
  411. isVarOcc (OccName VarName _) = True
  412. isVarOcc _ = False
  413. isTvOcc (OccName TvName _) = True
  414. isTvOcc _ = False
  415. isTcOcc (OccName TcClsName _) = True
  416. isTcOcc _ = False
  417. -- | /Value/ 'OccNames's are those that are either in
  418. -- the variable or data constructor namespaces
  419. isValOcc :: OccName -> Bool
  420. isValOcc (OccName VarName _) = True
  421. isValOcc (OccName DataName _) = True
  422. isValOcc _ = False
  423. isDataOcc (OccName DataName _) = True
  424. isDataOcc _ = False
  425. -- | Test if the 'OccName' is a data constructor that starts with
  426. -- a symbol (e.g. @:@, or @[]@)
  427. isDataSymOcc :: OccName -> Bool
  428. isDataSymOcc (OccName DataName s) = isLexConSym s
  429. isDataSymOcc _ = False
  430. -- Pretty inefficient!
  431. -- | Test if the 'OccName' is that for any operator (whether
  432. -- it is a data constructor or variable or whatever)
  433. isSymOcc :: OccName -> Bool
  434. isSymOcc (OccName DataName s) = isLexConSym s
  435. isSymOcc (OccName TcClsName s) = isLexSym s
  436. isSymOcc (OccName VarName s) = isLexSym s
  437. isSymOcc (OccName TvName s) = isLexSym s
  438. -- Pretty inefficient!
  439. parenSymOcc :: OccName -> SDoc -> SDoc
  440. -- ^ Wrap parens around an operator
  441. parenSymOcc occ doc | isSymOcc occ = parens doc
  442. | otherwise = doc
  443. startsWithUnderscore :: OccName -> Bool
  444. -- ^ Haskell 98 encourages compilers to suppress warnings about unsed
  445. -- names in a pattern if they start with @_@: this implements that test
  446. startsWithUnderscore occ = headFS (occNameFS occ) == '_'
  447. {-
  448. ************************************************************************
  449. * *
  450. \subsection{Making system names}
  451. * *
  452. ************************************************************************
  453. Here's our convention for splitting up the interface file name space:
  454. d... dictionary identifiers
  455. (local variables, so no name-clash worries)
  456. All of these other OccNames contain a mixture of alphabetic
  457. and symbolic characters, and hence cannot possibly clash with
  458. a user-written type or function name
  459. $f... Dict-fun identifiers (from inst decls)
  460. $dmop Default method for 'op'
  461. $pnC n'th superclass selector for class C
  462. $wf Worker for function 'f'
  463. $sf.. Specialised version of f
  464. D:C Data constructor for dictionary for class C
  465. NTCo:T Coercion connecting newtype T with its representation type
  466. TFCo:R Coercion connecting a data family to its representation type R
  467. In encoded form these appear as Zdfxxx etc
  468. :... keywords (export:, letrec: etc.)
  469. --- I THINK THIS IS WRONG!
  470. This knowledge is encoded in the following functions.
  471. @mk_deriv@ generates an @OccName@ from the prefix and a string.
  472. NB: The string must already be encoded!
  473. -}
  474. -- | Build an 'OccName' derived from another 'OccName'.
  475. --
  476. -- Note that the pieces of the name are passed in as a @[FastString]@ so that
  477. -- the whole name can be constructed with a single 'concatFS', minimizing
  478. -- unnecessary intermediate allocations.
  479. mk_deriv :: NameSpace
  480. -> FastString -- ^ A prefix which distinguishes one sort of
  481. -- derived name from another
  482. -> [FastString] -- ^ The name we are deriving from in pieces which
  483. -- will be concatenated.
  484. -> OccName
  485. mk_deriv occ_sp sys_prefix str =
  486. mkOccNameFS occ_sp (concatFS $ sys_prefix : str)
  487. isDerivedOccName :: OccName -> Bool
  488. -- ^ Test for definitions internally generated by GHC. This predicte
  489. -- is used to suppress printing of internal definitions in some debug prints
  490. isDerivedOccName occ =
  491. case occNameString occ of
  492. '$':c:_ | isAlphaNum c -> True -- E.g. $wfoo
  493. c:':':_ | isAlphaNum c -> True -- E.g. N:blah newtype coercions
  494. _other -> False
  495. mkDataConWrapperOcc, mkWorkerOcc,
  496. mkMatcherOcc, mkBuilderOcc,
  497. mkDefaultMethodOcc,
  498. mkClassDataConOcc, mkDictOcc,
  499. mkIPOcc, mkSpecOcc, mkForeignExportOcc, mkRepEqOcc,
  500. mkGenR, mkGen1R,
  501. mkDataConWorkerOcc, mkNewTyCoOcc,
  502. mkInstTyCoOcc, mkEqPredCoOcc, mkClassOpAuxOcc,
  503. mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
  504. mkTyConRepOcc
  505. :: OccName -> OccName
  506. -- These derived variables have a prefix that no Haskell value could have
  507. mkDataConWrapperOcc = mk_simple_deriv varName "$W"
  508. mkWorkerOcc = mk_simple_deriv varName "$w"
  509. mkMatcherOcc = mk_simple_deriv varName "$m"
  510. mkBuilderOcc = mk_simple_deriv varName "$b"
  511. mkDefaultMethodOcc = mk_simple_deriv varName "$dm"
  512. mkClassOpAuxOcc = mk_simple_deriv varName "$c"
  513. mkDictOcc = mk_simple_deriv varName "$d"
  514. mkIPOcc = mk_simple_deriv varName "$i"
  515. mkSpecOcc = mk_simple_deriv varName "$s"
  516. mkForeignExportOcc = mk_simple_deriv varName "$f"
  517. mkRepEqOcc = mk_simple_deriv tvName "$r" -- In RULES involving Coercible
  518. mkClassDataConOcc = mk_simple_deriv dataName "C:" -- Data con for a class
  519. mkNewTyCoOcc = mk_simple_deriv tcName "N:" -- Coercion for newtypes
  520. mkInstTyCoOcc = mk_simple_deriv tcName "D:" -- Coercion for type functions
  521. mkEqPredCoOcc = mk_simple_deriv tcName "$co"
  522. -- Used in derived instances
  523. mkCon2TagOcc = mk_simple_deriv varName "$con2tag_"
  524. mkTag2ConOcc = mk_simple_deriv varName "$tag2con_"
  525. mkMaxTagOcc = mk_simple_deriv varName "$maxtag_"
  526. -- TyConRepName stuff; see Note [Grand plan for Typeable] in TcTypeable
  527. mkTyConRepOcc occ = mk_simple_deriv varName prefix occ
  528. where
  529. prefix | isDataOcc occ = "$tc'"
  530. | otherwise = "$tc"
  531. -- Generic deriving mechanism
  532. mkGenR = mk_simple_deriv tcName "Rep_"
  533. mkGen1R = mk_simple_deriv tcName "Rep1_"
  534. -- Vectorisation
  535. mkVectOcc, mkVectTyConOcc, mkVectDataConOcc, mkVectIsoOcc,
  536. mkPADFunOcc, mkPReprTyConOcc,
  537. mkPDataTyConOcc, mkPDataDataConOcc,
  538. mkPDatasTyConOcc, mkPDatasDataConOcc
  539. :: Maybe String -> OccName -> OccName
  540. mkVectOcc = mk_simple_deriv_with varName "$v"
  541. mkVectTyConOcc = mk_simple_deriv_with tcName "V:"
  542. mkVectDataConOcc = mk_simple_deriv_with dataName "VD:"
  543. mkVectIsoOcc = mk_simple_deriv_with varName "$vi"
  544. mkPADFunOcc = mk_simple_deriv_with varName "$pa"
  545. mkPReprTyConOcc = mk_simple_deriv_with tcName "VR:"
  546. mkPDataTyConOcc = mk_simple_deriv_with tcName "VP:"
  547. mkPDatasTyConOcc = mk_simple_deriv_with tcName "VPs:"
  548. mkPDataDataConOcc = mk_simple_deriv_with dataName "VPD:"
  549. mkPDatasDataConOcc = mk_simple_deriv_with dataName "VPDs:"
  550. -- Overloaded record field selectors
  551. mkRecFldSelOcc :: String -> OccName
  552. mkRecFldSelOcc s = mk_deriv varName "$sel" [fsLit s]
  553. mk_simple_deriv :: NameSpace -> FastString -> OccName -> OccName
  554. mk_simple_deriv sp px occ = mk_deriv sp px [occNameFS occ]
  555. mk_simple_deriv_with :: NameSpace -- ^ the namespace
  556. -> FastString -- ^ an identifying prefix
  557. -> Maybe String -- ^ another optional prefix
  558. -> OccName -- ^ the 'OccName' to derive from
  559. -> OccName
  560. mk_simple_deriv_with sp px Nothing occ = mk_deriv sp px [occNameFS occ]
  561. mk_simple_deriv_with sp px (Just with) occ =
  562. mk_deriv sp px [fsLit with, fsLit "_", occNameFS occ]
  563. -- Data constructor workers are made by setting the name space
  564. -- of the data constructor OccName (which should be a DataName)
  565. -- to VarName
  566. mkDataConWorkerOcc datacon_occ = setOccNameSpace varName datacon_occ
  567. mkSuperDictAuxOcc :: Int -> OccName -> OccName
  568. mkSuperDictAuxOcc index cls_tc_occ
  569. = mk_deriv varName "$cp" [fsLit $ show index, occNameFS cls_tc_occ]
  570. mkSuperDictSelOcc :: Int -- ^ Index of superclass, e.g. 3
  571. -> OccName -- ^ Class, e.g. @Ord@
  572. -> OccName -- ^ Derived 'Occname', e.g. @$p3Ord@
  573. mkSuperDictSelOcc index cls_tc_occ
  574. = mk_deriv varName "$p" [fsLit $ show index, occNameFS cls_tc_occ]
  575. mkLocalOcc :: Unique -- ^ Unique to combine with the 'OccName'
  576. -> OccName -- ^ Local name, e.g. @sat@
  577. -> OccName -- ^ Nice unique version, e.g. @$L23sat@
  578. mkLocalOcc uniq occ
  579. = mk_deriv varName "$L" [fsLit $ show uniq, occNameFS occ]
  580. -- The Unique might print with characters
  581. -- that need encoding (e.g. 'z'!)
  582. -- | Derive a name for the representation type constructor of a
  583. -- @data@\/@newtype@ instance.
  584. mkInstTyTcOcc :: String -- ^ Family name, e.g. @Map@
  585. -> OccSet -- ^ avoid these Occs
  586. -> OccName -- ^ @R:Map@
  587. mkInstTyTcOcc str = chooseUniqueOcc tcName ('R' : ':' : str)
  588. mkDFunOcc :: String -- ^ Typically the class and type glommed together e.g. @OrdMaybe@.
  589. -- Only used in debug mode, for extra clarity
  590. -> Bool -- ^ Is this a hs-boot instance DFun?
  591. -> OccSet -- ^ avoid these Occs
  592. -> OccName -- ^ E.g. @$f3OrdMaybe@
  593. -- In hs-boot files we make dict funs like $fx7ClsTy, which get bound to the real
  594. -- thing when we compile the mother module. Reason: we don't know exactly
  595. -- what the mother module will call it.
  596. mkDFunOcc info_str is_boot set
  597. = chooseUniqueOcc VarName (prefix ++ info_str) set
  598. where
  599. prefix | is_boot = "$fx"
  600. | otherwise = "$f"
  601. mkDataTOcc, mkDataCOcc
  602. :: OccName -- ^ TyCon or data con string
  603. -> OccSet -- ^ avoid these Occs
  604. -> OccName -- ^ E.g. @$f3OrdMaybe@
  605. -- data T = MkT ... deriving( Data ) needs definitions for
  606. -- $tT :: Data.Generics.Basics.DataType
  607. -- $cMkT :: Data.Generics.Basics.Constr
  608. mkDataTOcc occ = chooseUniqueOcc VarName ("$t" ++ occNameString occ)
  609. mkDataCOcc occ = chooseUniqueOcc VarName ("$c" ++ occNameString occ)
  610. {-
  611. Sometimes we need to pick an OccName that has not already been used,
  612. given a set of in-use OccNames.
  613. -}
  614. chooseUniqueOcc :: NameSpace -> String -> OccSet -> OccName
  615. chooseUniqueOcc ns str set = loop (mkOccName ns str) (0::Int)
  616. where
  617. loop occ n
  618. | occ `elemOccSet` set = loop (mkOccName ns (str ++ show n)) (n+1)
  619. | otherwise = occ
  620. {-
  621. We used to add a '$m' to indicate a method, but that gives rise to bad
  622. error messages from the type checker when we print the function name or pattern
  623. of an instance-decl binding. Why? Because the binding is zapped
  624. to use the method name in place of the selector name.
  625. (See TcClassDcl.tcMethodBind)
  626. The way it is now, -ddump-xx output may look confusing, but
  627. you can always say -dppr-debug to get the uniques.
  628. However, we *do* have to zap the first character to be lower case,
  629. because overloaded constructors (blarg) generate methods too.
  630. And convert to VarName space
  631. e.g. a call to constructor MkFoo where
  632. data (Ord a) => Foo a = MkFoo a
  633. If this is necessary, we do it by prefixing '$m'. These
  634. guys never show up in error messages. What a hack.
  635. -}
  636. mkMethodOcc :: OccName -> OccName
  637. mkMethodOcc occ@(OccName VarName _) = occ
  638. mkMethodOcc occ = mk_simple_deriv varName "$m" occ
  639. {-
  640. ************************************************************************
  641. * *
  642. \subsection{Tidying them up}
  643. * *
  644. ************************************************************************
  645. Before we print chunks of code we like to rename it so that
  646. we don't have to print lots of silly uniques in it. But we mustn't
  647. accidentally introduce name clashes! So the idea is that we leave the
  648. OccName alone unless it accidentally clashes with one that is already
  649. in scope; if so, we tack on '1' at the end and try again, then '2', and
  650. so on till we find a unique one.
  651. There's a wrinkle for operators. Consider '>>='. We can't use '>>=1'
  652. because that isn't a single lexeme. So we encode it to 'lle' and *then*
  653. tack on the '1', if necessary.
  654. Note [TidyOccEnv]
  655. ~~~~~~~~~~~~~~~~~
  656. type TidyOccEnv = UniqFM Int
  657. * Domain = The OccName's FastString. These FastStrings are "taken";
  658. make sure that we don't re-use
  659. * Int, n = A plausible starting point for new guesses
  660. There is no guarantee that "FSn" is available;
  661. you must look that up in the TidyOccEnv. But
  662. it's a good place to start looking.
  663. * When looking for a renaming for "foo2" we strip off the "2" and start
  664. with "foo". Otherwise if we tidy twice we get silly names like foo23.
  665. However, if it started with digits at the end, we always make a name
  666. with digits at the end, rather than shortening "foo2" to just "foo",
  667. even if "foo" is unused. Reasons:
  668. - Plain "foo" might be used later
  669. - We use trailing digits to subtly indicate a unification variable
  670. in typechecker error message; see TypeRep.tidyTyVarBndr
  671. We have to take care though! Consider a machine-generated module (Trac #10370)
  672. module Foo where
  673. a1 = e1
  674. a2 = e2
  675. ...
  676. a2000 = e2000
  677. Then "a1", "a2" etc are all marked taken. But now if we come across "a7" again,
  678. we have to do a linear search to find a free one, "a2001". That might just be
  679. acceptable once. But if we now come across "a8" again, we don't want to repeat
  680. that search.
  681. So we use the TidyOccEnv mapping for "a" (not "a7" or "a8") as our base for
  682. starting the search; and we make sure to update the starting point for "a"
  683. after we allocate a new one.
  684. Node [Tidying multiple names at once]
  685. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  686. Consider
  687. > :t (id,id,id)
  688. Every id contributes a type variable to the type signature, and all of them are
  689. "a". If we tidy them one by one, we get
  690. (id,id,id) :: (a2 -> a2, a1 -> a1, a -> a)
  691. which is a bit unfortunate, as it unfairly renames only one of them. What we
  692. would like to see is
  693. (id,id,id) :: (a3 -> a3, a2 -> a2, a1 -> a1)
  694. This is achieved in tidyOccNames. It still uses tidyOccName to rename each name
  695. on its own, but it prepares the TidyEnv (using avoidClashesOccEnv), by blocking every
  696. name that occurs twice in the map. This way, none of the "a"s will get the
  697. priviledge of keeping this name, and all of them will get a suitable numbery by
  698. tidyOccName.
  699. It may be inappropriate to use tidyOccNames if the caller needs access to the
  700. intermediate environments (e.g. to tidy the tyVarKind of a type variable). In that
  701. case, avoidClashesOccEnv should be used directly, and tidyOccName afterwards.
  702. This is #12382.
  703. -}
  704. type TidyOccEnv = UniqFM Int -- The in-scope OccNames
  705. -- See Note [TidyOccEnv]
  706. emptyTidyOccEnv :: TidyOccEnv
  707. emptyTidyOccEnv = emptyUFM
  708. initTidyOccEnv :: [OccName] -> TidyOccEnv -- Initialise with names to avoid!
  709. initTidyOccEnv = foldl add emptyUFM
  710. where
  711. add env (OccName _ fs) = addToUFM env fs 1
  712. -- see Note [Tidying multiple names at once]
  713. tidyOccNames :: TidyOccEnv -> [OccName] -> (TidyOccEnv, [OccName])
  714. tidyOccNames env occs = mapAccumL tidyOccName env' occs
  715. where
  716. env' = avoidClashesOccEnv env occs
  717. avoidClashesOccEnv :: TidyOccEnv -> [OccName] -> TidyOccEnv
  718. avoidClashesOccEnv env occs = go env emptyUFM occs
  719. where
  720. go env _ [] = env
  721. go env seenOnce ((OccName _ fs):occs)
  722. | fs `elemUFM` env = go env seenOnce occs
  723. | fs `elemUFM` seenOnce = go (addToUFM env fs 1) seenOnce occs
  724. | otherwise = go env (addToUFM seenOnce fs ()) occs
  725. tidyOccName :: TidyOccEnv -> OccName -> (TidyOccEnv, OccName)
  726. tidyOccName env occ@(OccName occ_sp fs)
  727. | not (fs `elemUFM` env)
  728. = (addToUFM env fs 1, occ) -- Desired OccName is free
  729. | otherwise
  730. = case lookupUFM env base1 of
  731. Nothing -> (addToUFM env base1 2, OccName occ_sp base1)
  732. Just n -> find 1 n
  733. where
  734. base :: String -- Drop trailing digits (see Note [TidyOccEnv])
  735. base = dropWhileEndLE isDigit (unpackFS fs)
  736. base1 = mkFastString (base ++ "1")
  737. find !k !n
  738. = case lookupUFM env new_fs of
  739. Just {} -> find (k+1 :: Int) (n+k)
  740. -- By using n+k, the n argument to find goes
  741. -- 1, add 1, add 2, add 3, etc which
  742. -- moves at quadratic speed through a dense patch
  743. Nothing -> (new_env, OccName occ_sp new_fs)
  744. where
  745. new_fs = mkFastString (base ++ show n)
  746. new_env = addToUFM (addToUFM env new_fs 1) base1 (n+1)
  747. -- Update: base1, so that next time we'll start where we left off
  748. -- new_fs, so that we know it is taken
  749. -- If they are the same (n==1), the former wins
  750. -- See Note [TidyOccEnv]
  751. {-
  752. ************************************************************************
  753. * *
  754. Binary instance
  755. Here rather than BinIface because OccName is abstract
  756. * *
  757. ************************************************************************
  758. -}
  759. instance Binary NameSpace where
  760. put_ bh VarName = do
  761. putByte bh 0
  762. put_ bh DataName = do
  763. putByte bh 1
  764. put_ bh TvName = do
  765. putByte bh 2
  766. put_ bh TcClsName = do
  767. putByte bh 3
  768. get bh = do
  769. h <- getByte bh
  770. case h of
  771. 0 -> do return VarName
  772. 1 -> do return DataName
  773. 2 -> do return TvName
  774. _ -> do return TcClsName
  775. instance Binary OccName where
  776. put_ bh (OccName aa ab) = do
  777. put_ bh aa
  778. put_ bh ab
  779. get bh = do
  780. aa <- get bh
  781. ab <- get bh
  782. return (OccName aa ab)