@@ -12,6 +12,7 @@ import qualified AST.Type as Type
12import qualified AST.Variable as Var
12import qualified AST.Variable as Var
13import Transform.Canonicalize.Environment as Env
13import Transform.Canonicalize.Environment as Env
15variable :: Environment -> String -> Canonicalizer String Var.Canonical
16variable :: Environment -> String -> Canonicalizer String Var.Canonical
16variable env var =
17variable env var =
17 case modul of
18 case modul of
@@ -30,8 +31,11 @@ variable env var =
30 [x] -> (Nothing, x)
31 [x] -> (Nothing, x)
31 xs -> (Just (init xs), last xs)
32 xs -> (Just (init xs), last xs)
33−tvar :: Environment -> String
36+ :: Environment
34− -> Canonicalizer String (Either Var.Canonical (Var.Canonical, [String], Type.CanonicalType))
38+ -> Canonicalizer String (Either Var.Canonical (Var.Canonical, [String], Type.CanonicalType))
35tvar env var =
39tvar env var =
36 case adts ++ aliases of
40 case adts ++ aliases of
37 [] -> notFound "type" (Map.keys (_adts env) ++ Map.keys (_aliases env)) var
41 [] -> notFound "type" (Map.keys (_adts env) ++ Map.keys (_aliases env)) var
@@ -46,6 +50,7 @@ tvar env var =
46 Left v -> v
50 Left v -> v
47 Right (v,_,_) -> v
51 Right (v,_,_) -> v
49pvar :: Environment -> String -> Canonicalizer String Var.Canonical
54pvar :: Environment -> String -> Canonicalizer String Var.Canonical
50pvar env var =
55pvar env var =
51 case Map.lookup var (_patterns env) of
56 case Map.lookup var (_patterns env) of
@@ -53,10 +58,12 @@ pvar env var =
53 Just vs -> preferLocals env "pattern" vs var
58 Just vs -> preferLocals env "pattern" vs var
54 Nothing -> notFound "pattern" (Map.keys (_patterns env)) var
59 Nothing -> notFound "pattern" (Map.keys (_patterns env)) var
56found :: (a -> Var.Canonical) -> a -> Canonicalizer String a
62found :: (a -> Var.Canonical) -> a -> Canonicalizer String a
57−found extract v = do
63+found extract v =
58− _ <- Env.using (extract v)
64+ do _ <- Env.using (extract v)
61notFound :: String -> [String] -> String -> Canonicalizer String a
68notFound :: String -> [String] -> String -> Canonicalizer String a
62notFound kind possibilities var =
69notFound kind possibilities var =
@@ -66,12 +73,24 @@ notFound kind possibilities var =
66 msg = if null matches then "" else
73 msg = if null matches then "" else
67 "\nClose matches include: " ++ List.intercalate ", " matches
74 "\nClose matches include: " ++ List.intercalate ", " matches
69−preferLocals :: Environment -> String -> [Var.Canonical] -> String
70− -> Canonicalizer String Var.Canonical
71−preferLocals env = preferLocals' env id
82+ -> Canonicalizer String Var.Canonical
73−preferLocals' :: Environment -> (a -> Var.Canonical) -> String -> [a] -> String
89+ -> (a -> Var.Canonical)
74− -> Canonicalizer String a
93+ -> Canonicalizer String a
75preferLocals' env extract kind possibilities var =
94preferLocals' env extract kind possibilities var =
76 case filter (isLocal . extract) possibilities of
95 case filter (isLocal . extract) possibilities of
77 [] -> ambiguous possibilities
96 [] -> ambiguous possibilities