elm/compiler/Transform/Definition.hs
Evan Czaplicki 9dd5dff279 Make AST more general and try to give its phases better names
Also change the constructors for the Pattern ADT
2014-02-10 00:17:33 +01:00

31 lines
1 KiB
Haskell

{-# OPTIONS_GHC -Wall #-}
module Transform.Definition where
import Control.Applicative ((<$>))
import qualified SourceSyntax.Pattern as P
import SourceSyntax.Expression
import qualified Transform.Expression as Expr
combineAnnotations :: [ParseDef] -> Either String [Def]
combineAnnotations = go
where
msg x = "Syntax Error: The type annotation for '" ++ x ++
"' must be directly above its definition."
exprCombineAnnotations = Expr.crawlLet combineAnnotations
go defs =
case defs of
TypeAnnotation name tipe : Def pat@(P.Var name') expr : rest | name == name' ->
do expr' <- exprCombineAnnotations expr
let def = Definition pat expr' (Just tipe)
(:) def <$> go rest
TypeAnnotation name _ : _ -> Left (msg name)
Def pat expr : rest ->
do expr' <- exprCombineAnnotations expr
let def = Definition pat expr' Nothing
(:) def <$> go rest
[] -> return []