on master help sign in
Trim available variable names in type inference
267d388Evan Czaplicki
src/Type/Inference.hs+16−10
@@ -4,6 +4,7 @@ module Type.Inference where
4import Control.Arrow (first, second)
4import Control.Arrow (first, second)
5import Control.Monad.Except (Except, forM, liftIO, runExceptT, throwError)
5import Control.Monad.Except (Except, forM, liftIO, runExceptT, throwError)
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7+import qualified Data.Set as Set
7import Data.Monoid ((<>))
8import Data.Monoid ((<>))
8import Data.Text (Text)
9import Data.Text (Text)
9
10
@@ -46,7 +47,7 @@ genConstraints
46 :: Module.Interfaces
47 :: Module.Interfaces
47 -> Module.Canonical
48 -> Module.Canonical
48 -> IO (Map.Map Text T.Type, T.Constraint)
49 -> IO (Map.Map Text T.Type, T.Constraint)
49−genConstraints interfaces modul =
50+genConstraints interfaces modul@(Module.Module _ info) =
50 do let env = Env.initialize (canonicalizeUnions interfaces modul)
51 do let env = Env.initialize (canonicalizeUnions interfaces modul)
51
52
52 ctors <-
53 ctors <-
@@ -57,7 +58,8 @@ genConstraints interfaces modul =
57
58
58 importedVars <-
59 importedVars <-
59 {-# SCC elm_compiler_mk_value_types #-}
60 {-# SCC elm_compiler_mk_value_types #-}
60− mapM (canonicalizeValues env) (Map.toList interfaces)
61+ forM (Map.toList interfaces) $
62+ canonicalizeValues env (Set.fromList (Module.imports info))
61
63
62 let allTypes = concat (ctors : importedVars)
64 let allTypes = concat (ctors : importedVars)
63 let vars = concatMap (fst . snd) allTypes
65 let vars = concatMap (fst . snd) allTypes
@@ -68,24 +70,28 @@ genConstraints interfaces modul =
68
70
69 constraint <-
71 constraint <-
70 {-# SCC elm_compiler_constrain #-}
72 {-# SCC elm_compiler_constrain #-}
71− TcExpr.constrain env (Module.program (Module.info modul)) (T.VarN fvar)
73+ TcExpr.constrain env (Module.program info) (T.VarN fvar)
72
74
73 return (header, environ constraint)
75 return (header, environ constraint)
74
76
75
77
76canonicalizeValues
78canonicalizeValues
77 :: Env.Env
79 :: Env.Env
80+ -> Set.Set ModuleName.Raw
78 -> (ModuleName.Canonical, Module.Interface)
81 -> (ModuleName.Canonical, Module.Interface)
79 -> IO [(Text, ([T.Variable], T.Type))]
82 -> IO [(Text, ([T.Variable], T.Type))]
80−canonicalizeValues env (moduleName, iface) =
83+canonicalizeValues env imports (moduleName@(ModuleName.Canonical _ rawName), iface) =
84+ if Set.notMember rawName imports then
85+ return []
86+ else
81 forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
87 forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
82− do (flexType, flexVars) <- Env.instantiateFlex env tipe
88+ do (flexType, flexVars) <- Env.instantiateFlex env tipe
83− return
89+ return
84− ( ModuleName.canonicalToText moduleName <> "." <> name
90+ ( ModuleName.canonicalToText moduleName <> "." <> name
85− , ( Map.elems flexVars
91+ , ( Map.elems flexVars
86− , flexType
92+ , flexType
87− )
88 )
93 )
94+ )
89
95
90
96
91canonicalizeUnions :: Module.Interfaces -> Module.Canonical -> [Module.CanonicalUnion]
97canonicalizeUnions :: Module.Interfaces -> Module.Canonical -> [Module.CanonicalUnion]