on master help sign in
Give more specific errors when a variable cannot be found during canonicalization
0b93171Evan Czaplicki
compiler/Transform/Canonicalize.hs+9−8
@@ -61,7 +61,7 @@ metadataModule ifaces modul =
61 second f (a,b) = (,) a `fmap` f b
61 second f (a,b) = (,) a `fmap` f b
62 third f (a,b,c) = (,,) a b `fmap` f c
62 third f (a,b,c) = (,,) a b `fmap` f c
63 renameType' =
63 renameType' =
64− Either.either (\err -> Left [P.text err]) return . renameType (replace initialEnv)
64+ Either.either (\err -> Left [P.text err]) return . renameType (replace "type" initialEnv)
65
65
66 get1 (a,_,_) = a
66 get1 (a,_,_) = a
67 canon (name, importMethod) =
67 canon (name, importMethod) =
@@ -92,12 +92,12 @@ extend env pattern = Map.union (Map.fromList (zip xs xs)) env
92 where xs = Set.toList (SD.boundVars pattern)
92 where xs = Set.toList (SD.boundVars pattern)
93
93
94
94
95−replace :: Env -> String -> Either String String
95+replace :: String -> Env -> String -> Either String String
96−replace env v =
96+replace variable env v =
97 if List.isPrefixOf "Native." v then return v else
97 if List.isPrefixOf "Native." v then return v else
98 case Map.lookup v env of
98 case Map.lookup v env of
99 Just v' -> return v'
99 Just v' -> return v'
100− Nothing -> Left $ "Could not find variable '" ++ v ++ "'." ++ msg
100+ Nothing -> Left $ "Could not find " ++ variable ++ " '" ++ v ++ "'." ++ msg
101 where
101 where
102 matches = filter (List.isInfixOf v) (Map.keys env)
102 matches = filter (List.isInfixOf v) (Map.keys env)
103 msg = if null matches then "" else
103 msg = if null matches then "" else
@@ -129,7 +129,7 @@ rename env lexpr@(L s expr) =
129 frnm (f,e) = (,) f `liftM` rename env e
129 frnm (f,e) = (,) f `liftM` rename env e
130
130
131 Binop op e1 e2 ->
131 Binop op e1 e2 ->
132− do op' <- format (replace env op)
132+ do op' <- format (replace "variable" env op)
133 Binop op' `liftM` rnm e1 `ap` rnm e2
133 Binop op' `liftM` rnm e1 `ap` rnm e2
134
134
135 Lambda pattern e ->
135 Lambda pattern e ->
@@ -149,9 +149,10 @@ rename env lexpr@(L s expr) =
149 Def p exp ->
149 Def p exp ->
150 Def `liftM` format (renamePattern env' p) `ap` rename env' exp
150 Def `liftM` format (renamePattern env' p) `ap` rename env' exp
151 TypeAnnotation name tipe ->
151 TypeAnnotation name tipe ->
152+ TypeAnnotation name `liftM`
152− TypeAnnotation name `liftM` renameType (format . replace env') tipe
153+ renameType (format . replace "variable" env') tipe
153
154
154− Var x -> Var `liftM` format (replace env x)
155+ Var x -> Var `liftM` format (replace "variable" env x)
155
156
156 Data name es -> Data name `liftM` mapM rnm es
157 Data name es -> Data name `liftM` mapM rnm es
157
158
@@ -173,5 +174,5 @@ renamePattern env pattern =
173 PRecord _ -> return pattern
174 PRecord _ -> return pattern
174 PAnything -> return pattern
175 PAnything -> return pattern
175 PAlias x p -> PAlias x `liftM` renamePattern env p
176 PAlias x p -> PAlias x `liftM` renamePattern env p
176− PData name ps -> PData `liftM` replace env name
177+ PData name ps -> PData `liftM` replace "pattern" env name
177 `ap` mapM (renamePattern env) ps
178 `ap` mapM (renamePattern env) ps