@@ -116,17 +116,16 @@ addValue moduleName name ty nameKind = do
116116addTypeClass
117117 :: forall m
118118 . (MonadState CheckState m , MonadError MultipleErrors m )
119- => ModuleName
120- -> ProperName 'ClassName
119+ => Qualified (ProperName 'ClassName)
121120 -> [(Text , Maybe Kind )]
122121 -> [Constraint ]
123122 -> [FunctionalDependency ]
124123 -> [Declaration ]
125124 -> m ()
126- addTypeClass moduleName pn args implies dependencies ds = do
125+ addTypeClass qualifiedClassName args implies dependencies ds = do
127126 env <- getEnv
128127 traverse_ (checkMemberIsUsable (typeSynonyms env)) classMembers
129- modify $ \ st -> st { checkEnv = (checkEnv st) { typeClasses = M. insert ( Qualified ( Just moduleName) pn) newClass (typeClasses . checkEnv $ st) } }
128+ modify $ \ st -> st { checkEnv = (checkEnv st) { typeClasses = M. insert qualifiedClassName newClass (typeClasses . checkEnv $ st) } }
130129 where
131130 classMembers :: [(Ident , Type )]
132131 classMembers = map toPair ds
@@ -317,11 +316,19 @@ typeCheckAll moduleName _ = traverse go
317316 go d@ ImportDeclaration {} = return d
318317 go d@ (TypeClassDeclaration (ss, _) pn args implies deps tys) = do
319318 warnAndRethrow (addHint (ErrorInTypeClassDeclaration pn) . addHint (PositionedError ss)) $ do
320- addTypeClass moduleName pn args implies deps tys
319+ env <- getEnv
320+ let qualifiedClassName = Qualified (Just moduleName) pn
321+ guardWith (errorMessage (DuplicateTypeClass pn ss)) $
322+ not (M. member qualifiedClassName (typeClasses env))
323+ addTypeClass qualifiedClassName args implies deps tys
321324 return d
322325 go (d@ (TypeInstanceDeclaration (ss, _) dictName deps className tys body)) =
323326 rethrow (addHint (ErrorInInstance className tys) . addHint (PositionedError ss)) $ do
324327 env <- getEnv
328+ let qualifiedDictName = Qualified (Just moduleName) dictName
329+ flip (traverse_ . traverse_) (typeClassDictionaries env) $ \ dictionaries ->
330+ guardWith (errorMessage (DuplicateInstance dictName ss)) $
331+ not (M. member qualifiedDictName dictionaries)
325332 case M. lookup className (typeClasses env) of
326333 Nothing -> internalError " typeCheckAll: Encountered unknown type class in instance declaration"
327334 Just typeClass -> do
@@ -330,7 +337,7 @@ typeCheckAll moduleName _ = traverse go
330337 checkOrphanInstance dictName className typeClass tys
331338 _ <- traverseTypeInstanceBody checkInstanceMembers body
332339 deps' <- (traverse . overConstraintArgs . traverse ) replaceAllTypeSynonyms deps
333- let dict = TypeClassDictionaryInScope ( Qualified ( Just moduleName) dictName) [] className tys (Just deps')
340+ let dict = TypeClassDictionaryInScope qualifiedDictName [] className tys (Just deps')
334341 addTypeClassDictionaries (Just moduleName) . M. singleton className $ M. singleton (tcdValue dict) dict
335342 return d
336343
0 commit comments