@@ -7,12 +7,22 @@ module Reporting.Render.Type
77 , tuple
88 , record
99 , recordSnippet
10+ , srcToDoc
11+ , canToDoc
1012 )
1113 where
1214
1315
16+import qualified Data.Map as Map
17+import qualified Data.Maybe as Maybe
18+
19+import qualified AST.Source as Src
20+import qualified AST.Canonical as Can
21+import qualified AST.Module.Name as ModuleName
22+import qualified Elm.Name as N
23+import qualified Reporting.Annotation as A
1424import qualified Reporting.Helpers as H
15−import Reporting.Helpers ( Doc, (<+>) )
25+import Reporting.Helpers ( Doc, (<+>), (<>) )
1626
1727
1828
@@ -97,3 +107,129 @@ recordSnippet entry entries =
97107 fields = zipWith (<+>) (repeat ",") (map entryToDoc entries ++ ["..."])
98108 in
99109 H.sep [ H.cat (field:fields), "}" ]
110+
111+
112+
113+-- SOURCE TYPE TO DOC
114+
115+
116+srcToDoc :: Context -> Src.Type -> Doc
117+srcToDoc context (A.At _ tipe) =
118+ case tipe of
119+ Src.TLambda arg1 result ->
120+ let
121+ (arg2, rest) = collectSrcArgs result
122+ in
123+ lambda context
124+ (srcToDoc Func arg1)
125+ (srcToDoc Func arg2)
126+ (map (srcToDoc Func) rest)
127+
128+ Src.TVar name ->
129+ H.nameToDoc name
130+
131+ Src.TType _ name args ->
132+ apply context
133+ (H.nameToDoc name)
134+ (map (srcToDoc App) args)
135+
136+ Src.TTypeQual _ home name args ->
137+ apply context
138+ (H.nameToDoc home <> "." <> H.nameToDoc name)
139+ (map (srcToDoc App) args)
140+
141+ Src.TRecord fields ext ->
142+ record
143+ (map fieldToDocs fields)
144+ (fmap (H.nameToDoc . A.toValue) ext)
145+
146+ Src.TUnit ->
147+ "()"
148+
149+ Src.TTuple a b cs ->
150+ tuple
151+ (srcToDoc None a)
152+ (srcToDoc None b)
153+ (map (srcToDoc None) cs)
154+
155+
156+fieldToDocs :: (A.Located N.Name, Src.Type) -> (Doc, Doc)
157+fieldToDocs (A.At _ fieldName, fieldType) =
158+ ( H.nameToDoc fieldName
159+ , srcToDoc None fieldType
160+ )
161+
162+
163+collectSrcArgs :: Src.Type -> (Src.Type, [Src.Type])
164+collectSrcArgs tipe =
165+ case tipe of
166+ A.At _ (Src.TLambda a result) ->
167+ let
168+ (b, cs) = collectSrcArgs result
169+ in
170+ (a, b:cs)
171+
172+ _ ->
173+ (tipe, [])
174+
175+
176+
177+-- CANONICAL TYPE TO DOC
178+
179+
180+canToDoc :: Context -> Can.Type -> Doc
181+canToDoc context tipe =
182+ case tipe of
183+ Can.TLambda arg1 result ->
184+ let
185+ (arg2, rest) = collectArgs result
186+ in
187+ lambda context
188+ (canToDoc Func arg1)
189+ (canToDoc Func arg2)
190+ (map (canToDoc Func) rest)
191+
192+ Can.TVar name ->
193+ H.nameToDoc name
194+
195+ Can.TType (ModuleName.Canonical _ home) name args ->
196+ apply context
197+ (H.nameToDoc home <> "." <> H.nameToDoc name)
198+ (map (canToDoc App) args)
199+
200+ Can.TRecord fields ext ->
201+ record
202+ (map entryToDocs (Map.toList fields))
203+ (fmap H.nameToDoc ext)
204+
205+ Can.TUnit ->
206+ "()"
207+
208+ Can.TTuple a b maybeC ->
209+ tuple
210+ (canToDoc None a)
211+ (canToDoc None b)
212+ (map (canToDoc None) (Maybe.maybeToList maybeC))
213+
214+ Can.TAlias (ModuleName.Canonical _ home) name args _ ->
215+ apply context
216+ (H.nameToDoc home <> "." <> H.nameToDoc name)
217+ (map (canToDoc App . snd) args)
218+
219+
220+entryToDocs :: (N.Name, Can.Type) -> (Doc, Doc)
221+entryToDocs (name, tipe) =
222+ (H.nameToDoc name, canToDoc None tipe)
223+
224+
225+collectArgs :: Can.Type -> (Can.Type, [Can.Type])
226+collectArgs tipe =
227+ case tipe of
228+ Can.TLambda a rest ->
229+ let
230+ (b, cs) = collectArgs rest
231+ in
232+ (a, b:cs)
233+
234+ _ ->
235+ (tipe, [])