Skip to content

Commit e351bcd

Browse files
committed
Fix #489
Report an error when attempting to create a submodule or type with the same name as an existing submodule or type.
1 parent efdcff7 commit e351bcd

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

src/Normalise.hs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ normalise items = do
5555
normaliseItem :: Item -> Compiler ()
5656
normaliseItem (TypeDecl vis (TypeProto name params) mods
5757
(TypeRepresentation rep) items pos) = do
58-
validateModuleName "type" pos name
58+
validateNewModuleName "type" pos name
5959
let items' = RepresentationDecl params mods rep pos : items
6060
unless (List.null params)
6161
$ errmsg pos "types defined by representation cannot have type parameters"
6262
normaliseSubmodule name vis pos items'
6363
normaliseItem (TypeDecl vis (TypeProto name params) mods
6464
(TypeCtors ctorVis ctors) items pos) = do
65-
validateModuleName "type" pos name
65+
validateNewModuleName "type" pos name
6666
let items' = ConstructorDecl ctorVis params mods ctors pos : items
6767
normaliseSubmodule name vis pos items'
6868
normaliseItem (ModuleDecl vis name items pos) = do
69-
validateModuleName "module" pos name
69+
validateNewModuleName "module" pos name
7070
normaliseSubmodule name vis pos items
7171
normaliseItem (RepresentationDecl params mods rep pos) = do
7272
updateTypeModifiers mods
@@ -301,7 +301,19 @@ completeTypeSCC (CyclicSCC modTypeDefs) = do
301301
mapM_ (uncurry completeType) modTypeDefs
302302

303303

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.
305317
validateModuleName :: String -> OptPos -> Ident -> Compiler ()
306318
validateModuleName what pos name =
307319
unless (validModuleName name)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Error detected during preliminary processing of module dup_submodule
2+
final-dump/dup_submodule.wybe:6:1: module dup_submodule.again already exists
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module again {
2+
pub def answer:int = 42
3+
}
4+
5+
# should be an error:
6+
module again {
7+
pub def foo:int = answer
8+
}
9+
10+
!println "answer = $answer"
11+
!println "foo = $foo"

0 commit comments

Comments
 (0)