2
DeriveDataTypeable, GeneralizedNewtypeDeriving,
3
DeriveFunctor, DeriveFoldable, DeriveTraversable,
2
{-# LANGUAGE DeriveDataTypeable #-}
3
{-# LANGUAGE DeriveFoldable #-}
4
{-# LANGUAGE DeriveFunctor #-}
5
{-# LANGUAGE DeriveTraversable #-}
6
{-# LANGUAGE FlexibleContexts #-}
7
{-# LANGUAGE FlexibleInstances #-}
8
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6
{-| Abstract names should carry unique identifiers and stuff. Not right now though.
10
{-| Abstract names carry unique identifiers and stuff.
8
module Agda.Syntax.Abstract.Name where
12
module Agda.Syntax.Abstract.Name
13
( module Agda.Syntax.Abstract.Name
10
17
import Control.Monad.State
19
26
import Agda.Syntax.Position
20
27
import Agda.Syntax.Common
21
28
import Agda.Syntax.Fixity
29
import Agda.Syntax.Concrete.Name (IsNoName(..))
22
30
import qualified Agda.Syntax.Concrete.Name as C
24
32
import Agda.Utils.Fresh
25
33
import Agda.Utils.Size
26
34
import Agda.Utils.Suffix
28
import Agda.Syntax.Notation
30
36
#include "../../undefined.h"
31
37
import Agda.Utils.Impossible
72
78
newtype AmbiguousQName = AmbQ { unAmbQ :: [QName] }
73
79
deriving (Typeable, HasRange, Show)
75
instance HasRange ModuleName where
76
getRange (MName []) = noRange
77
getRange (MName xs) = getRange xs
79
81
-- | A module is anonymous if the qualification path ends in an underscore.
80
82
isAnonymousModuleName :: ModuleName -> Bool
81
83
isAnonymousModuleName (MName []) = False
82
isAnonymousModuleName (MName ms) = C.isNoName $ nameConcrete $ last ms
84
isAnonymousModuleName (MName ms) = isNoName $ last ms
84
86
-- | Sets the ranges of the individual names in the module name to
85
87
-- match those of the corresponding concrete names. If the concrete
118
120
noModuleName :: ModuleName
119
121
noModuleName = mnameFromList []
122
mkName :: Range -> NameId -> String -> Name
123
mkName r i s = Name i (C.Name noRange (parseName s)) r defaultFixity'
126
parseName ('_':s) = C.Hole : parseName s
127
parseName s = case break (== '_') s of
128
(s0, s1) -> C.Id s0 : parseName s1
130
mkName_ :: NameId -> String -> Name
131
mkName_ = mkName noRange
123
-- | Make a 'Name' from some kind of string.
125
-- | The 'Range' sets the /definition site/ of the name, not the use site.
126
mkName :: Range -> NameId -> a -> Name
128
mkName_ :: NameId -> a -> Name
129
mkName_ = mkName noRange
131
instance MkName String where
132
mkName r i s = Name i (C.Name noRange (C.stringNameParts s)) r defaultFixity'
133
135
qnameToList :: QName -> [Name]
134
136
qnameToList (QName m x) = mnameToList m ++ [x]
212
209
freshNoName_ :: (MonadState s m, HasFresh NameId s) => m Name
213
210
freshNoName_ = freshNoName noRange
212
-- | Create a fresh name from @a@.
213
class FreshName a where
214
freshName_ :: (MonadState s m, HasFresh NameId s) => a -> m Name
216
instance FreshName (Range, String) where
217
freshName_ = uncurry freshName
219
instance FreshName String where
220
freshName_ = freshName noRange
222
instance FreshName Range where
223
freshName_ = freshNoName
225
instance FreshName () where
226
freshName_ () = freshNoName_
215
228
-- | Get the next version of the concrete name. For instance, @nextName "x" = "x₁"@.
216
229
-- The name must not be a 'NoName'.
217
230
nextName :: Name -> Name
226
239
nextStr s = case suffixView s of
227
240
(s0, suf) -> addSuffix s0 (nextSuffix suf)
229
instance Show NameId where
230
show (NameId x i) = show x ++ "@" ++ show i
242
------------------------------------------------------------------------
243
-- * Important instances: Eq, Ord, Hashable
245
-- For the identity and comparing of names, only the 'NameId' matters!
246
------------------------------------------------------------------------
232
248
instance Eq Name where
233
x == y = nameId x == nameId y
249
(==) = (==) `on` nameId
235
251
instance Ord Name where
236
compare x y = compare (nameId x) (nameId y)
238
instance Show Name where
239
show x = show (nameConcrete x) -- ++ "|" ++ show (nameId x)
252
compare = compare `on` nameId
241
254
instance Hashable Name where
242
255
{-# INLINE hashWithSalt #-}
243
hashWithSalt salt = (hashWithSalt salt) . nameId
245
instance Show QName where
246
show q = concat $ intersperse "." $ map show $ qnameToList q
248
instance Show ModuleName where
249
show m = concat $ intersperse "." $ map show $ mnameToList m
256
hashWithSalt salt = hashWithSalt salt . nameId
251
258
instance Eq QName where
252
259
(==) = (==) `on` qnameName
257
264
instance Hashable QName where
258
265
{-# INLINE hashWithSalt #-}
259
hashWithSalt salt = (hashWithSalt salt) . qnameName
266
hashWithSalt salt = hashWithSalt salt . qnameName
268
------------------------------------------------------------------------
269
-- * IsNoName instances (checking for "_")
270
------------------------------------------------------------------------
272
-- | An abstract name is empty if its concrete name is empty.
273
instance IsNoName Name where
274
isNoName = isNoName . nameConcrete
276
------------------------------------------------------------------------
278
------------------------------------------------------------------------
280
instance Show Name where
281
show x = show (nameConcrete x) -- ++ "|" ++ show (nameId x)
283
instance Show ModuleName where
284
show m = concat $ intersperse "." $ map show $ mnameToList m
286
instance Show QName where
287
show q = concat $ intersperse "." $ map show $ qnameToList q
289
------------------------------------------------------------------------
291
------------------------------------------------------------------------
261
295
instance HasRange Name where
262
296
getRange = getRange . nameConcrete
298
instance HasRange ModuleName where
299
getRange (MName []) = noRange
300
getRange (MName xs) = getRange xs
264
302
instance HasRange QName where
265
303
getRange q = getRange (qnameModule q, qnameName q)
267
307
instance SetRange Name where
268
308
setRange r x = x { nameConcrete = setRange r $ nameConcrete x }
275
315
instance SetRange ModuleName where
276
316
setRange r (MName ns) = MName (map (setRange r) ns)
320
instance KillRange Name where
321
killRange x = x { nameConcrete = killRange $ nameConcrete x
322
-- Andreas, 2014-03-30
323
-- An experiment: what happens if we preserve
324
-- the range of the binding site, but kill all
325
-- other ranges before serialization?
326
-- , nameBindingSite = noRange
329
instance KillRange ModuleName where
330
killRange (MName xs) = MName $ killRange xs
278
332
instance KillRange QName where
279
333
killRange q = q { qnameModule = killRange $ qnameModule q
280
334
, qnameName = killRange $ qnameName q
283
instance KillRange Name where
284
killRange x = x { nameConcrete = killRange $ nameConcrete x }
286
instance KillRange ModuleName where
287
killRange (MName xs) = MName $ killRange xs
289
337
instance KillRange AmbiguousQName where
290
338
killRange (AmbQ xs) = AmbQ $ killRange xs
340
------------------------------------------------------------------------
342
------------------------------------------------------------------------
292
344
instance Sized QName where
293
345
size = size . qnameToList