@@ -39,27 +39,30 @@ module'
3939 :: Module.Interfaces
4040 -> Module.ValidModule
4141 -> R.Result Warning.Warning Error.Error Module.CanonicalModule
42−module' interfaces modul@(Module.Module _ _ _ (_, imports) _) =
42+module' interfaces modul =
4343 let (Result.Result uses rawResults) =
4444 moduleHelp interfaces modul
45−
46− unusedImportWarnings =
47− Maybe.mapMaybe (warnUnusedImport uses) imports
4845 in
49− R.addWarnings unusedImportWarnings $
50− case rawResults of
51− Result.Ok canonicalModule ->
52− return canonicalModule
46+ case rawResults of
47+ Result.Ok almostCanonicalModule ->
48+ filterImports uses almostCanonicalModule
49+
50+ Result.Err msgs ->
51+ R.throwMany (map (A.map Error.Canonicalize) msgs)
5352
54− Result.Err msgs ->
55− R.throwMany (map (A.map Error.Canonicalize) msgs)
53+
54+type AlmostCanonicalModule =
55+ Module.Module
56+ ([Module.DefaultImport], [Module.UserImport])
57+ [Var.Value]
58+ Module.CanonicalBody
5659
5760
5861moduleHelp
5962 :: Module.Interfaces
6063 -> Module.ValidModule
61− -> Result.ResultErr Module.CanonicalModule
62−moduleHelp interfaces modul@(Module.Module _ _ exports (defaults, imports) decls) =
64+ -> Result.ResultErr AlmostCanonicalModule
65+moduleHelp interfaces modul@(Module.Module _ _ exports _ decls) =
6366 canonicalModule
6467 <$> canonicalDeclsResult
6568 <*> resolveExports locals exports
@@ -67,7 +70,6 @@ moduleHelp interfaces modul@(Module.Module _ _ exports (defaults, imports) decls
6770 canonicalModule canonicalDecls canonicalExports =
6871 modul
6972 { Module.exports = canonicalExports
70− , Module.imports = map fst defaults ++ map (fst . A.drop) imports
7173 , Module.body = body canonicalDecls
7274 }
7375
@@ -108,14 +110,26 @@ moduleHelp interfaces modul@(Module.Module _ _ exports (defaults, imports) decls
108110
109111-- IMPORTS / EXPORTS
110112
111−warnUnusedImport
113+filterImports
112114 :: Set.Set Module.Name
113− -> Module.UserImport
114− -> Maybe (A.Located Warning.Warning)
115−warnUnusedImport uses (A.A region (name, _method)) =
116− if Set.member name uses
117− then Nothing
118− else Just (A.A region (Warning.UnusedImport name))
115+ -> AlmostCanonicalModule
116+ -> R.Result Warning.Warning e Module.CanonicalModule
117+filterImports uses modul@(Module.Module _ _ _ (defaults, imports) _) =
118+ do reducedImports <-
119+ Maybe.catMaybes <$> T.traverse checkImport imports
120+
121+ return $ modul
122+ { Module.imports =
123+ Set.toList (Set.fromList (map fst defaults ++ reducedImports))
124+ }
125+ where
126+ checkImport (A.A region (name, _method)) =
127+ if Set.member name uses
128+ then
129+ return (Just name)
130+ else
131+ do R.warn region (Warning.UnusedImport name)
132+ return Nothing
119133
120134
121135resolveExports