@@ -17,19 +17,23 @@ import qualified Type.Inference as TI
20+ :: Map.Map Module.Name Package.Name
20− :: Package.Name
21+ -> Package.Name
22− -> Module.Interfaces
23+ -> Module.CanonicalInterfaces
24 -> Result.Result Warning.Warning Error.Error Module.CanonicalModule
25 -> Result.Result Warning.Warning Error.Error Module.CanonicalModule
26−compile packageName isRoot interfaces source =
27+compile importedPackages packageName isRoot interfaces source =
28 -- determine if default imports should be added
29 -- determine if default imports should be added
29 -- only elm-lang/core is exempt
30 -- only elm-lang/core is exempt
30 let needsDefaults =
31 let needsDefaults =
31 not (packageName == Package.coreName)
32 not (packageName == Package.coreName)
34+ let normalInterfaces =
35+ unCanonicalizeInterfaces importedPackages interfaces
33 -- Parse the source code
37 -- Parse the source code
34 validModule <-
38 validModule <-
35 Result.mapError Error.Syntax $
39 Result.mapError Error.Syntax $
@@ -37,7 +41,7 @@ compile packageName isRoot interfaces source =
38 -- Canonicalize all variables, pinning down where they came from.
42 -- Canonicalize all variables, pinning down where they came from.
39 canonicalModule <-
43 canonicalModule <-
40− Canonicalize.module' interfaces validModule
44+ Canonicalize.module' normalInterfaces validModule
42 -- Run type inference on the program.
46 -- Run type inference on the program.
@@ -48,7 +52,7 @@ compile packageName isRoot interfaces source =
48 Result.mapError Error.Type $
52 Result.mapError Error.Type $
49 Nitpick.topLevelTypes types (Module.body validModule)
53 Nitpick.topLevelTypes types (Module.body validModule)
51− Nitpick.patternMatches interfaces canonicalModule
55+ Nitpick.patternMatches normalInterfaces canonicalModule
53 -- Add the real list of types
57 -- Add the real list of types
54 let body = (Module.body canonicalModule) { Module.types = types }
58 let body = (Module.body canonicalModule) { Module.types = types }
@@ -56,9 +60,26 @@ compile packageName isRoot interfaces source =
56 return $ canonicalModule { Module.body = body }
60 return $ canonicalModule { Module.body = body }
59−getOpTable :: Module.Interfaces -> Parse.OpTable
63+getOpTable :: Module.CanonicalInterfaces -> Parse.OpTable
60getOpTable interfaces =
64getOpTable interfaces =
61 Map.elems interfaces
65 Map.elems interfaces
62 |> concatMap Module.iFixities
66 |> concatMap Module.iFixities
63 |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
67 |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
64 |> Map.fromList
68 |> Map.fromList
71+unCanonicalizeInterfaces
72+ :: Map.Map Module.Name Package.Name
73+ -> Module.CanonicalInterfaces
75+unCanonicalizeInterfaces packageInfo ifaces =
77+ foldFun canonName iface mapSoFar =
78+ case Map.lookup (Module.canonModul canonName) packageInfo of
79+ Just pkg | pkg == (error "TODO iface pkg") ->
80+ Map.insert (Module.canonModul canonName) iface mapSoFar
85+ Map.foldrWithKey foldFun Map.empty ifaces