@@ -55,18 +55,18 @@ normalise items = do
55
55
normaliseItem :: Item -> Compiler ()
56
56
normaliseItem (TypeDecl vis (TypeProto name params) mods
57
57
(TypeRepresentation rep) items pos) = do
58
- validateModuleName " type" pos name
58
+ validateNewModuleName " type" pos name
59
59
let items' = RepresentationDecl params mods rep pos : items
60
60
unless (List. null params)
61
61
$ errmsg pos " types defined by representation cannot have type parameters"
62
62
normaliseSubmodule name vis pos items'
63
63
normaliseItem (TypeDecl vis (TypeProto name params) mods
64
64
(TypeCtors ctorVis ctors) items pos) = do
65
- validateModuleName " type" pos name
65
+ validateNewModuleName " type" pos name
66
66
let items' = ConstructorDecl ctorVis params mods ctors pos : items
67
67
normaliseSubmodule name vis pos items'
68
68
normaliseItem (ModuleDecl vis name items pos) = do
69
- validateModuleName " module" pos name
69
+ validateNewModuleName " module" pos name
70
70
normaliseSubmodule name vis pos items
71
71
normaliseItem (RepresentationDecl params mods rep pos) = do
72
72
updateTypeModifiers mods
@@ -301,7 +301,19 @@ completeTypeSCC (CyclicSCC modTypeDefs) = do
301
301
mapM_ (uncurry completeType) modTypeDefs
302
302
303
303
304
- -- | Check that the specified module name is valid, reporting and error if not.
304
+ -- | Check that the specified name is a valid name for a new module of the
305
+ -- current module. Report an error if it's an invalid module name component or
306
+ -- is the name of an existing submodule.
307
+ validateNewModuleName :: String -> OptPos -> Ident -> Compiler ()
308
+ validateNewModuleName what pos name = do
309
+ validateModuleName what pos name
310
+ subModSpec <- (++ [name]) <$> getModuleSpec
311
+ alreadyExists <- isJust <$> getLoadingModule subModSpec
312
+ when alreadyExists
313
+ $ errmsg pos $ " module " ++ showModSpec subModSpec ++ " already exists"
314
+
315
+
316
+ -- | Check that the specified module name is valid, reporting an error if not.
305
317
validateModuleName :: String -> OptPos -> Ident -> Compiler ()
306
318
validateModuleName what pos name =
307
319
unless (validModuleName name)
0 commit comments