@@ -1,12 +1,32 @@
11{-# OPTIONS_GHC -Wall #-}
2−module Transform.Expression where
2+module Transform.Expression (crawlLet, checkPorts) where
33
44import Control.Applicative ((<$>),(<*>))
55import SourceSyntax.Expression
66import SourceSyntax.Location
7+import qualified SourceSyntax.Type as ST
8+import qualified Type.Type as TT
79
8−crawl :: ([def] -> Either a [def']) -> (LExpr' def) -> Either a (LExpr' def')
9−crawl transform = go
10+crawlLet :: ([def] -> Either a [def']) -> LExpr' def -> Either a (LExpr' def')
11+crawlLet = crawl (\_ _ _ -> return ()) (\_ _ -> return ())
12+
13+checkPorts :: (String -> ST.Type -> TT.Variable -> Either a ())
14+ -> (String -> ST.Type -> Either a ())
15+ -> LExpr
16+ -> Either a LExpr
17+checkPorts inCheck outCheck expr =
18+ crawl inCheck outCheck (mapM checkDef) expr
19+ where
20+ checkDef def@(Definition _ body _) =
21+ do _ <- checkPorts inCheck outCheck body
22+ return def
23+
24+crawl :: (String -> ST.Type -> TT.Variable -> Either a ())
25+ -> (String -> ST.Type -> Either a ())
26+ -> ([def] -> Either a [def'])
27+ -> LExpr' def
28+ -> Either a (LExpr' def')
29+crawl portInCheck portOutCheck defsTransform = go
1030 where
1131 go (L srcSpan expr) =
1232 L srcSpan <$>
@@ -27,6 +47,10 @@ crawl transform = go
2747 Modify e fields -> Modify <$> go e <*> mapM (\(k,v) -> (,) k <$> go v) fields
2848 Record fields -> Record <$> mapM (\(k,v) -> (,) k <$> go v) fields
2949 Markdown uid md es -> Markdown uid md <$> mapM go es
30− Let defs body -> Let <$> transform defs <*> go body
31− PortIn name st tt handler -> PortIn name st tt <$> go handler
32− PortOut name st signal -> PortOut name st <$> go signal
50+ Let defs body -> Let <$> defsTransform defs <*> go body
51+ PortIn name st tt handler ->
52+ do portInCheck name st tt
53+ PortIn name st tt <$> go handler
54+ PortOut name st signal ->
55+ do portOutCheck name st
56+ PortOut name st <$> go signal