@@ -1,10 +1,10 @@
1+{-# OPTIONS_GHC -Wall #-}
1module Canonicalize (module') where
2module Canonicalize (module') where
3import qualified Data.List as List
4import qualified Data.List as List
4import qualified Data.Map as Map
5import qualified Data.Map as Map
5import qualified Data.Maybe as Maybe
6import qualified Data.Maybe as Maybe
6import qualified Data.Set as Set
7import qualified Data.Set as Set
7−import qualified Data.Traversable as T
8import qualified Data.Foldable as T
8import qualified Data.Foldable as T
10import AST.Expression.General (Expr'(..))
10import AST.Expression.General (Expr'(..))
@@ -18,24 +18,28 @@ import qualified AST.Module.Name as ModuleName
18import qualified AST.Pattern as P
18import qualified AST.Pattern as P
19import qualified AST.Type as Type
19import qualified AST.Type as Type
20import qualified AST.Variable as Var
20import 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
21import qualified Docs.Centralize as Docs
27import qualified Docs.Centralize as Docs
22import qualified Reporting.Annotation as A
28import qualified Reporting.Annotation as A
23import qualified Reporting.Error as Error
29import qualified Reporting.Error as Error
24import qualified Reporting.Error.Canonicalize as CError
30import qualified Reporting.Error.Canonicalize as CError
25import qualified Reporting.Error.Helpers as ErrorHelp
31import qualified Reporting.Error.Helpers as ErrorHelp
26import qualified Reporting.Region as Region
32import 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
28import qualified Reporting.Warning as Warning
35import 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
40+ Result.Result (Result.One RenderType.Localizer) Warning.Warning Error.Error a
@@ -43,29 +47,29 @@ module'
43 :: [ModuleName.Canonical]
47 :: [ModuleName.Canonical]
44 -> Module.Interfaces
48 -> Module.Interfaces
45 -> Module.Valid
49 -> Module.Valid
46− -> R.Result Warning.Warning Error.Error Module.Canonical
50+ -> Result Module.Canonical
47−module' canonicalImports interfaces modul =
51+module' allCanonicalImports interfaces modul =
49 (Module.Valid docs exports imports decls effects) =
53 (Module.Valid docs exports imports decls effects) =
50 Module.info modul
54 Module.info modul
52 importDict =
56 importDict =
53− canonicalImports
57+ allCanonicalImports
54 |> map (\cName -> (ModuleName._module cName, cName))
58 |> map (\cName -> (ModuleName._module cName, cName))
55 |> Map.fromList
59 |> Map.fromList
57− (Result.Result uses rawResults) =
61+ (Result.Result uses warnings rawResults) =
58− Setup.environment importDict interfaces modul
62+ do env <- Setup.environment importDict interfaces modul
59− `Result.andThen` \env ->
61− (,,,) env
64+ (,,,) env
62− <$> resolveExports (Effects.toValues effects ++ declsToValues decls) exports
65+ <$> resolveExports (Effects.toValues effects ++ declsToValues decls) exports
63− <*> canonicalizeDecls env decls
66+ <*> canonicalizeDecls env decls
64− <*> Effects.canonicalize env effects
67+ <*> Effects.canonicalize env effects
66 case rawResults of
69 case rawResults of
67− Result.Err msgs ->
70+ Result.Err errors ->
68− R.throwMany (map (A.map Error.Canonicalize) msgs)
71+ Result.mapError Error.Canonicalize $
72+ Result.Result Result.None warnings (Result.Err errors)
70 Result.Ok (env, canonicalExports, canonicalDecls, canonicalEffects) ->
74 Result.Ok (env, canonicalExports, canonicalDecls, canonicalEffects) ->
@@ -81,9 +85,9 @@ module' canonicalImports interfaces modul =
82 Body.flatten (Module.name modul) canonicalDecls canonicalEffects
86 Body.flatten (Module.name modul) canonicalDecls canonicalEffects
84− R.addDealiaser (Env.toDealiaser env) $
85− do canonicalImports <- filterImports uses imports
88+ do canonicalImports <- filterImports uses imports
89+ Result.accumulate (Result.One (Env.toDealiaser env)) $
86− return $ modul {
90+ modul {
87 Module.info =
91 Module.info =
88 Module.Info
92 Module.Info
89 { Module.docs = centralizedDocs
93 { Module.docs = centralizedDocs
@@ -96,7 +100,7 @@ module' canonicalImports interfaces modul =
96 , Module.unions = Map.fromList (map typeToPair unions)
100 , Module.unions = Map.fromList (map typeToPair unions)
97 , Module.effects = canonicalEffects
101 , Module.effects = canonicalEffects
@@ -106,7 +110,7 @@ module' canonicalImports interfaces modul =
106filterImports
110filterImports
107 :: Set.Set ModuleName.Raw
111 :: Set.Set ModuleName.Raw
108 -> ([Module.DefaultImport], [Module.UserImport])
112 -> ([Module.DefaultImport], [Module.UserImport])
109− -> R.Result Warning.Warning e [ModuleName.Raw]
113+ -> Result [ModuleName.Raw]
110filterImports uses (defaults, imports) =
114filterImports uses (defaults, imports) =
112 checkImport (A.A region (name, _method)) =
116 checkImport (A.A region (name, _method)) =
@@ -114,24 +118,28 @@ filterImports uses (defaults, imports) =
114 return (Just name)
118 return (Just name)
117− do R.warn region (Warning.UnusedImport name)
121+ Result.warn region (Warning.UnusedImport name) Nothing
120 do reducedImports <-
123 do reducedImports <-
121− Maybe.catMaybes <$> T.traverse checkImport imports
124+ Maybe.catMaybes <$> traverse checkImport imports
124 Set.toList (Set.fromList (map fst defaults ++ reducedImports))
127 Set.toList (Set.fromList (map fst defaults ++ reducedImports))
131+-------- CANONICALIZATION --------
128-- EXPORTS
139-- EXPORTS
133− -> Var.Listing (A.Located Var.Value)
142+resolveExports :: [Var.Value] -> Var.Listing (A.Located Var.Value) -> CResult [Var.Value]
134− -> Result.ResultErr [Var.Value]
135resolveExports fullList (Var.Listing partialList open) =
143resolveExports fullList (Var.Listing partialList open) =
136 if open then
144 if open then
137 Result.ok fullList
145 Result.ok fullList
@@ -148,17 +156,13 @@ resolveExports fullList (Var.Listing partialList open) =
148 map fst allAdts
156 map fst allAdts
150 (\xs ys zs _ -> xs ++ ys ++ zs)
158 (\xs ys zs _ -> xs ++ ys ++ zs)
151− <$> T.traverse (getValueExport allValues (Set.fromList allValues)) values
159+ <$> traverse (getValueExport allValues (Set.fromList allValues)) values
152− <*> (concat <$> T.traverse (getAliasExport allValues allAliases adtTypes) aliases)
160+ <*> (concat <$> traverse (getAliasExport allValues allAliases adtTypes) aliases)
153− <*> T.traverse (getAdtExport allAdts adtTypes) adts
161+ <*> traverse (getAdtExport allAdts adtTypes) adts
154 <*> allUnique partialList
162 <*> allUnique partialList
157−getValueExport
165+getValueExport :: [String] -> Set.Set String -> A.Located String -> CResult Var.Value
161− -> Result.ResultErr Var.Value
162getValueExport allValues allValuesSet (A.A region name) =
166getValueExport allValues allValuesSet (A.A region name) =
163 if Set.member name allValuesSet then
167 if Set.member name allValuesSet then
164 Result.ok (Var.Value name)
168 Result.ok (Var.Value name)
@@ -166,12 +170,7 @@ getValueExport allValues allValuesSet (A.A region name) =
166 manyNotFound region [name] allValues
170 manyNotFound region [name] allValues
169−getAliasExport
173+getAliasExport :: [String] -> [String] -> [String] -> A.Located String -> CResult [Var.Value]
174− -> Result.ResultErr [Var.Value]
175getAliasExport allValues allAliases adtTypes (A.A region alias) =
174getAliasExport allValues allAliases adtTypes (A.A region alias) =
176 if alias `elem` allAliases then
175 if alias `elem` allAliases then
@@ -191,7 +190,7 @@ getAdtExport
191 :: [(String, Var.Listing String)]
190 :: [(String, Var.Listing String)]
192 -> [String]
191 -> [String]
193 -> A.Located (String, Var.Listing String)
192 -> A.Located (String, Var.Listing String)
194− -> Result.ResultErr Var.Value
193+ -> CResult Var.Value
195getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
194getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
196 case List.lookup name allAdts of
195 case List.lookup name allAdts of
197 Nothing ->
196 Nothing ->
@@ -208,9 +207,9 @@ getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
208 manyNotFound region unfoundCtors allCtors
207 manyNotFound region unfoundCtors allCtors
211−manyNotFound :: Region.Region -> [String] -> [String] -> Result.ResultErr a
210+manyNotFound :: Region.Region -> [String] -> [String] -> CResult a
212manyNotFound region nameList possibilities =
211manyNotFound region nameList possibilities =
213− Result.errors (map (notFound region possibilities) nameList)
212+ Result.throwMany (map (notFound region possibilities) nameList)
216notFound :: Region.Region -> [String] -> String -> A.Located CError.Error
215notFound :: Region.Region -> [String] -> String -> A.Located CError.Error
@@ -219,7 +218,7 @@ notFound region possibilities name =
219 ErrorHelp.nearbyNames id name possibilities
218 ErrorHelp.nearbyNames id name possibilities
222−allUnique :: [A.Located Var.Value] -> Result.ResultErr ()
221+allUnique :: [A.Located Var.Value] -> CResult ()
223allUnique statedExports =
222allUnique statedExports =
225 valueToString value =
224 valueToString value =
@@ -234,12 +233,12 @@ allUnique statedExports =
234 isUnique value allRegions =
233 isUnique value allRegions =
235 case allRegions of
234 case allRegions of
236 region : _ : _ ->
235 region : _ : _ ->
237− Result.err (A.A region (CError.DuplicateExport (valueToString value)))
236+ Result.throw region (CError.DuplicateExport (valueToString value))
240 Result.ok ()
239 Result.ok ()
242− T.traverse_ id (Map.mapWithKey isUnique locations)
241+ T.sequenceA_ (Map.mapWithKey isUnique locations)
@@ -319,46 +318,46 @@ splitLocatedValue (A.A region value) =
319-- DECLARATIONS
318-- DECLARATIONS
322−canonicalizeDecls :: Env.Environment -> D.Valid -> Result.ResultErr D.Canonical
321+canonicalizeDecls :: Env.Environment -> D.Valid -> CResult D.Canonical
323canonicalizeDecls env (D.Decls defs unions aliases infixes) =
322canonicalizeDecls env (D.Decls defs unions aliases infixes) =
325− traverse canEntry entries =
324+ annTraverse canEntry entries =
326− T.traverse (\(A.A ann entry) -> A.A ann <$> canEntry entry) entries
325+ traverse (\(A.A ann entry) -> A.A ann <$> canEntry entry) entries
328 canonicalizeDef (Valid.Def pat expr typ) =
327 canonicalizeDef (Valid.Def pat expr typ) =
329 Canonical.Def Canonical.dummyFacts
328 Canonical.Def Canonical.dummyFacts
330 <$> canonicalizePattern env pat
329 <$> canonicalizePattern env pat
331 <*> canonicalizeExpr env expr
330 <*> canonicalizeExpr env expr
332− <*> T.traverse (canonicalizeRegionType env) typ
331+ <*> traverse (canonicalizeRegionType env) typ
334 canonicalizeArgs (ctor, args) =
333 canonicalizeArgs (ctor, args) =
335− (,) ctor <$> T.traverse (Canonicalize.tipe env) args
334+ (,) ctor <$> traverse (Canon.tipe env) args
337 canonicalizeUnion (D.Type name tvars ctors) =
336 canonicalizeUnion (D.Type name tvars ctors) =
338− D.Type name tvars <$> T.traverse canonicalizeArgs ctors
337+ D.Type name tvars <$> traverse canonicalizeArgs ctors
340 canonicalizeAlias (D.Type name tvars alias) =
339 canonicalizeAlias (D.Type name tvars alias) =
341− D.Type name tvars <$> Canonicalize.tipe env alias
340+ D.Type name tvars <$> Canon.tipe env alias
344− <$> traverse canonicalizeDef defs
343+ <$> annTraverse canonicalizeDef defs
345− <*> traverse canonicalizeUnion unions
344+ <*> annTraverse canonicalizeUnion unions
346− <*> traverse canonicalizeAlias aliases
345+ <*> annTraverse canonicalizeAlias aliases
347 <*> pure infixes
346 <*> pure infixes
350canonicalizeRegionType
349canonicalizeRegionType
351 :: Env.Environment
350 :: Env.Environment
352 -> Type.Raw
351 -> Type.Raw
353− -> Result.ResultErr (A.Located Type.Canonical)
352+ -> CResult (A.Located Type.Canonical)
354canonicalizeRegionType env typ@(A.A region _) =
353canonicalizeRegionType env typ@(A.A region _) =
355− A.A region <$> Canonicalize.tipe env typ
354+ A.A region <$> Canon.tipe env typ
358canonicalizeExpr
357canonicalizeExpr
359 :: Env.Environment
358 :: Env.Environment
360 -> Valid.Expr
359 -> Valid.Expr
361− -> Result.ResultErr Canonical.Expr
360+ -> CResult Canonical.Expr
362canonicalizeExpr env (A.A region validExpr) =
361canonicalizeExpr env (A.A region validExpr) =
363 let go = canonicalizeExpr env
362 let go = canonicalizeExpr env
@@ -376,15 +375,15 @@ canonicalizeExpr env (A.A region validExpr) =
376 Update record fields ->
375 Update record fields ->
378 <$> go record
377 <$> go record
379− <*> T.traverse (\(field,expr) -> (,) field <$> go expr) fields
378+ <*> traverse (\(field,expr) -> (,) field <$> go expr) fields
381 Record fields ->
380 Record fields ->
383− <$> T.traverse (\(field,expr) -> (,) field <$> go expr) fields
382+ <$> traverse (\(field,expr) -> (,) field <$> go expr) fields
385 Binop (Var.Raw op) leftExpr rightExpr ->
384 Binop (Var.Raw op) leftExpr rightExpr ->
387− <$> Canonicalize.variable region env op
386+ <$> Canon.variable region env op
388 <*> go leftExpr
387 <*> go leftExpr
389 <*> go rightExpr
388 <*> go rightExpr
@@ -400,14 +399,14 @@ canonicalizeExpr env (A.A region validExpr) =
401 If branches finally ->
400 If branches finally ->
403− <$> T.traverse go' branches
402+ <$> traverse go' branches
404 <*> go finally
403 <*> go finally
406 go' (condition, branch) =
405 go' (condition, branch) =
407 (,) <$> go condition <*> go branch
406 (,) <$> go condition <*> go branch
409− Let defs body ->
408+ Let defs expr ->
410− Let <$> T.traverse rename' defs <*> canonicalizeExpr env' body
409+ Let <$> traverse rename' defs <*> canonicalizeExpr env' expr
413 foldr Env.addPattern env (map Valid.getPattern defs)
412 foldr Env.addPattern env (map Valid.getPattern defs)
@@ -416,19 +415,19 @@ canonicalizeExpr env (A.A region validExpr) =
416 Canonical.Def Canonical.dummyFacts
415 Canonical.Def Canonical.dummyFacts
417 <$> canonicalizePattern env' p
416 <$> canonicalizePattern env' p
418 <*> canonicalizeExpr env' body
417 <*> canonicalizeExpr env' body
419− <*> T.traverse (canonicalizeRegionType env') mtipe
418+ <*> traverse (canonicalizeRegionType env') mtipe
421 Var (Var.Raw x) ->
420 Var (Var.Raw x) ->
422− Var <$> Canonicalize.variable region env x
421+ Var <$> Canon.variable region env x
424 Data name exprs ->
423 Data name exprs ->
425− Data name <$> T.traverse go exprs
424+ Data name <$> traverse go exprs
427 ExplicitList exprs ->
426 ExplicitList exprs ->
428− ExplicitList <$> T.traverse go exprs
427+ ExplicitList <$> traverse go exprs
430 Case expr cases ->
429 Case expr cases ->
431− Case <$> go expr <*> T.traverse branch cases
430+ Case <$> go expr <*> traverse branch cases
433 branch (ptrn, brnch) =
432 branch (ptrn, brnch) =
@@ -442,10 +441,10 @@ canonicalizeExpr env (A.A region validExpr) =
442 Result.ok (Sub moduleName)
441 Result.ok (Sub moduleName)
444 ForeignCmd name tipe ->
443 ForeignCmd name tipe ->
445− ForeignCmd name <$> Canonicalize.tipe env tipe
444+ ForeignCmd name <$> Canon.tipe env tipe
447 ForeignSub name tipe ->
446 ForeignSub name tipe ->
448− ForeignSub name <$> Canonicalize.tipe env tipe
447+ ForeignSub name <$> Canon.tipe env tipe
450 SaveEnv moduleName effects ->
449 SaveEnv moduleName effects ->
451 Result.ok (SaveEnv moduleName effects)
450 Result.ok (SaveEnv moduleName effects)
@@ -454,7 +453,7 @@ canonicalizeExpr env (A.A region validExpr) =
454 Result.ok (GLShader uid src tipe)
453 Result.ok (GLShader uid src tipe)
457−canonicalizePattern :: Env.Environment -> P.Raw -> Result.ResultErr P.Canonical
456+canonicalizePattern :: Env.Environment -> P.Raw -> CResult P.Canonical
458canonicalizePattern env (A.A region ptrn) =
457canonicalizePattern env (A.A region ptrn) =
459 A.A region <$>
458 A.A region <$>
460 case ptrn of
459 case ptrn of
@@ -475,5 +474,5 @@ canonicalizePattern env (A.A region ptrn) =
476 P.Data (Var.Raw name) patterns ->
475 P.Data (Var.Raw name) patterns ->
478− <$> Canonicalize.pvar region env name (length patterns)
477+ <$> Canon.pvar region env name (length patterns)
479− <*> T.traverse (canonicalizePattern env) patterns
478+ <*> traverse (canonicalizePattern env) patterns