on master help sign in
Make sure `elm diff` localizes types from the package it analyzes
538992bEvan Czaplicki
builder/src/Elm/Diff.hs+36−31
@@ -28,6 +28,7 @@ import qualified Reporting.Doc as D
28import qualified Reporting.Exit as Exit
28import qualified Reporting.Exit as Exit
29import qualified Reporting.Exit.Diff as E
29import qualified Reporting.Exit.Diff as E
30import qualified Reporting.Exit.Help as Help
30import qualified Reporting.Exit.Help as Help
31+import qualified Reporting.Render.Type.Localizer as L
31import qualified Reporting.Task as Task
32import qualified Reporting.Task as Task
32
33
33
34
@@ -54,25 +55,25 @@ diff args =
54 Right vsns ->
55 Right vsns ->
55 do oldDocs <- getDocs name vsns (min v1 v2)
56 do oldDocs <- getDocs name vsns (min v1 v2)
56 newDocs <- getDocs name vsns (max v1 v2)
57 newDocs <- getDocs name vsns (max v1 v2)
57− writeDoc (toDoc (Diff.diff oldDocs newDocs))
58+ writeDiff oldDocs newDocs
58
59
59 LocalInquiry v1 v2 ->
60 LocalInquiry v1 v2 ->
60 do (_, name, vsns) <- getPackageInfo
61 do (_, name, vsns) <- getPackageInfo
61 oldDocs <- getDocs name vsns (min v1 v2)
62 oldDocs <- getDocs name vsns (min v1 v2)
62 newDocs <- getDocs name vsns (max v1 v2)
63 newDocs <- getDocs name vsns (max v1 v2)
63− writeDoc (toDoc (Diff.diff oldDocs newDocs))
64+ writeDiff oldDocs newDocs
64
65
65 CodeVsLatest ->
66 CodeVsLatest ->
66 do (summary, name, vsns) <- getPackageInfo
67 do (summary, name, vsns) <- getPackageInfo
67 oldDocs <- getDocs name vsns (maximum vsns)
68 oldDocs <- getDocs name vsns (maximum vsns)
68 newDocs <- Task.silently (Project.generateDocs summary)
69 newDocs <- Task.silently (Project.generateDocs summary)
69− writeDoc (toDoc (Diff.diff oldDocs newDocs))
70+ writeDiff oldDocs newDocs
70
71
71 CodeVsExactly version ->
72 CodeVsExactly version ->
72 do (summary, name, vsns) <- getPackageInfo
73 do (summary, name, vsns) <- getPackageInfo
73 oldDocs <- getDocs name vsns version
74 oldDocs <- getDocs name vsns version
74 newDocs <- Task.silently (Project.generateDocs summary)
75 newDocs <- Task.silently (Project.generateDocs summary)
75− writeDoc (toDoc (Diff.diff oldDocs newDocs))
76+ writeDiff oldDocs newDocs
76
77
77
78
78throw :: E.Exit -> Task.Task a
79throw :: E.Exit -> Task.Task a
@@ -109,17 +110,21 @@ getPackageInfo =
109-- WRITE DOC
110-- WRITE DOC
110
111
111
112
112−writeDoc :: D.Doc -> Task.Task ()
113+writeDiff :: Docs.Documentation -> Docs.Documentation -> Task.Task ()
113−writeDoc doc =
114+writeDiff oldDocs newDocs =
115+ let
116+ changes = Diff.diff oldDocs newDocs
117+ localizer = L.fromNames (Map.union oldDocs newDocs)
118+ in
114− liftIO $ Help.toStdout (doc <> "\n")
119+ liftIO $ Help.toStdout (toDoc localizer changes <> "\n")
115
120
116
121
117
122
118-- TO DOC
123-- TO DOC
119
124
120
125
121−toDoc :: PackageChanges -> D.Doc
126+toDoc :: L.Localizer -> PackageChanges -> D.Doc
122−toDoc changes@(PackageChanges added changed removed) =
127+toDoc localizer changes@(PackageChanges added changed removed) =
123 if null added && Map.null changed && null removed then
128 if null added && Map.null changed && null removed then
124 "No API changes detected, so this is a" <+> D.green "PATCH" <+> "change."
129 "No API changes detected, so this is a" <+> D.green "PATCH" <+> "change."
125 else
130 else
@@ -143,7 +148,7 @@ toDoc changes@(PackageChanges added changed removed) =
143 ]
148 ]
144
149
145 chunks =
150 chunks =
146− addedChunk ++ removedChunk ++ map changesToChunk (Map.toList changed)
151+ addedChunk ++ removedChunk ++ map (changesToChunk localizer) (Map.toList changed)
147 in
152 in
148 D.vcat (header : "" : map chunkToDoc chunks)
153 D.vcat (header : "" : map chunkToDoc chunks)
149
154
@@ -174,23 +179,23 @@ chunkToDoc (Chunk title magnitude details) =
174 ]
179 ]
175
180
176
181
177−changesToChunk :: (N.Name, ModuleChanges) -> Chunk
182+changesToChunk :: L.Localizer -> (N.Name, ModuleChanges) -> Chunk
178−changesToChunk (name, changes@(ModuleChanges unions aliases values binops)) =
183+changesToChunk localizer (name, changes@(ModuleChanges unions aliases values binops)) =
179 let
184 let
180 magnitude =
185 magnitude =
181 Diff.moduleChangeMagnitude changes
186 Diff.moduleChangeMagnitude changes
182
187
183 (unionAdd, unionChange, unionRemove) =
188 (unionAdd, unionChange, unionRemove) =
184− changesToDocTriple unionToDoc unions
189+ changesToDocTriple (unionToDoc localizer) unions
185
190
186 (aliasAdd, aliasChange, aliasRemove) =
191 (aliasAdd, aliasChange, aliasRemove) =
187− changesToDocTriple aliasToDoc aliases
192+ changesToDocTriple (aliasToDoc localizer) aliases
188
193
189 (valueAdd, valueChange, valueRemove) =
194 (valueAdd, valueChange, valueRemove) =
190− changesToDocTriple valueToDoc values
195+ changesToDocTriple (valueToDoc localizer) values
191
196
192 (binopAdd, binopChange, binopRemove) =
197 (binopAdd, binopChange, binopRemove) =
193− changesToDocTriple binopToDoc binops
198+ changesToDocTriple (binopToDoc localizer) binops
194 in
199 in
195 Chunk (N.toString name) magnitude $
200 Chunk (N.toString name) magnitude $
196 D.vcat $ List.intersperse "" $ Maybe.catMaybes $
201 D.vcat $ List.intersperse "" $ Maybe.catMaybes $
@@ -229,35 +234,35 @@ changesToDoc categoryName unions aliases values binops =
229 D.fromString categoryName <> ":" : unions ++ aliases ++ binops ++ values
234 D.fromString categoryName <> ":" : unions ++ aliases ++ binops ++ values
230
235
231
236
232−unionToDoc :: N.Name -> Docs.Union -> D.Doc
237+unionToDoc :: L.Localizer -> N.Name -> Docs.Union -> D.Doc
233−unionToDoc name (Docs.Union _ tvars ctors) =
238+unionToDoc localizer name (Docs.Union _ tvars ctors) =
234 let
239 let
235 setup =
240 setup =
236 "type" <+> D.fromName name <+> D.hsep (map D.fromName tvars)
241 "type" <+> D.fromName name <+> D.hsep (map D.fromName tvars)
237
242
238 ctorDoc (ctor, tipes) =
243 ctorDoc (ctor, tipes) =
239− typeDoc (Type.Type ctor tipes)
244+ typeDoc localizer (Type.Type ctor tipes)
240 in
245 in
241 D.hang 4 (D.sep (setup : zipWith (<+>) ("=" : repeat "|") (map ctorDoc ctors)))
246 D.hang 4 (D.sep (setup : zipWith (<+>) ("=" : repeat "|") (map ctorDoc ctors)))
242
247
243
248
244−aliasToDoc :: N.Name -> Docs.Alias -> D.Doc
249+aliasToDoc :: L.Localizer -> N.Name -> Docs.Alias -> D.Doc
245−aliasToDoc name (Docs.Alias _ tvars tipe) =
250+aliasToDoc localizer name (Docs.Alias _ tvars tipe) =
246 let
251 let
247 declaration =
252 declaration =
248 "type" <+> "alias" <+> D.hsep (map D.fromName (name:tvars)) <+> "="
253 "type" <+> "alias" <+> D.hsep (map D.fromName (name:tvars)) <+> "="
249 in
254 in
250− D.hang 4 (D.sep [ declaration, typeDoc tipe ])
255+ D.hang 4 (D.sep [ declaration, typeDoc localizer tipe ])
251
256
252
257
253−valueToDoc :: N.Name -> Docs.Value -> D.Doc
258+valueToDoc :: L.Localizer -> N.Name -> Docs.Value -> D.Doc
254−valueToDoc name (Docs.Value _ tipe) =
259+valueToDoc localizer name (Docs.Value _ tipe) =
255− D.hang 4 $ D.sep [ D.fromName name <+> ":", typeDoc tipe ]
260+ D.hang 4 $ D.sep [ D.fromName name <+> ":", typeDoc localizer tipe ]
256
261
257
262
258−binopToDoc :: N.Name -> Docs.Binop -> D.Doc
263+binopToDoc :: L.Localizer -> N.Name -> Docs.Binop -> D.Doc
259−binopToDoc name (Docs.Binop _ tipe associativity (Docs.Precedence n)) =
264+binopToDoc localizer name (Docs.Binop _ tipe associativity (Docs.Precedence n)) =
260− "(" <> D.fromName name <> ")" <+> ":" <+> typeDoc tipe <> D.black details
265+ "(" <> D.fromName name <> ")" <+> ":" <+> typeDoc localizer tipe <> D.black details
261 where
266 where
262 details =
267 details =
263 " (" <> D.fromName assoc <> "/" <> D.fromInt n <> ")"
268 " (" <> D.fromName assoc <> "/" <> D.fromInt n <> ")"
@@ -269,6 +274,6 @@ binopToDoc name (Docs.Binop _ tipe associativity (Docs.Precedence n)) =
269 Docs.Right -> "right"
274 Docs.Right -> "right"
270
275
271
276
272−typeDoc :: Type.Type -> D.Doc
277+typeDoc :: L.Localizer -> Type.Type -> D.Doc
273−typeDoc tipe =
278+typeDoc localizer tipe =
274− Type.toDoc Type.None tipe
279+ Type.toDoc localizer Type.None tipe
compiler/src/Reporting/Render/Type/Localizer.hs+11−1
@@ -4,6 +4,7 @@ module Reporting.Render.Type.Localizer
4 ( Localizer
4 ( Localizer
5 , toDoc
5 , toDoc
6 , empty
6 , empty
7+ , fromNames
7 , fromImports
8 , fromImports
8 )
9 )
9 where
10 where
@@ -67,7 +68,16 @@ toDoc (Localizer localizer) home name =
67
68
68
69
69
70
70−-- MAKE
71+-- FROM NAMES
72+
73+
74+fromNames :: Map.Map N.Name a -> Localizer
75+fromNames names =
76+ Localizer $ Map.map (\_ -> Import Nothing All) names
77+
78+
79+
80+-- FROM IMPORTS
71
81
72
82
73fromImports :: N.Name -> [Src.Import] -> Localizer
83fromImports :: N.Name -> [Src.Import] -> Localizer