@@ -5,8 +5,7 @@ import Control.Arrow (second)
5import qualified Control.Monad as Monad
5import qualified Control.Monad as Monad
6import qualified Data.Map as Map
6import qualified Data.Map as Map
8−import qualified AST.Expression.General as E
8+import qualified AST.Expression.Canonical as C
9−import qualified AST.Expression.Canonical as Canonical
10import qualified AST.Literal as Lit
9import qualified AST.Literal as Lit
11import qualified AST.Pattern as P
10import qualified AST.Pattern as P
12import qualified AST.Type as ST
11import qualified AST.Type as ST
@@ -22,31 +21,31 @@ import Type.Type hiding (Descriptor(..))
25−constrain :: Env.Env -> Canonical.Expr -> Type -> IO TypeConstraint
24+constrain :: Env.Env -> C.Expr -> Type -> IO TypeConstraint
26constrain env annotatedExpr@(A.A region expression) tipe =
25constrain env annotatedExpr@(A.A region expression) tipe =
27 case expression of
26 case expression of
28− E.Literal lit ->
27+ C.Literal lit ->
29 Literal.constrain env region lit tipe
28 Literal.constrain env region lit tipe
31− E.Cmd _ ->
30+ C.Cmd _ ->
32 return CTrue
31 return CTrue
34− E.Sub _ ->
33+ C.Sub _ ->
35 return CTrue
34 return CTrue
37− E.OutgoingPort _ _ ->
36+ C.OutgoingPort _ _ ->
38 return CTrue
37 return CTrue
40− E.IncomingPort _ _ ->
39+ C.IncomingPort _ _ ->
41 return CTrue
40 return CTrue
43− E.Program _ _ ->
42+ C.Program _ _ ->
44 error "DANGER - Program AST nodes should not be in type inference."
43 error "DANGER - Program AST nodes should not be in type inference."
46− E.SaveEnv moduleName effects ->
45+ C.SaveEnv moduleName effects ->
47 Effects.constrain env moduleName effects
46 Effects.constrain env moduleName effects
49− E.GLShader _uid _src gltipe ->
48+ C.GLShader _uid _src gltipe ->
50 exists $ \attr ->
49 exists $ \attr ->
51 exists $ \unif ->
50 exists $ \unif ->
@@ -70,16 +69,16 @@ constrain env annotatedExpr@(A.A region expression) tipe =
71 return (CEqual Error.Shader region (shaderTipe attribute uniform varying) tipe)
70 return (CEqual Error.Shader region (shaderTipe attribute uniform varying) tipe)
73− E.Var var ->
72+ C.Var var ->
74 return (CInstance region (V.toString var) tipe)
73 return (CInstance region (V.toString var) tipe)
76− E.ExplicitList exprs ->
75+ C.List exprs ->
77 constrainList env region exprs tipe
76 constrainList env region exprs tipe
79− E.Binop op leftExpr rightExpr ->
78+ C.Binop op leftExpr rightExpr ->
80 constrainBinop env region op leftExpr rightExpr tipe
79 constrainBinop env region op leftExpr rightExpr tipe
82− E.Lambda pattern body ->
81+ C.Lambda pattern body ->
83 exists $ \argType ->
82 exists $ \argType ->
84 exists $ \resType ->
83 exists $ \resType ->
85 do (Pattern.Info headers vars cons) <- Pattern.constrain env pattern argType
84 do (Pattern.Info headers vars cons) <- Pattern.constrain env pattern argType
@@ -88,19 +87,19 @@ constrain env annotatedExpr@(A.A region expression) tipe =
88 ex vars (CLet [monoscheme headers] (cons /\ bodyCon))
87 ex vars (CLet [monoscheme headers] (cons /\ bodyCon))
89 /\ CEqual Error.Lambda region (argType ==> resType) tipe
88 /\ CEqual Error.Lambda region (argType ==> resType) tipe
91− E.App _ _ ->
90+ C.App _ _ ->
93− (f:args) = E.collectApps annotatedExpr
92+ (f:args) = C.collectApps annotatedExpr
95 constrainApp env region f args tipe
94 constrainApp env region f args tipe
97− E.If branches finally ->
96+ C.If branches finally ->
98 constrainIf env region branches finally tipe
97 constrainIf env region branches finally tipe
100− E.Case expr branches ->
99+ C.Case expr branches ->
101 constrainCase env region expr branches tipe
100 constrainCase env region expr branches tipe
103− E.Data name exprs ->
102+ C.Ctor name exprs ->
104 do vars <- Monad.forM exprs $ \_ -> mkVar Nothing
103 do vars <- Monad.forM exprs $ \_ -> mkVar Nothing
105 let pairs = zip exprs (map VarN vars)
104 let pairs = zip exprs (map VarN vars)
106 (ctipe, cs) <- Monad.foldM step (tipe, CTrue) (reverse pairs)
105 (ctipe, cs) <- Monad.foldM step (tipe, CTrue) (reverse pairs)
@@ -110,16 +109,16 @@ constrain env annotatedExpr@(A.A region expression) tipe =
110 do c' <- constrain env e x
109 do c' <- constrain env e x
111 return (x ==> t, c /\ c')
110 return (x ==> t, c /\ c')
113− E.Access expr field ->
112+ C.Access expr field ->
114 exists $ \recordType ->
113 exists $ \recordType ->
115 exists $ \ext ->
114 exists $ \ext ->
116 do recordCon <- constrain env expr recordType
115 do recordCon <- constrain env expr recordType
117− let maybeBody = E.collectFields expr
116+ let maybeBody = C.collectFields expr
118 let desiredType = record (Map.singleton field tipe) ext
117 let desiredType = record (Map.singleton field tipe) ext
119 let fieldCon = CEqual (Error.Access maybeBody field) region recordType desiredType
118 let fieldCon = CEqual (Error.Access maybeBody field) region recordType desiredType
120 return $ recordCon /\ fieldCon
119 return $ recordCon /\ fieldCon
122− E.Update expr fields ->
121+ C.Update expr fields ->
123 exists $ \t ->
122 exists $ \t ->
124 do oldVars <- mapM (\_ -> mkVar Nothing) fields
123 do oldVars <- mapM (\_ -> mkVar Nothing) fields
125 let oldFields = Map.fromList (zip (map fst fields) (map VarN oldVars))
124 let oldFields = Map.fromList (zip (map fst fields) (map VarN oldVars))
@@ -133,7 +132,7 @@ constrain env annotatedExpr@(A.A region expression) tipe =
134 return $ cOld /\ ex newVars (CAnd (cNew : cs))
133 return $ cOld /\ ex newVars (CAnd (cNew : cs))
136− E.Record fields ->
135+ C.Record fields ->
137 do vars <- Monad.forM fields (\_ -> mkVar Nothing)
136 do vars <- Monad.forM fields (\_ -> mkVar Nothing)
138 fieldCons <-
137 fieldCons <-
139 Monad.zipWithM
138 Monad.zipWithM
@@ -144,7 +143,7 @@ constrain env annotatedExpr@(A.A region expression) tipe =
144 let recordType = record fields' (TermN EmptyRecord1)
143 let recordType = record fields' (TermN EmptyRecord1)
145 return (ex vars (CAnd (fieldCons ++ [CEqual Error.Record region recordType tipe])))
144 return (ex vars (CAnd (fieldCons ++ [CEqual Error.Record region recordType tipe])))
147− E.Let defs body ->
146+ C.Let defs body ->
148 do bodyCon <- constrain env body tipe
147 do bodyCon <- constrain env body tipe
150 (Info schemes rqs fqs headers c2 c1) <-
149 (Info schemes rqs fqs headers c2 c1) <-
@@ -166,8 +165,8 @@ constrain env annotatedExpr@(A.A region expression) tipe =
166constrainApp
165constrainApp
167 :: Env.Env
166 :: Env.Env
168 -> R.Region
167 -> R.Region
169− -> Canonical.Expr
168+ -> C.Expr
170− -> [Canonical.Expr]
169+ -> [C.Expr]
172 -> IO TypeConstraint
171 -> IO TypeConstraint
173constrainApp env region f args tipe =
172constrainApp env region f args tipe =
@@ -185,7 +184,7 @@ constrainApp env region f args tipe =
186 maybeName =
185 maybeName =
187 case f of
186 case f of
188− A.A _ (E.Var canonicalName) ->
187+ A.A _ (C.Var canonicalName) ->
189 Just canonicalName
188 Just canonicalName
@@ -199,7 +198,7 @@ argConstraints
200 -> Variable
199 -> Variable
202− -> [Canonical.Expr]
201+ -> [C.Expr]
203 -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Maybe R.Region, Variable)
202 -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Maybe R.Region, Variable)
204argConstraints env name region totalArgs overallVar index args =
203argConstraints env name region totalArgs overallVar index args =
205 case args of
204 case args of
@@ -250,8 +249,8 @@ constrainBinop
250 :: Env.Env
249 :: Env.Env
251 -> R.Region
250 -> R.Region
252 -> V.Canonical
251 -> V.Canonical
253− -> Canonical.Expr
252+ -> C.Expr
254− -> Canonical.Expr
253+ -> C.Expr
256 -> IO TypeConstraint
255 -> IO TypeConstraint
257constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightRegion _) tipe =
256constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightRegion _) tipe =
@@ -282,7 +281,7 @@ constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightReg
282-- CONSTRAIN LISTS
281-- CONSTRAIN LISTS
285−constrainList :: Env.Env -> R.Region -> [Canonical.Expr] -> Type -> IO TypeConstraint
284+constrainList :: Env.Env -> R.Region -> [C.Expr] -> Type -> IO TypeConstraint
286constrainList env region exprs tipe =
285constrainList env region exprs tipe =
287 do (exprInfo, exprCons) <-
286 do (exprInfo, exprCons) <-
288 unzip <$> mapM elementConstraint exprs
287 unzip <$> mapM elementConstraint exprs
@@ -307,8 +306,8 @@ constrainList env region exprs tipe =
307constrainIf
306constrainIf
308 :: Env.Env
307 :: Env.Env
309 -> R.Region
308 -> R.Region
310− -> [(Canonical.Expr, Canonical.Expr)]
309+ -> [(C.Expr, C.Expr)]
311− -> Canonical.Expr
310+ -> C.Expr
313 -> IO TypeConstraint
312 -> IO TypeConstraint
314constrainIf env region branches finally tipe =
313constrainIf env region branches finally tipe =
@@ -366,8 +365,8 @@ constrainIf env region branches finally tipe =
366constrainCase
365constrainCase
367 :: Env.Env
366 :: Env.Env
368 -> R.Region
367 -> R.Region
369− -> Canonical.Expr
368+ -> C.Expr
370− -> [(P.Canonical, Canonical.Expr)]
369+ -> [(P.Canonical, C.Expr)]
372 -> IO TypeConstraint
371 -> IO TypeConstraint
373constrainCase env region expr branches tipe =
372constrainCase env region expr branches tipe =
@@ -444,8 +443,8 @@ collectPairs index items =
444-- EXPAND PATTERNS
443-- EXPAND PATTERNS
447−expandPattern :: Canonical.Def -> [Canonical.Def]
446+expandPattern :: C.Def -> [C.Def]
448−expandPattern def@(Canonical.Def facts lpattern expr maybeType) =
447+expandPattern def@(C.Def facts lpattern expr maybeType) =
450 (A.A patternRegion pattern) =
449 (A.A patternRegion pattern) =
@@ -467,17 +466,17 @@ expandPattern def@(Canonical.Def facts lpattern expr maybeType) =
467 A.A patternRegion (P.Var name)
466 A.A patternRegion (P.Var name)
469 localVar name =
468 localVar name =
470− A.A patternRegion (E.localVar name)
469+ A.A patternRegion (C.localVar name)
472 mainDef =
471 mainDef =
473− Canonical.Def facts (pvar combinedName) expr maybeType
472+ C.Def facts (pvar combinedName) expr maybeType
475 toDef name =
474 toDef name =
477 extract =
476 extract =
478− E.Case (localVar combinedName) [(lpattern, localVar name)]
477+ C.Case (localVar combinedName) [(lpattern, localVar name)]
480− Canonical.Def facts (pvar name) (A.A patternRegion extract) Nothing
479+ C.Def facts (pvar name) (A.A patternRegion extract) Nothing
@@ -494,8 +493,8 @@ data Info = Info
497−constrainDef :: Env.Env -> Info -> Canonical.Def -> IO Info
496+constrainDef :: Env.Env -> Info -> C.Def -> IO Info
498−constrainDef env info (Canonical.Def defRegion (A.A patternRegion pattern) expr maybeTipe) =
497+constrainDef env info (C.Def defRegion (A.A patternRegion pattern) expr maybeTipe) =
499 case (pattern, maybeTipe) of
498 case (pattern, maybeTipe) of
500 (P.Var name, Nothing) ->
499 (P.Var name, Nothing) ->
501 constrainUnannotatedDef env patternRegion name expr info
500 constrainUnannotatedDef env patternRegion name expr info
@@ -511,7 +510,7 @@ constrainUnannotatedDef
511 :: Env.Env
510 :: Env.Env
512 -> R.Region
511 -> R.Region
513 -> String
512 -> String
514− -> Canonical.Expr
513+ -> C.Expr
516 -> IO Info
515 -> IO Info
517constrainUnannotatedDef env patternRegion name expr info =
516constrainUnannotatedDef env patternRegion name expr info =
@@ -530,7 +529,7 @@ constrainAnnotatedDef
530 -> R.Region
529 -> R.Region
531 -> R.Region
530 -> R.Region
532 -> String
531 -> String
533− -> Canonical.Expr
532+ -> C.Expr
534 -> ST.Canonical
533 -> ST.Canonical
536 -> IO Info
535 -> IO Info
@@ -563,10 +562,10 @@ data ArgInfo =
566−constrainAnnDefHelp :: Canonical.Expr -> ST.Canonical -> ArgInfo -> IO TypeConstraint
565+constrainAnnDefHelp :: C.Expr -> ST.Canonical -> ArgInfo -> IO TypeConstraint
567constrainAnnDefHelp expr tipe (ArgInfo name defRegion env args vars) =
566constrainAnnDefHelp expr tipe (ArgInfo name defRegion env args vars) =
568 case (expr, tipe) of
567 case (expr, tipe) of
569− (A.A _ (E.Lambda arg result), ST.Lambda argType resultType) ->
568+ (A.A _ (C.Lambda arg result), ST.Lambda argType resultType) ->
570 do (rigidArgType, newVars) <- Env.instantiateType Rigid env argType
569 do (rigidArgType, newVars) <- Env.instantiateType Rigid env argType
572 constrainAnnDefHelp result resultType $
571 constrainAnnDefHelp result resultType $
@@ -594,7 +593,7 @@ constrainAnnDefHelp expr tipe (ArgInfo name defRegion env args vars) =
595 let sharedArity = length args
594 let sharedArity = length args
596 let typeArity = sharedArity + length (ST.collectLambdas tipe) - 1
595 let typeArity = sharedArity + length (ST.collectLambdas tipe) - 1
597− let argsArity = sharedArity + length (fst (E.collectLambdas expr))
596+ let argsArity = sharedArity + length (fst (C.collectLambdas expr))
598 let hint = Error.ReturnType name typeArity argsArity region
597 let hint = Error.ReturnType name typeArity argsArity region
599 let resultCon =
598 let resultCon =
600 CEqual hint defRegion rigidType resultType
599 CEqual hint defRegion rigidType resultType