on master help sign in
Properly privatize interfaces. No private things in public API
2c31662Evan Czaplicki
src/Elm/Interface.hs+29−5
@@ -17,6 +17,7 @@ import qualified AST.Canonical as Can
17import qualified AST.Module.Name as ModuleName
17import qualified AST.Module.Name as ModuleName
18import qualified AST.Utils.Binop as Binop
18import qualified AST.Utils.Binop as Binop
19import qualified Elm.Name as N
19import qualified Elm.Name as N
20+import qualified Reporting.Annotation as A
20
21
21
22
22
23
@@ -54,15 +55,38 @@ data Binop =
54
55
55
56
56fromModule :: Map.Map N.Name Can.Annotation -> Can.Module -> Interface
57fromModule :: Map.Map N.Name Can.Annotation -> Can.Module -> Interface
57−fromModule types (Can.Module _ _ _ _ unions aliases binops _) =
58+fromModule types (Can.Module _ _ exports _ unions aliases binops _) =
58 Interface
59 Interface
59− { _types = types
60+ { _types = privatize exports const types
60− , _unions = unions
61+ , _unions = privatize exports toUnion unions
61− , _aliases = aliases
62+ , _aliases = privatize exports const aliases
62− , _binops = Map.map (toOp types) binops
63+ , _binops = privatize exports const (Map.map (toOp types) binops)
63 }
64 }
64
65
65
66
67+privatize :: Can.Exports -> (a -> A.Located Can.Export -> a) -> Map.Map N.Name a -> Map.Map N.Name a
68+privatize exports func dict =
69+ case exports of
70+ Can.ExportEverything ->
71+ dict
72+
73+ Can.Export explicitExports ->
74+ Map.intersectionWith func dict explicitExports
75+
76+
77+toUnion :: Can.Union -> A.Located Can.Export -> Can.Union
78+toUnion union@(Can.Union vars _ _ opts) (A.At _ export) =
79+ case export of
80+ Can.ExportUnionOpen ->
81+ union
82+
83+ Can.ExportUnionClosed ->
84+ Can.Union vars [] 0 opts
85+
86+ _ ->
87+ error "Compiler bug. Should not run into non-union exports here."
88+
89+
66toOp :: Map.Map N.Name Can.Annotation -> Can.Binop -> Binop
90toOp :: Map.Map N.Name Can.Annotation -> Can.Binop -> Binop
67toOp types (Can.Binop_ associativity precedence name) =
91toOp types (Can.Binop_ associativity precedence name) =
68 Binop name (types ! name) associativity precedence
92 Binop name (types ! name) associativity precedence