@@ -7,7 +7,7 @@ import qualified Data.Set as Set
7import qualified Data.Foldable as F
7import qualified Data.Foldable as F
8import qualified Data.Traversable as T
8import qualified Data.Traversable as T
10−import AST.Expression.General
10+import AST.Expression.General as Expr
11import qualified AST.Expression.Source as Source
11import qualified AST.Expression.Source as Source
12import qualified AST.Expression.Valid as Valid
12import qualified AST.Expression.Valid as Valid
13import qualified AST.Declaration as D
13import qualified AST.Declaration as D
@@ -92,8 +92,9 @@ defHelp comment (A.A region def) decls =
93 case def of
93 case def of
94 Source.Definition pat expr ->
94 Source.Definition pat expr ->
95− do expr' <- Validate.expression expr
95+ do expr' <- expression expr
96 let def' = Valid.Definition pat expr' Nothing
96 let def' = Valid.Definition pat expr' Nothing
97 addRest def' decls
98 addRest def' decls
99 Source.TypeAnnotation name tipe ->
100 Source.TypeAnnotation name tipe ->
@@ -101,8 +102,9 @@ defHelp comment (A.A region def) decls =
101 D.Decl (A.A _ (D.Definition (A.A _
102 D.Decl (A.A _ (D.Definition (A.A _
102 (Source.Definition pat@(A.A _ (Pattern.Var name')) expr)))) : rest
103 (Source.Definition pat@(A.A _ (Pattern.Var name')) expr)))) : rest
103 | name == name' ->
104 | name == name' ->
104− do expr' <- Validate.expression expr
105+ do expr' <- expression expr
105 let def' = Valid.Definition pat expr' (Just tipe)
106 let def' = Valid.Definition pat expr' (Just tipe)
107+ checkDefinition def'
106 addRest def' rest
108 addRest def' rest
@@ -130,7 +132,7 @@ portHelp comment region port decls =
130 case decls of
132 case decls of
131 D.Decl (A.A _ (D.Port (D.PortDefinition name' expr))) : rest
133 D.Decl (A.A _ (D.Port (D.PortDefinition name' expr))) : rest
132 | name == name' ->
134 | name == name' ->
133− do expr' <- Validate.expression expr
135+ do expr' <- expression expr
134 let port' = D.Out name expr' tipe
136 let port' = D.Out name expr' tipe
135 addRest port' rest
137 addRest port' rest
@@ -157,6 +159,7 @@ definitionsHelp sourceDefs =
157 A.A _ (Source.Definition pat expr) : rest ->
159 A.A _ (Source.Definition pat expr) : rest ->
158 do expr' <- expression expr
160 do expr' <- expression expr
159 let def = Valid.Definition pat expr' Nothing
161 let def = Valid.Definition pat expr' Nothing
160 (:) def <$> definitionsHelp rest
163 (:) def <$> definitionsHelp rest
162 A.A region (Source.TypeAnnotation name tipe) : rest ->
165 A.A region (Source.TypeAnnotation name tipe) : rest ->
@@ -165,12 +168,32 @@ definitionsHelp sourceDefs =
165 | name == name' ->
168 | name == name' ->
166 do expr' <- expression expr
169 do expr' <- expression expr
167 let def = Valid.Definition pat expr' (Just tipe)
170 let def = Valid.Definition pat expr' (Just tipe)
168 (:) def <$> definitionsHelp rest'
172 (:) def <$> definitionsHelp rest'
171 Result.throw region (Error.TypeWithoutDefinition name)
175 Result.throw region (Error.TypeWithoutDefinition name)
178+checkDefinition :: Valid.Def -> Result.Result wrn Error.Error ()
179+checkDefinition (Valid.Definition pattern body _) =
180+ case fst (Expr.collectLambdas body) of
186+ A.A _ (Pattern.Var _) ->
191+ (A.A start _) = pattern
192+ (A.A end _) = last args
194+ Result.throw (R.merge start end) (Error.BadFunctionName (length args))
174-- VALIDATE EXPRESSIONS
197-- VALIDATE EXPRESSIONS
176expression :: Source.Expr -> Result.Result wrn Error.Error Valid.Expr
199expression :: Source.Expr -> Result.Result wrn Error.Error Valid.Expr
@@ -181,7 +204,9 @@ expression (A.A ann sourceExpression) =
181 return (Var x)
204 return (Var x)
183 Lambda pattern body ->
206 Lambda pattern body ->
208+ <$> validatePattern pattern
184− Lambda pattern <$> expression body
209+ <*> expression body
186 Binop op leftExpr rightExpr ->
211 Binop op leftExpr rightExpr ->
@@ -191,7 +216,7 @@ expression (A.A ann sourceExpression) =
191 Case e branches ->
216 Case e branches ->
193 <$> expression e
218 <$> expression e
194− <*> T.traverse second branches
219+ <*> T.traverse (\(p,b) -> (,) <$> validatePattern p <*> expression b) branches
196 Data name args ->
221 Data name args ->
197 Data name <$> T.traverse expression args
222 Data name <$> T.traverse expression args
@@ -267,6 +292,14 @@ both (expr1, expr2) =
267 (,) <$> expression expr1 <*> expression expr2
292 (,) <$> expression expr1 <*> expression expr2
297+validatePattern :: Pattern.RawPattern -> Result.Result wrn Error.Error Pattern.RawPattern
298+validatePattern pattern =
299+ do detectDuplicates Error.BadPattern (Pattern.boundVars pattern)
270-- DETECT DUPLICATES
303-- DETECT DUPLICATES
272detectDuplicates
305detectDuplicates