@@ -1,10 +1,10 @@
1+{-# OPTIONS_GHC -Wall #-}
12module Canonicalize (module') where
23
34import qualified Data.List as List
45import qualified Data.Map as Map
56import qualified Data.Maybe as Maybe
67import qualified Data.Set as Set
7−import qualified Data.Traversable as T
88import qualified Data.Foldable as T
99
1010import AST.Expression.General (Expr'(..))
@@ -18,24 +18,28 @@ import qualified AST.Module.Name as ModuleName
1818import qualified AST.Pattern as P
1919import qualified AST.Type as Type
2020import qualified AST.Variable as Var
21+import qualified Canonicalize.Body as Body
22+import qualified Canonicalize.Effects as Effects
23+import qualified Canonicalize.Environment as Env
24+import qualified Canonicalize.Setup as Setup
25+import qualified Canonicalize.Type as Canon
26+import qualified Canonicalize.Variable as Canon
2127import qualified Docs.Centralize as Docs
2228import qualified Reporting.Annotation as A
2329import qualified Reporting.Error as Error
2430import qualified Reporting.Error.Canonicalize as CError
2531import qualified Reporting.Error.Helpers as ErrorHelp
2632import qualified Reporting.Region as Region
27−import qualified Reporting.Result as R
33+import qualified Reporting.Render.Type as RenderType
34+import qualified Reporting.Result as Result
2835import qualified Reporting.Warning as Warning
29−import qualified Canonicalize.Body as Body
30−import qualified Canonicalize.Effects as Effects
31−import qualified Canonicalize.Environment as Env
32−import qualified Canonicalize.Result as Result
33−import qualified Canonicalize.Setup as Setup
34−import qualified Canonicalize.Type as Canonicalize
35−import qualified Canonicalize.Variable as Canonicalize
3636
3737
3838
39+type Result a =
40+ Result.Result (Result.One RenderType.Localizer) Warning.Warning Error.Error a
41+
42+
3943-- MODULES
4044
4145
@@ -43,29 +47,29 @@ module'
4347 :: [ModuleName.Canonical]
4448 -> Module.Interfaces
4549 -> Module.Valid
46− -> R.Result Warning.Warning Error.Error Module.Canonical
47−module' canonicalImports interfaces modul =
50+ -> Result Module.Canonical
51+module' allCanonicalImports interfaces modul =
4852 let
4953 (Module.Valid docs exports imports decls effects) =
5054 Module.info modul
5155
5256 importDict =
53− canonicalImports
57+ allCanonicalImports
5458 |> map (\cName -> (ModuleName._module cName, cName))
5559 |> Map.fromList
5660
57− (Result.Result uses rawResults) =
58− Setup.environment importDict interfaces modul
59− `Result.andThen` \env ->
61+ (Result.Result uses warnings rawResults) =
62+ do env <- Setup.environment importDict interfaces modul
6063
61− (,,,) env
62− <$> resolveExports (Effects.toValues effects ++ declsToValues decls) exports
63− <*> canonicalizeDecls env decls
64− <*> Effects.canonicalize env effects
64+ (,,,) env
65+ <$> resolveExports (Effects.toValues effects ++ declsToValues decls) exports
66+ <*> canonicalizeDecls env decls
67+ <*> Effects.canonicalize env effects
6568 in
6669 case rawResults of
67− Result.Err msgs ->
68− R.throwMany (map (A.map Error.Canonicalize) msgs)
70+ Result.Err errors ->
71+ Result.mapError Error.Canonicalize $
72+ Result.Result Result.None warnings (Result.Err errors)
6973
7074 Result.Ok (env, canonicalExports, canonicalDecls, canonicalEffects) ->
7175 let
@@ -81,9 +85,9 @@ module' canonicalImports interfaces modul =
8185 program =
8286 Body.flatten (Module.name modul) canonicalDecls canonicalEffects
8387 in
84− R.addDealiaser (Env.toDealiaser env) $
85− do canonicalImports <- filterImports uses imports
86− return $ modul {
88+ do canonicalImports <- filterImports uses imports
89+ Result.accumulate (Result.One (Env.toDealiaser env)) $
90+ modul {
8791 Module.info =
8892 Module.Info
8993 { Module.docs = centralizedDocs
@@ -96,7 +100,7 @@ module' canonicalImports interfaces modul =
96100 , Module.unions = Map.fromList (map typeToPair unions)
97101 , Module.effects = canonicalEffects
98102 }
99− }
103+ }
100104
101105
102106
@@ -106,7 +110,7 @@ module' canonicalImports interfaces modul =
106110filterImports
107111 :: Set.Set ModuleName.Raw
108112 -> ([Module.DefaultImport], [Module.UserImport])
109− -> R.Result Warning.Warning e [ModuleName.Raw]
113+ -> Result [ModuleName.Raw]
110114filterImports uses (defaults, imports) =
111115 let
112116 checkImport (A.A region (name, _method)) =
@@ -114,24 +118,28 @@ filterImports uses (defaults, imports) =
114118 return (Just name)
115119
116120 else
117− do R.warn region (Warning.UnusedImport name)
118− return Nothing
121+ Result.warn region (Warning.UnusedImport name) Nothing
119122 in
120123 do reducedImports <-
121− Maybe.catMaybes <$> T.traverse checkImport imports
124+ Maybe.catMaybes <$> traverse checkImport imports
122125
123126 return $
124127 Set.toList (Set.fromList (map fst defaults ++ reducedImports))
125128
126129
127130
131+-------- CANONICALIZATION --------
132+
133+
134+type CResult a =
135+ Canon.Result a
136+
137+
138+
128139-- EXPORTS
129140
130141
131−resolveExports
132− :: [Var.Value]
133− -> Var.Listing (A.Located Var.Value)
134− -> Result.ResultErr [Var.Value]
142+resolveExports :: [Var.Value] -> Var.Listing (A.Located Var.Value) -> CResult [Var.Value]
135143resolveExports fullList (Var.Listing partialList open) =
136144 if open then
137145 Result.ok fullList
@@ -148,17 +156,13 @@ resolveExports fullList (Var.Listing partialList open) =
148156 map fst allAdts
149157 in
150158 (\xs ys zs _ -> xs ++ ys ++ zs)
151− <$> T.traverse (getValueExport allValues (Set.fromList allValues)) values
152− <*> (concat <$> T.traverse (getAliasExport allValues allAliases adtTypes) aliases)
153− <*> T.traverse (getAdtExport allAdts adtTypes) adts
159+ <$> traverse (getValueExport allValues (Set.fromList allValues)) values
160+ <*> (concat <$> traverse (getAliasExport allValues allAliases adtTypes) aliases)
161+ <*> traverse (getAdtExport allAdts adtTypes) adts
154162 <*> allUnique partialList
155163
156164
157−getValueExport
158− :: [String]
159− -> Set.Set String
160− -> A.Located String
161− -> Result.ResultErr Var.Value
165+getValueExport :: [String] -> Set.Set String -> A.Located String -> CResult Var.Value
162166getValueExport allValues allValuesSet (A.A region name) =
163167 if Set.member name allValuesSet then
164168 Result.ok (Var.Value name)
@@ -166,12 +170,7 @@ getValueExport allValues allValuesSet (A.A region name) =
166170 manyNotFound region [name] allValues
167171
168172
169−getAliasExport
170− :: [String]
171− -> [String]
172− -> [String]
173− -> A.Located String
174− -> Result.ResultErr [Var.Value]
173+getAliasExport :: [String] -> [String] -> [String] -> A.Located String -> CResult [Var.Value]
175174getAliasExport allValues allAliases adtTypes (A.A region alias) =
176175 if alias `elem` allAliases then
177176
@@ -191,7 +190,7 @@ getAdtExport
191190 :: [(String, Var.Listing String)]
192191 -> [String]
193192 -> A.Located (String, Var.Listing String)
194− -> Result.ResultErr Var.Value
193+ -> CResult Var.Value
195194getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
196195 case List.lookup name allAdts of
197196 Nothing ->
@@ -208,9 +207,9 @@ getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
208207 manyNotFound region unfoundCtors allCtors
209208
210209
211−manyNotFound :: Region.Region -> [String] -> [String] -> Result.ResultErr a
210+manyNotFound :: Region.Region -> [String] -> [String] -> CResult a
212211manyNotFound region nameList possibilities =
213− Result.errors (map (notFound region possibilities) nameList)
212+ Result.throwMany (map (notFound region possibilities) nameList)
214213
215214
216215notFound :: Region.Region -> [String] -> String -> A.Located CError.Error
@@ -219,7 +218,7 @@ notFound region possibilities name =
219218 ErrorHelp.nearbyNames id name possibilities
220219
221220
222−allUnique :: [A.Located Var.Value] -> Result.ResultErr ()
221+allUnique :: [A.Located Var.Value] -> CResult ()
223222allUnique statedExports =
224223 let
225224 valueToString value =
@@ -234,12 +233,12 @@ allUnique statedExports =
234233 isUnique value allRegions =
235234 case allRegions of
236235 region : _ : _ ->
237− Result.err (A.A region (CError.DuplicateExport (valueToString value)))
236+ Result.throw region (CError.DuplicateExport (valueToString value))
238237
239238 _ ->
240239 Result.ok ()
241240 in
242− T.traverse_ id (Map.mapWithKey isUnique locations)
241+ T.sequenceA_ (Map.mapWithKey isUnique locations)
243242
244243
245244
@@ -319,46 +318,46 @@ splitLocatedValue (A.A region value) =
319318-- DECLARATIONS
320319
321320
322−canonicalizeDecls :: Env.Environment -> D.Valid -> Result.ResultErr D.Canonical
321+canonicalizeDecls :: Env.Environment -> D.Valid -> CResult D.Canonical
323322canonicalizeDecls env (D.Decls defs unions aliases infixes) =
324323 let
325− traverse canEntry entries =
326− T.traverse (\(A.A ann entry) -> A.A ann <$> canEntry entry) entries
324+ annTraverse canEntry entries =
325+ traverse (\(A.A ann entry) -> A.A ann <$> canEntry entry) entries
327326
328327 canonicalizeDef (Valid.Def pat expr typ) =
329328 Canonical.Def Canonical.dummyFacts
330329 <$> canonicalizePattern env pat
331330 <*> canonicalizeExpr env expr
332− <*> T.traverse (canonicalizeRegionType env) typ
331+ <*> traverse (canonicalizeRegionType env) typ
333332
334333 canonicalizeArgs (ctor, args) =
335− (,) ctor <$> T.traverse (Canonicalize.tipe env) args
334+ (,) ctor <$> traverse (Canon.tipe env) args
336335
337336 canonicalizeUnion (D.Type name tvars ctors) =
338− D.Type name tvars <$> T.traverse canonicalizeArgs ctors
337+ D.Type name tvars <$> traverse canonicalizeArgs ctors
339338
340339 canonicalizeAlias (D.Type name tvars alias) =
341− D.Type name tvars <$> Canonicalize.tipe env alias
340+ D.Type name tvars <$> Canon.tipe env alias
342341 in
343342 D.Decls
344− <$> traverse canonicalizeDef defs
345− <*> traverse canonicalizeUnion unions
346− <*> traverse canonicalizeAlias aliases
343+ <$> annTraverse canonicalizeDef defs
344+ <*> annTraverse canonicalizeUnion unions
345+ <*> annTraverse canonicalizeAlias aliases
347346 <*> pure infixes
348347
349348
350349canonicalizeRegionType
351350 :: Env.Environment
352351 -> Type.Raw
353− -> Result.ResultErr (A.Located Type.Canonical)
352+ -> CResult (A.Located Type.Canonical)
354353canonicalizeRegionType env typ@(A.A region _) =
355− A.A region <$> Canonicalize.tipe env typ
354+ A.A region <$> Canon.tipe env typ
356355
357356
358357canonicalizeExpr
359358 :: Env.Environment
360359 -> Valid.Expr
361− -> Result.ResultErr Canonical.Expr
360+ -> CResult Canonical.Expr
362361canonicalizeExpr env (A.A region validExpr) =
363362 let go = canonicalizeExpr env
364363 in
@@ -376,15 +375,15 @@ canonicalizeExpr env (A.A region validExpr) =
376375 Update record fields ->
377376 Update
378377 <$> go record
379− <*> T.traverse (\(field,expr) -> (,) field <$> go expr) fields
378+ <*> traverse (\(field,expr) -> (,) field <$> go expr) fields
380379
381380 Record fields ->
382381 Record
383− <$> T.traverse (\(field,expr) -> (,) field <$> go expr) fields
382+ <$> traverse (\(field,expr) -> (,) field <$> go expr) fields
384383
385384 Binop (Var.Raw op) leftExpr rightExpr ->
386385 Binop
387− <$> Canonicalize.variable region env op
386+ <$> Canon.variable region env op
388387 <*> go leftExpr
389388 <*> go rightExpr
390389
@@ -400,14 +399,14 @@ canonicalizeExpr env (A.A region validExpr) =
400399
401400 If branches finally ->
402401 If
403− <$> T.traverse go' branches
402+ <$> traverse go' branches
404403 <*> go finally
405404 where
406405 go' (condition, branch) =
407406 (,) <$> go condition <*> go branch
408407
409− Let defs body ->
410− Let <$> T.traverse rename' defs <*> canonicalizeExpr env' body
408+ Let defs expr ->
409+ Let <$> traverse rename' defs <*> canonicalizeExpr env' expr
411410 where
412411 env' =
413412 foldr Env.addPattern env (map Valid.getPattern defs)
@@ -416,19 +415,19 @@ canonicalizeExpr env (A.A region validExpr) =
416415 Canonical.Def Canonical.dummyFacts
417416 <$> canonicalizePattern env' p
418417 <*> canonicalizeExpr env' body
419− <*> T.traverse (canonicalizeRegionType env') mtipe
418+ <*> traverse (canonicalizeRegionType env') mtipe
420419
421420 Var (Var.Raw x) ->
422− Var <$> Canonicalize.variable region env x
421+ Var <$> Canon.variable region env x
423422
424423 Data name exprs ->
425− Data name <$> T.traverse go exprs
424+ Data name <$> traverse go exprs
426425
427426 ExplicitList exprs ->
428− ExplicitList <$> T.traverse go exprs
427+ ExplicitList <$> traverse go exprs
429428
430429 Case expr cases ->
431− Case <$> go expr <*> T.traverse branch cases
430+ Case <$> go expr <*> traverse branch cases
432431 where
433432 branch (ptrn, brnch) =
434433 (,)
@@ -442,10 +441,10 @@ canonicalizeExpr env (A.A region validExpr) =
442441 Result.ok (Sub moduleName)
443442
444443 ForeignCmd name tipe ->
445− ForeignCmd name <$> Canonicalize.tipe env tipe
444+ ForeignCmd name <$> Canon.tipe env tipe
446445
447446 ForeignSub name tipe ->
448− ForeignSub name <$> Canonicalize.tipe env tipe
447+ ForeignSub name <$> Canon.tipe env tipe
449448
450449 SaveEnv moduleName effects ->
451450 Result.ok (SaveEnv moduleName effects)
@@ -454,7 +453,7 @@ canonicalizeExpr env (A.A region validExpr) =
454453 Result.ok (GLShader uid src tipe)
455454
456455
457−canonicalizePattern :: Env.Environment -> P.Raw -> Result.ResultErr P.Canonical
456+canonicalizePattern :: Env.Environment -> P.Raw -> CResult P.Canonical
458457canonicalizePattern env (A.A region ptrn) =
459458 A.A region <$>
460459 case ptrn of
@@ -475,5 +474,5 @@ canonicalizePattern env (A.A region ptrn) =
475474
476475 P.Data (Var.Raw name) patterns ->
477476 P.Data
478− <$> Canonicalize.pvar region env name (length patterns)
479− <*> T.traverse (canonicalizePattern env) patterns
477+ <$> Canon.pvar region env name (length patterns)
478+ <*> traverse (canonicalizePattern env) patterns