@@ -1,8 +1,7 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Validate (Result, module') where
2module Validate (Result, module') where
4−import Prelude hiding (init)
5−import Control.Monad (foldM, when)
4+import Control.Monad (foldM_, when)
6import qualified Data.Map as Map
5import qualified Data.Map as Map
7import qualified Data.Maybe as Maybe
6import qualified Data.Maybe as Maybe
8import qualified Data.Set as Set
7import qualified Data.Set as Set
@@ -428,8 +427,8 @@ validateDefPattern pattern body =
430 case pattern of
429 case pattern of
431− A.A _ (Pattern.Var _) ->
430+ A.A _ (Pattern.Var funcName) ->
432− return ()
431+ checkArguments funcName args
@@ -439,6 +438,22 @@ validateDefPattern pattern body =
439 Result.throw (R.merge start end) (Error.BadFunctionName (length args))
438 Result.throw (R.merge start end) (Error.BadFunctionName (length args))
441+checkArguments :: String -> [Pattern.Raw] -> Result wrn ()
442+checkArguments funcName args =
445+ concatMap Pattern.boundVars args
447+ checkDups seenArgs (A.A region arg) =
448+ if Set.member arg seenArgs then
449+ Result.throw region (Error.DuplicateArgument funcName arg)
452+ return (Set.insert arg seenArgs)
454+ foldM_ checkDups Set.empty vars
443-- VALIDATE EXPRESSIONS
458-- VALIDATE EXPRESSIONS
@@ -509,7 +524,7 @@ expression (A.A ann sourceExpression) =
510 return (Set.insert field seenFields)
525 return (Set.insert field seenFields)
512− do _ <- foldM checkDups Set.empty fields
527+ do foldM_ checkDups Set.empty fields
513 Record <$> T.traverse second fields
528 Record <$> T.traverse second fields
515 Let defs body ->
530 Let defs body ->