@@ -47,8 +47,9 @@ genConstraints
47 :: Module.Interfaces
47 :: Module.Interfaces
48 -> Module.Canonical
48 -> Module.Canonical
49 -> IO (Map.Map Text T.Type, T.Constraint)
49 -> IO (Map.Map Text T.Type, T.Constraint)
50−genConstraints interfaces modul@(Module.Module _ info) =
50+genConstraints allInterfaces modul@(Module.Module _ info) =
51+ do let directDeps = toDirectDeps (Set.fromList (Module.imports info)) allInterfaces
51− do let env = Env.initialize (canonicalizeUnions interfaces modul)
52+ let env = Env.initialize (canonicalizeUnions directDeps modul)
54 {-# SCC elm_compiler_mk_ctor_types #-}
55 {-# SCC elm_compiler_mk_ctor_types #-}
@@ -56,10 +57,7 @@ genConstraints interfaces modul@(Module.Module _ info) =
56 do (_, vars, args, result) <- Env.freshDataScheme env name
57 do (_, vars, args, result) <- Env.freshDataScheme env name
57 return (name, (vars, foldr T.FunN result args))
58 return (name, (vars, foldr T.FunN result args))
60− {-# SCC elm_compiler_mk_value_types #-}
61− forM (Map.toList interfaces) $
62− canonicalizeValues env (Set.fromList (Module.imports info))
60+ importedVars <- mapM (canonicalizeValues env) directDeps
64 let allTypes = concat (ctors : importedVars)
62 let allTypes = concat (ctors : importedVars)
65 let vars = concatMap (fst . snd) allTypes
63 let vars = concatMap (fst . snd) allTypes
@@ -75,27 +73,35 @@ genConstraints interfaces modul@(Module.Module _ info) =
75 return (header, environ constraint)
73 return (header, environ constraint)
76+toDirectDeps :: Set.Set ModuleName.Raw -> Module.Interfaces -> [(ModuleName.Canonical, Module.Interface)]
77+toDirectDeps imports interfaces =
79+ isDirect (ModuleName.Canonical _ name, _) =
80+ Set.member name imports
82+ filter isDirect (Map.toList interfaces)
78canonicalizeValues
85canonicalizeValues
79 :: Env.Env
86 :: Env.Env
80− -> Set.Set ModuleName.Raw
81 -> (ModuleName.Canonical, Module.Interface)
87 -> (ModuleName.Canonical, Module.Interface)
82 -> IO [(Text, ([T.Variable], T.Type))]
88 -> IO [(Text, ([T.Variable], T.Type))]
83−canonicalizeValues env imports (moduleName@(ModuleName.Canonical _ rawName), iface) =
89+canonicalizeValues env (moduleName, iface) =
84− if Set.notMember rawName imports then
87− forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
90+ forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
88− do (flexType, flexVars) <- Env.instantiateFlex env tipe
91+ do (flexType, flexVars) <- Env.instantiateFlex env tipe
90− ( ModuleName.canonicalToText moduleName <> "." <> name
93+ ( ModuleName.canonicalToText moduleName <> "." <> name
91− , ( Map.elems flexVars
94+ , ( Map.elems flexVars
92− , flexType
95+ , flexType
101+ :: [(ModuleName.Canonical, Module.Interface)]
97−canonicalizeUnions :: Module.Interfaces -> Module.Canonical -> [Module.CanonicalUnion]
103+ -> [Module.CanonicalUnion]
98−canonicalizeUnions interfaces (Module.Module name info) =
104+canonicalizeUnions directDeps (Module.Module name info) =
99 localUnions ++ importedUnions
105 localUnions ++ importedUnions
101 localUnions :: [Module.CanonicalUnion]
107 localUnions :: [Module.CanonicalUnion]
@@ -104,7 +110,7 @@ canonicalizeUnions interfaces (Module.Module name info) =
105 importedUnions :: [Module.CanonicalUnion]
111 importedUnions :: [Module.CanonicalUnion]
106 importedUnions =
112 importedUnions =
107− concatMap (format . second Module.iUnions) (Map.toList interfaces)
113+ concatMap (format . second Module.iUnions) directDeps
110format :: (ModuleName.Canonical, Module.Unions) -> [Module.CanonicalUnion]
116format :: (ModuleName.Canonical, Module.Unions) -> [Module.CanonicalUnion]