on master help sign in
prevent different fixity declarations
ff56693raichoo
src/Idris/Parser.hs+18−6
@@ -490,12 +490,24 @@ pFixity = do pushIndent
490 pTerminator
490 pTerminator
491 let prec = fromInteger i
491 let prec = fromInteger i
492 istate <- getState
492 istate <- getState
493+ let infixes = idris_infixes istate
493− let fs = map (Fix (f prec)) ops
494+ let fs = map (Fix (f prec)) ops
494− setState (istate {
495+ let redecl = map (alreadyDeclared infixes) fs
496+ if False `notElem` map checkValidity redecl
495− idris_infixes = nub $ sort (fs ++ idris_infixes istate),
497+ then do setState (istate { idris_infixes = nub $ sort (fs ++ infixes)
496− ibc_write = map IBCFix fs ++ ibc_write istate })
498+ , ibc_write = map IBCFix fs ++ ibc_write istate
499+ })
497− fc <- pfc
500+ fc <- pfc
498− return (PFix fc (f prec) ops)
501+ return (PFix fc (f prec) ops)
502+ else fail "Illegal redeclaration of fixity"
503+ where alreadyDeclared :: [FixDecl] -> FixDecl -> (FixDecl, [FixDecl])
504+ alreadyDeclared fs f = (f, filter ((extractName f ==) . extractName) fs)
505+
506+ checkValidity :: (FixDecl, [FixDecl]) -> Bool
507+ checkValidity (f, fs) = all (== f) fs
508+
509+ extractName :: FixDecl -> String
510+ extractName (Fix _ n) = n
499
511
500fixity :: IParser (Int -> Fixity)
512fixity :: IParser (Int -> Fixity)
501fixity = try (do reserved "infixl"; return Infixl)
513fixity = try (do reserved "infixl"; return Infixl)