@@ -7,12 +7,22 @@ module Reporting.Render.Type
9 , recordSnippet
9 , recordSnippet
16+import qualified Data.Map as Map
17+import qualified Data.Maybe as Maybe
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
14import qualified Reporting.Helpers as H
24import qualified Reporting.Helpers as H
15−import Reporting.Helpers ( Doc, (<+>) )
25+import Reporting.Helpers ( Doc, (<+>), (<>) )
@@ -97,3 +107,129 @@ recordSnippet entry entries =
97 fields = zipWith (<+>) (repeat ",") (map entryToDoc entries ++ ["..."])
107 fields = zipWith (<+>) (repeat ",") (map entryToDoc entries ++ ["..."])
99 H.sep [ H.cat (field:fields), "}" ]
109 H.sep [ H.cat (field:fields), "}" ]
113+-- SOURCE TYPE TO DOC
116+srcToDoc :: Context -> Src.Type -> Doc
117+srcToDoc context (A.At _ tipe) =
119+ Src.TLambda arg1 result ->
121+ (arg2, rest) = collectSrcArgs result
124+ (srcToDoc Func arg1)
125+ (srcToDoc Func arg2)
126+ (map (srcToDoc Func) rest)
131+ Src.TType _ name args ->
134+ (map (srcToDoc App) args)
136+ Src.TTypeQual _ home name args ->
138+ (H.nameToDoc home <> "." <> H.nameToDoc name)
139+ (map (srcToDoc App) args)
141+ Src.TRecord fields ext ->
143+ (map fieldToDocs fields)
144+ (fmap (H.nameToDoc . A.toValue) ext)
149+ Src.TTuple a b cs ->
153+ (map (srcToDoc None) cs)
156+fieldToDocs :: (A.Located N.Name, Src.Type) -> (Doc, Doc)
157+fieldToDocs (A.At _ fieldName, fieldType) =
158+ ( H.nameToDoc fieldName
159+ , srcToDoc None fieldType
163+collectSrcArgs :: Src.Type -> (Src.Type, [Src.Type])
164+collectSrcArgs tipe =
166+ A.At _ (Src.TLambda a result) ->
168+ (b, cs) = collectSrcArgs result
177+-- CANONICAL TYPE TO DOC
180+canToDoc :: Context -> Can.Type -> Doc
181+canToDoc context tipe =
183+ Can.TLambda arg1 result ->
185+ (arg2, rest) = collectArgs result
188+ (canToDoc Func arg1)
189+ (canToDoc Func arg2)
190+ (map (canToDoc Func) rest)
195+ Can.TType (ModuleName.Canonical _ home) name args ->
197+ (H.nameToDoc home <> "." <> H.nameToDoc name)
198+ (map (canToDoc App) args)
200+ Can.TRecord fields ext ->
202+ (map entryToDocs (Map.toList fields))
203+ (fmap H.nameToDoc ext)
208+ Can.TTuple a b maybeC ->
212+ (map (canToDoc None) (Maybe.maybeToList maybeC))
214+ Can.TAlias (ModuleName.Canonical _ home) name args _ ->
216+ (H.nameToDoc home <> "." <> H.nameToDoc name)
217+ (map (canToDoc App . snd) args)
220+entryToDocs :: (N.Name, Can.Type) -> (Doc, Doc)
221+entryToDocs (name, tipe) =
222+ (H.nameToDoc name, canToDoc None tipe)
225+collectArgs :: Can.Type -> (Can.Type, [Can.Type])
228+ Can.TLambda a rest ->
230+ (b, cs) = collectArgs rest