@@ -1,7 +1,8 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module Canonicalize.Environment.Local
4− ( addDeclarations
4+ ( addVarsTypesOps
5+ , addPatterns
56 )
67 where
78
@@ -12,6 +13,7 @@ import qualified Data.Graph as Graph
1213import qualified Data.Map.Strict as Map
1314import qualified Data.Map.Merge.Strict as Map
1415
16+import qualified AST.Expression.Canonical as Can
1517import qualified AST.Expression.Valid as Valid
1618import qualified AST.Type as Type
1719import qualified Canonicalize.Environment.Dups as Dups
@@ -36,14 +38,18 @@ type Result a =
3638
3739
3840
39−-- ADD DECLARATIONS
41+-- ADD VARS, TYPES, AND OPS
42+--
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.
46+--
47+-- This code checks for (1) duplicate names and (2) cycles in type aliases.
4048
4149
42−addDeclarations :: Valid.Module -> Env.Env -> Result Env.Env
43−addDeclarations module_ env =
44− addVars module_
45− =<< addTypes module_
46− =<< addBinops module_ (addPatterns module_ env)
50+addVarsTypesOps :: Valid.Module -> Env.Env -> Result Env.Env
51+addVarsTypesOps module_ env =
52+ addVars module_ =<< addTypes module_ =<< addBinops module_ env
4753
4854
4955merge
@@ -65,31 +71,36 @@ merge addLeft addBoth locals foreigns =
6571
6672-- ADD PATTERNS
6773--
68−-- This does not return a Result because Dups.detect is already called in
69−-- collectUpperVars. This will detect all local pattern clashes. We skip it
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.
77+--
78+-- This function does not return a Result because Dups.detect is already called
79+-- in collectUpperVars. This will detect all local pattern clashes. We skip it
7080-- here to avoid a second version of the same error.
7181
7282
73−addPatterns :: Valid.Module -> Env.Env -> Env.Env
74−addPatterns (Valid.Module _ _ _ _ _ _ unions _ _ _) (Env.Env home vars types patterns binops) =
83+addPatterns :: Map.Map N.Name Can.Union -> Env.Env -> Env.Env
84+addPatterns unions (Env.Env home vars types patterns binops) =
7585 let
76− unionToInfos (Valid.Union _ _ ctors) =
77− map ctorToPair ctors
78−
79− ctorToPair (A.A _ name, args) =
80− ( name, length args )
81−
8286 localPatterns =
83− Map.fromList $ concatMap unionToInfos unions
87+ Map.fromList $ concatMap toPatterns (Map.toList unions)
8488
85− addLeft _ arity =
86− Env.Homes (Bag.one (home, arity)) Map.empty
87−
88− addBoth _ arity (Env.Homes _ qualified) =
89− Env.Homes (Bag.one (home, arity)) qualified
89+ toPatterns (tipe, Can.Union tvars ctors) =
90+ map (ctorToPattern tipe tvars) ctors
9091
92+ ctorToPattern tipe tvars (name, args) =
93+ ( name, Env.Pattern home tipe tvars args )
94+ in
95+ let
9196 newPatterns =
9297 merge addLeft addBoth localPatterns patterns
98+
99+ addLeft _ localPattern =
100+ Env.Homes (Bag.one localPattern) Map.empty
101+
102+ addBoth _ localPattern (Env.Homes _ qualified) =
103+ Env.Homes (Bag.one localPattern) qualified
93104 in
94105 Env.Env home vars types newPatterns binops
95106
@@ -229,14 +240,11 @@ addTypes (Valid.Module _ _ _ _ _ _ unions aliases _ _) env =
229240addUnionTypes :: Map.Map N.Name Int -> Env.Env -> Env.Env
230241addUnionTypes unions (Env.Env home vars types patterns binops) =
231242 let
232− unionHome =
233− Env.Union home
234−
235243 addLeft _ arity =
236− Env.Homes (Bag.one (unionHome, arity)) Map.empty
244+ Env.Homes (Bag.one (Env.Union arity home)) Map.empty
237245
238246 addBoth _ arity (Env.Homes _ qualified) =
239− Env.Homes (Bag.one (unionHome, arity)) qualified
247+ Env.Homes (Bag.one (Env.Union arity home)) qualified
240248
241249 newTypes =
242250 merge addLeft addBoth unions types
@@ -269,7 +277,7 @@ addTypeAlias env@(Env.Env home vars types patterns binops) scc =
269277 case scc of
270278 Graph.AcyclicSCC (Alias _ name args tipe) ->
271279 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
273281 let newTypes = Map.alter (addAliasInfo info) name types
274282 return $ Env.Env home vars newTypes patterns binops
275283