@@ -26,6 +26,7 @@ import Data.Generics (everywhere, everywhereM, everything, mkT, mkM, mkQ, extM,
26import PureScript.Values
26import PureScript.Values
27import PureScript.Types
27import PureScript.Types
28import PureScript.Kinds
28import PureScript.Kinds
29+import PureScript.Names
29import PureScript.TypeChecker.Monad
30import PureScript.TypeChecker.Monad
30import PureScript.TypeChecker.Kinds
31import PureScript.TypeChecker.Kinds
31import PureScript.TypeChecker.Synonyms
32import PureScript.TypeChecker.Synonyms
@@ -48,7 +49,7 @@ newtype TypeSolution = TypeSolution { runTypeSolution :: (Int -> Type, Int -> Ro
48emptyTypeSolution :: TypeSolution
49emptyTypeSolution :: TypeSolution
49emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
50emptyTypeSolution = TypeSolution (TUnknown, RUnknown)
51−typeOf :: String -> Value -> Check PolyType
52+typeOf :: Ident -> Value -> Check PolyType
52typeOf name val = do
53typeOf name val = do
53 me <- fresh
54 me <- fresh
54 (cs, n) <- typeConstraints (M.singleton name me) val
55 (cs, n) <- typeConstraints (M.singleton name me) val
@@ -136,7 +137,7 @@ occursCheck u = everything (||) $ flip extQ g $ mkQ False f
136 g (RUnknown u') | u' == u = True
137 g (RUnknown u') | u' == u = True
137 g _ = False
138 g _ = False
139−typeConstraints :: M.Map String Int -> Value -> Check ([TypeConstraint], Int)
140+typeConstraints :: M.Map Ident Int -> Value -> Check ([TypeConstraint], Int)
140typeConstraints _ (NumericLiteral _) = do
141typeConstraints _ (NumericLiteral _) = do
141 me <- fresh
142 me <- fresh
142 return ([TypeConstraint me Number], me)
143 return ([TypeConstraint me Number], me)
@@ -196,7 +197,7 @@ typeConstraints m (Var var) =
196 Nothing -> do
197 Nothing -> do
197 env <- getEnv
198 env <- getEnv
198 case M.lookup var (names env) of
199 case M.lookup var (names env) of
199− Nothing -> throwError $ var ++ " is undefined"
200+ Nothing -> throwError $ show var ++ " is undefined"
200 Just (PolyType idents ty, _) -> do
201 Just (PolyType idents ty, _) -> do
201 me <- fresh
202 me <- fresh
202 replaced <- replaceVarsWithUnknowns idents ty
203 replaced <- replaceVarsWithUnknowns idents ty
@@ -275,7 +276,7 @@ symBinOpConstraints ty left right result = asymBinOpConstraints ty ty left right
275asymBinOpConstraints :: Type -> Type -> Int -> Int -> Int -> [TypeConstraint]
276asymBinOpConstraints :: Type -> Type -> Int -> Int -> Int -> [TypeConstraint]
276asymBinOpConstraints ty res left right result = [TypeConstraint left ty, TypeConstraint right ty, TypeConstraint result res]
277asymBinOpConstraints ty res left right result = [TypeConstraint left ty, TypeConstraint right ty, TypeConstraint result res]
278−typeConstraintsForBinder :: Int -> Binder -> Check ([TypeConstraint], M.Map String Int)
279+typeConstraintsForBinder :: Int -> Binder -> Check ([TypeConstraint], M.Map Ident Int)
279typeConstraintsForBinder val (StringBinder _) = constantBinder val String
280typeConstraintsForBinder val (StringBinder _) = constantBinder val String
280typeConstraintsForBinder val (NumberBinder _) = constantBinder val Number
281typeConstraintsForBinder val (NumberBinder _) = constantBinder val Number
281typeConstraintsForBinder val (BooleanBinder _) = constantBinder val Boolean
282typeConstraintsForBinder val (BooleanBinder _) = constantBinder val Boolean
@@ -305,7 +306,7 @@ typeConstraintsForBinder val (ObjectBinder props) = do
305 (cs, m1) <- typeConstraintsForProperties row (RUnknown rest) props
306 (cs, m1) <- typeConstraintsForProperties row (RUnknown rest) props
306 return ((TypeConstraint val (Object (RUnknown row))) : cs, m1)
307 return ((TypeConstraint val (Object (RUnknown row))) : cs, m1)
308− typeConstraintsForProperties :: Int -> Row -> [(String, Binder)] -> Check ([TypeConstraint], M.Map String Int)
309+ typeConstraintsForProperties :: Int -> Row -> [(String, Binder)] -> Check ([TypeConstraint], M.Map Ident Int)
309 typeConstraintsForProperties nrow row [] = return ([RowConstraint nrow row], M.empty)
310 typeConstraintsForProperties nrow row [] = return ([RowConstraint nrow row], M.empty)
310 typeConstraintsForProperties nrow row ((name, binder):binders) = do
311 typeConstraintsForProperties nrow row ((name, binder):binders) = do
311 propTy <- fresh
312 propTy <- fresh
@@ -323,10 +324,10 @@ typeConstraintsForBinder val (ArrayBinder binders rest) = do
323 (cs2, m2) <- typeConstraintsForBinder val binder
324 (cs2, m2) <- typeConstraintsForBinder val binder
324 return (arrayConstraint : cs1 ++ cs2, M.union m1 m2)
325 return (arrayConstraint : cs1 ++ cs2, M.union m1 m2)
326−constantBinder :: Int -> Type -> Check ([TypeConstraint], M.Map String Int)
327+constantBinder :: Int -> Type -> Check ([TypeConstraint], M.Map Ident Int)
327constantBinder val ty = return ([TypeConstraint val ty], M.empty)
328constantBinder val ty = return ([TypeConstraint val ty], M.empty)
329−typeConstraintsForBinders :: M.Map String Int -> Int -> Int -> [(Binder, Value)] -> Check [TypeConstraint]
330+typeConstraintsForBinders :: M.Map Ident Int -> Int -> Int -> [(Binder, Value)] -> Check [TypeConstraint]
330typeConstraintsForBinders _ _ _ [] = return []
331typeConstraintsForBinders _ _ _ [] = return []
331typeConstraintsForBinders m nval ret ((binder, val):bs) = do
332typeConstraintsForBinders m nval ret ((binder, val):bs) = do
332 (cs1, m1) <- typeConstraintsForBinder nval binder
333 (cs1, m1) <- typeConstraintsForBinder nval binder
@@ -334,13 +335,13 @@ typeConstraintsForBinders m nval ret ((binder, val):bs) = do
334 cs3 <- typeConstraintsForBinders m nval ret bs
335 cs3 <- typeConstraintsForBinders m nval ret bs
335 return ((TypeConstraint n2 (TUnknown ret)) : cs1 ++ cs2 ++ cs3)
336 return ((TypeConstraint n2 (TUnknown ret)) : cs1 ++ cs2 ++ cs3)
337−typeConstraintsForStatement :: M.Map String Int -> M.Map String Int -> Int -> Statement -> Check ([TypeConstraint], Bool, M.Map String Int)
338+typeConstraintsForStatement :: M.Map Ident Int -> M.Map Ident Int -> Int -> Statement -> Check ([TypeConstraint], Bool, M.Map Ident Int)
338typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
339typeConstraintsForStatement m mass ret (VariableIntroduction name val) = do
339 case M.lookup name (m `M.union` mass) of
340 case M.lookup name (m `M.union` mass) of
340 Nothing -> do
341 Nothing -> do
341 (cs1, n1) <- typeConstraints m val
342 (cs1, n1) <- typeConstraints m val
342 return $ (cs1, False, M.insert name n1 mass)
343 return $ (cs1, False, M.insert name n1 mass)
343− Just ty -> throwError $ "Variable with name " ++ name ++ " already exists."
344+ Just ty -> throwError $ "Variable with name " ++ show name ++ " already exists."
344typeConstraintsForStatement m mass ret (Assignment tgt val) = do
345typeConstraintsForStatement m mass ret (Assignment tgt val) = do
345 (cs1, n1) <- typeConstraints m val
346 (cs1, n1) <- typeConstraints m val
346 cs2 <- typeConstraintsForAssignmentTarget m mass n1 tgt
347 cs2 <- typeConstraintsForAssignmentTarget m mass n1 tgt
@@ -370,10 +371,10 @@ typeConstraintsForStatement m mass ret (Return val) = do
370 (cs1, n1) <- typeConstraints (m `M.union` mass) val
371 (cs1, n1) <- typeConstraints (m `M.union` mass) val
371 return ((TypeConstraint n1 (TUnknown ret)) : cs1, True, mass)
372 return ((TypeConstraint n1 (TUnknown ret)) : cs1, True, mass)
373−typeConstraintsForAssignmentTarget :: M.Map String Int -> M.Map String Int -> Int -> AssignmentTarget -> Check [TypeConstraint]
374+typeConstraintsForAssignmentTarget :: M.Map Ident Int -> M.Map Ident Int -> Int -> AssignmentTarget -> Check [TypeConstraint]
374typeConstraintsForAssignmentTarget m mass nval (AssignVariable var) =
375typeConstraintsForAssignmentTarget m mass nval (AssignVariable var) =
375 case M.lookup var mass of
376 case M.lookup var mass of
376− Nothing -> throwError $ "No local variable with name " ++ var
377+ Nothing -> throwError $ "No local variable with name " ++ show var
377 Just ty -> do
378 Just ty -> do
378 return [TypeConstraint nval (TUnknown ty)]
379 return [TypeConstraint nval (TUnknown ty)]
379typeConstraintsForAssignmentTarget m mass nval (AssignArrayIndex index tgt) = do
380typeConstraintsForAssignmentTarget m mass nval (AssignArrayIndex index tgt) = do
@@ -387,7 +388,7 @@ typeConstraintsForAssignmentTarget m mass nval (AssignObjectProperty prop tgt) =
387 cs <- typeConstraintsForAssignmentTarget m mass obj tgt
388 cs <- typeConstraintsForAssignmentTarget m mass obj tgt
388 return $ (TypeConstraint obj (Object (RCons prop (TUnknown nval) $ RUnknown row))) : cs
389 return $ (TypeConstraint obj (Object (RCons prop (TUnknown nval) $ RUnknown row))) : cs
390−typeConstraintsForBlock :: M.Map String Int -> M.Map String Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map String Int)
391+typeConstraintsForBlock :: M.Map Ident Int -> M.Map Ident Int -> Int -> [Statement] -> Check ([TypeConstraint], Bool, M.Map Ident Int)
391typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
392typeConstraintsForBlock _ mass _ [] = return ([], False, mass)
392typeConstraintsForBlock m mass ret (s:ss) = do
393typeConstraintsForBlock m mass ret (s:ss) = do
393 (cs1, b1, mass1) <- typeConstraintsForStatement (m `M.union` mass) mass ret s
394 (cs1, b1, mass1) <- typeConstraintsForStatement (m `M.union` mass) mass ret s