6
6
module Agda.Syntax.Concrete.Name where
8
import Control.Applicative
9
12
import Data.Generics (Typeable, Data)
14
import System.FilePath
16
import Test.QuickCheck
11
18
import Agda.Syntax.Common
12
19
import Agda.Syntax.Position
13
20
import Agda.Utils.FileName
14
import Agda.Utils.TestHelpers
21
import Agda.Utils.Pretty
16
23
#include "../../undefined.h"
17
24
import Agda.Utils.Impossible
116
123
deriving (Typeable, Data, Eq, Ord)
125
-- | Top-level module names.
127
-- Invariant: The list must not be empty.
129
newtype TopLevelModuleName
130
= TopLevelModuleName { moduleNameParts :: [String] }
131
deriving (Show, Eq, Ord, Typeable, Data)
133
-- | Turns a qualified name into a 'TopLevelModuleName'. The qualified
134
-- name is assumed to represent a top-level module name.
136
toTopLevelModuleName :: QName -> TopLevelModuleName
137
toTopLevelModuleName = TopLevelModuleName . map show . qnameParts
139
-- | Turns a top-level module name into a file name with the given
142
moduleNameToFileName :: TopLevelModuleName -> String -> FilePath
143
moduleNameToFileName (TopLevelModuleName []) ext = __IMPOSSIBLE__
144
moduleNameToFileName (TopLevelModuleName ms) ext =
145
joinPath (init ms) </> last ms <.> ext
147
-- | Finds the current project's \"root\" directory, given a project
148
-- file and the corresponding top-level module name.
150
-- Example: If the module \"A.B.C\" is located in the file
151
-- \"/foo/A/B/C.agda\", then the root is \"/foo/\".
153
-- Precondition: The module name must be well-formed.
155
projectRoot :: AbsolutePath -> TopLevelModuleName -> AbsolutePath
156
projectRoot file (TopLevelModuleName m) =
158
foldr (.) id (replicate (length m - 1) takeDirectory) $
118
162
isHole :: NamePart -> Bool
119
163
isHole Hole = True
125
169
isInfix x = isHole (head xs) && isHole (last xs) where xs = nameParts x
126
170
isNonfix x = not (isHole (head xs)) && not (isHole (last xs)) where xs = nameParts x
131
moduleNameToFileName :: QName -> Suffix -> FilePath
132
moduleNameToFileName (QName x) ext = show x ++ ext
133
moduleNameToFileName (Qual m x) ext = show m ++ [slash] ++ moduleNameToFileName x ext
135
172
instance Show Name where
136
173
show (Name _ xs) = concatMap show xs
137
174
show (NoName _ _) = "_"
145
181
show (Qual m x) = show m ++ "." ++ show x
146
182
show (QName x) = show x
184
instance Pretty TopLevelModuleName where
185
pretty (TopLevelModuleName ms) = text $ intercalate "." ms
187
instance Arbitrary TopLevelModuleName where
188
arbitrary = TopLevelModuleName <$> listOf1 (listOf1 $ elements "AB")
190
instance CoArbitrary TopLevelModuleName where
191
coarbitrary (TopLevelModuleName m) = coarbitrary m
148
193
instance HasRange Name where
149
194
getRange (Name r ps) = r
150
195
getRange (NoName r _) = r