@@ -12,7 +12,6 @@ import qualified Data.Set as Set
13import Context
13import Context
14import Guid
14import Guid
15−import qualified Libraries as Libraries
17import Types.Types
16import Types.Types
18import Types.Substitutions
17import Types.Substitutions
@@ -21,12 +20,11 @@ beta = VarT `liftM` guid
21unionA = Map.unionWith (++)
20unionA = Map.unionWith (++)
22unionsA = Map.unionsWith (++)
21unionsA = Map.unionsWith (++)
24−getAliases imports hints = hints ++ concatMap aliasesFrom imports
23+getAliases imports hints = concatMap aliasesFrom imports
25 where aliasesFrom (name,method) =
24 where aliasesFrom (name,method) =
26 let values = concatMap (getValue name) hints
25 let values = concatMap (getValue name) hints
27 in case method of
26 in case method of
28− As alias -> if alias == name then [] else
29− map (\(n,t) -> (alias ++ "." ++ n, t)) values
27+ As alias -> map (\(n,t) -> (alias ++ "." ++ n, t)) values
30 Hiding vs -> filter (\(n,t) -> n `notElem` vs) values
28 Hiding vs -> filter (\(n,t) -> n `notElem` vs) values
31 Importing vs -> filter (\(n,t) -> n `elem` vs) values
29 Importing vs -> filter (\(n,t) -> n `elem` vs) values
32 getValue inModule (name,tipe) =
30 getValue inModule (name,tipe) =
@@ -34,13 +32,15 @@ getAliases imports hints = hints ++ concatMap aliasesFrom imports
34 True -> [ (drop (length inModule + 1) name, tipe) ]
32 True -> [ (drop (length inModule + 1) name, tipe) ]
35 False -> []
33 False -> []
37−findAmbiguous hints hints' assumptions continue =
35+findAmbiguous hints assumptions continue =
38− let potentialDups = map head . filter (\g -> length g > 1) . group $ sort hints'
36+ let potentialDups = map head . filter (\g -> length g > 1) . group . sort $
37+ filter (elem '.') hints
39− dups = filter (\k -> Map.member k assumptions) potentialDups
38+ dups = filter (\k -> Map.member k assumptions) potentialDups
40− in case dups of
39+ in case dups of
41− n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++
40+ n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++
41+ "' could refer to " ++
42− "' could refer to " ++ intercalate ", " (filter (isSuffixOf n) hints)
42+ intercalate ", " (filter (isSuffixOf n) hints)
43− _ -> continue
43+ _ -> continue
45mergeSchemes :: [Map.Map String Scheme]
45mergeSchemes :: [Map.Map String Scheme]
46 -> GuidCounter (TVarMap, ConstraintSet, Map.Map String Scheme)
46 -> GuidCounter (TVarMap, ConstraintSet, Map.Map String Scheme)
@@ -61,15 +61,14 @@ mergeSchemes schmss = do (ass,css,sss) <- unzip3 `liftM` mapM split kvs
62constrain typeHints (Module _ _ imports stmts) = do
62constrain typeHints (Module _ _ imports stmts) = do
63 (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts
63 (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts
64− hints <- typeHints
64+ aliasHints <- getAliases imports `liftM` typeHints
65 (as', cs', schemes) <- mergeSchemes schemess
65 (as', cs', schemes) <- mergeSchemes schemess
66 let constraints = Set.unions (cs':css)
66 let constraints = Set.unions (cs':css)
67 as = unionsA (as':ass)
67 as = unionsA (as':ass)
68− aliasHints = getAliases (imports ++ Libraries.prelude) hints
69 allHints = Map.union schemes (Map.fromList aliasHints)
68 allHints = Map.union schemes (Map.fromList aliasHints)
70 insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as
69 insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as
71 assumptions <- foldM insert as (Map.keys schemes)
70 assumptions <- foldM insert as (Map.keys schemes)
72− findAmbiguous (map fst hints) (map fst aliasHints) assumptions $ do
71+ findAmbiguous (map fst aliasHints) assumptions $ do
73 let f k s vs = map (\v -> C (Just k) NoSpan $ v :<<: s) vs
72 let f k s vs = map (\v -> C (Just k) NoSpan $ v :<<: s) vs
74 cs = concat . Map.elems $ Map.intersectionWithKey f allHints assumptions
73 cs = concat . Map.elems $ Map.intersectionWithKey f allHints assumptions
75 escapees = Map.keys $ Map.difference assumptions allHints
74 escapees = Map.keys $ Map.difference assumptions allHints