@@ -1,7 +1,8 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Canonicalize.Environment.Local
3module Canonicalize.Environment.Local
4− ( addDeclarations
4+ ( addVarsTypesOps
@@ -12,6 +13,7 @@ import qualified Data.Graph as Graph
12import qualified Data.Map.Strict as Map
13import qualified Data.Map.Strict as Map
13import qualified Data.Map.Merge.Strict as Map
14import qualified Data.Map.Merge.Strict as Map
16+import qualified AST.Expression.Canonical as Can
15import qualified AST.Expression.Valid as Valid
17import qualified AST.Expression.Valid as Valid
16import qualified AST.Type as Type
18import qualified AST.Type as Type
17import qualified Canonicalize.Environment.Dups as Dups
19import qualified Canonicalize.Environment.Dups as Dups
@@ -36,14 +38,18 @@ type Result a =
39−-- ADD DECLARATIONS
41+-- ADD VARS, TYPES, AND OPS
43+-- We can add names for local definitions, unions, aliases, and operators.
44+-- These are basically just names. We CANNOT add patterns though. Those must
45+-- be added by `addPatterns` after some canonicalization has occurred.
47+-- This code checks for (1) duplicate names and (2) cycles in type aliases.
42−addDeclarations :: Valid.Module -> Env.Env -> Result Env.Env
50+addVarsTypesOps :: Valid.Module -> Env.Env -> Result Env.Env
43−addDeclarations module_ env =
51+addVarsTypesOps module_ env =
45− =<< addTypes module_
52+ addVars module_ =<< addTypes module_ =<< addBinops module_ env
46− =<< addBinops module_ (addPatterns module_ env)
@@ -65,31 +71,36 @@ merge addLeft addBoth locals foreigns =
66-- ADD PATTERNS
72-- ADD PATTERNS
74+-- Local patterns are added to the environment later such that we can have
75+-- canonical union types. This way we can avoid looking up the types during
76+-- type constraint generation.
68−-- This does not return a Result because Dups.detect is already called in
78+-- This function does not return a Result because Dups.detect is already called
69−-- collectUpperVars. This will detect all local pattern clashes. We skip it
79+-- in collectUpperVars. This will detect all local pattern clashes. We skip it
70-- here to avoid a second version of the same error.
80-- here to avoid a second version of the same error.
73−addPatterns :: Valid.Module -> Env.Env -> Env.Env
83+addPatterns :: Map.Map N.Name Can.Union -> Env.Env -> Env.Env
74−addPatterns (Valid.Module _ _ _ _ _ _ unions _ _ _) (Env.Env home vars types patterns binops) =
84+addPatterns unions (Env.Env home vars types patterns binops) =
76− unionToInfos (Valid.Union _ _ ctors) =
79− ctorToPair (A.A _ name, args) =
80− ( name, length args )
82 localPatterns =
86 localPatterns =
83− Map.fromList $ concatMap unionToInfos unions
87+ Map.fromList $ concatMap toPatterns (Map.toList unions)
85− addLeft _ arity =
89+ toPatterns (tipe, Can.Union tvars ctors) =
86− Env.Homes (Bag.one (home, arity)) Map.empty
90+ map (ctorToPattern tipe tvars) ctors
88− addBoth _ arity (Env.Homes _ qualified) =
89− Env.Homes (Bag.one (home, arity)) qualified
92+ ctorToPattern tipe tvars (name, args) =
93+ ( name, Env.Pattern home tipe tvars args )
91 newPatterns =
96 newPatterns =
92 merge addLeft addBoth localPatterns patterns
97 merge addLeft addBoth localPatterns patterns
99+ addLeft _ localPattern =
100+ Env.Homes (Bag.one localPattern) Map.empty
102+ addBoth _ localPattern (Env.Homes _ qualified) =
103+ Env.Homes (Bag.one localPattern) qualified
94 Env.Env home vars types newPatterns binops
105 Env.Env home vars types newPatterns binops
@@ -229,14 +240,11 @@ addTypes (Valid.Module _ _ _ _ _ _ unions aliases _ _) env =
229addUnionTypes :: Map.Map N.Name Int -> Env.Env -> Env.Env
240addUnionTypes :: Map.Map N.Name Int -> Env.Env -> Env.Env
230addUnionTypes unions (Env.Env home vars types patterns binops) =
241addUnionTypes unions (Env.Env home vars types patterns binops) =
235 addLeft _ arity =
243 addLeft _ arity =
236− Env.Homes (Bag.one (unionHome, arity)) Map.empty
244+ Env.Homes (Bag.one (Env.Union arity home)) Map.empty
238 addBoth _ arity (Env.Homes _ qualified) =
246 addBoth _ arity (Env.Homes _ qualified) =
239− Env.Homes (Bag.one (unionHome, arity)) qualified
247+ Env.Homes (Bag.one (Env.Union arity home)) qualified
241 newTypes =
249 newTypes =
242 merge addLeft addBoth unions types
250 merge addLeft addBoth unions types
@@ -269,7 +277,7 @@ addTypeAlias env@(Env.Env home vars types patterns binops) scc =
269 case scc of
277 case scc of
270 Graph.AcyclicSCC (Alias _ name args tipe) ->
278 Graph.AcyclicSCC (Alias _ name args tipe) ->
271 do ctype <- Type.canonicalize env tipe
279 do ctype <- Type.canonicalize env tipe
272− let info = (Env.Alias home args ctype, length args)
280+ let info = Env.Alias (length args) home args ctype
273 let newTypes = Map.alter (addAliasInfo info) name types
281 let newTypes = Map.alter (addAliasInfo info) name types
274 return $ Env.Env home vars newTypes patterns binops
282 return $ Env.Env home vars newTypes patterns binops