@@ -7,13 +7,18 @@ module Reporting.Error.Main
10+import qualified Data.Map as Map
11+import qualified Data.Maybe as Maybe
12+import Data.Monoid ((<>))
10import qualified AST.Canonical as Can
14import qualified AST.Canonical as Can
15+import qualified AST.Module.Name as ModuleName
11import qualified Elm.Name as N
16import qualified Elm.Name as N
12import qualified Reporting.Error.Canonicalize as E
17import qualified Reporting.Error.Canonicalize as E
13import qualified Reporting.Helpers as H
18import qualified Reporting.Helpers as H
14import qualified Reporting.Region as R
19import qualified Reporting.Region as R
15import qualified Reporting.Render.Code as Code
20import qualified Reporting.Render.Code as Code
16−import qualified Reporting.Render.Type as RenderType
21+import qualified Reporting.Render.Type as RT
17import qualified Reporting.Report as Report
22import qualified Reporting.Report as Report
@@ -31,8 +36,8 @@ data Error
31-- TO REPORT
36-- TO REPORT
34−toReport :: Code.Source -> RenderType.Localizer -> Error -> Report.Report
39+toReport :: Code.Source -> Error -> Report.Report
35−toReport source localizer err =
40+toReport source err =
36 case err of
41 case err of
37 BadType region tipe ->
42 BadType region tipe ->
38 Report.Report "BAD MAIN TYPE" region [] $
43 Report.Report "BAD MAIN TYPE" region [] $
@@ -42,7 +47,7 @@ toReport source localizer err =
44 [ "The type of `main` value I am seeing is:"
49 [ "The type of `main` value I am seeing is:"
45− , H.indent 4 (RenderType.toDoc localizer tipe)
50+ , H.indent 4 $ H.dullyellow $ typeToDoc RT.None tipe
46 , H.reflow $
51 , H.reflow $
47 "I only know how to handle Html, Svg, and Programs\
52 "I only know how to handle Html, Svg, and Programs\
48 \ though. Modify `main` to be one of those types of values!"
53 \ though. Modify `main` to be one of those types of values!"
@@ -120,3 +125,65 @@ toReport source localizer err =
120 \ everything with encoders and decoders for more control and better errors."
125 \ everything with encoders and decoders for more control and better errors."
134+typeToDoc :: RT.Context -> Can.Type -> H.Doc
135+typeToDoc context tipe =
137+ Can.TLambda arg1 result ->
139+ (arg2, rest) = collectArgs result
142+ (typeToDoc RT.Func arg1)
143+ (typeToDoc RT.Func arg2)
144+ (map (typeToDoc RT.Func) rest)
149+ Can.TType (ModuleName.Canonical _ home) name args ->
151+ (H.nameToDoc home <> "." <> H.nameToDoc name)
152+ (map (typeToDoc RT.App) args)
154+ Can.TRecord fields ext ->
156+ (map entryToDocs (Map.toList fields))
157+ (fmap H.nameToDoc ext)
162+ Can.TTuple a b maybeC ->
164+ (typeToDoc RT.None a)
165+ (typeToDoc RT.None b)
166+ (map (typeToDoc RT.None) (Maybe.maybeToList maybeC))
168+ Can.TAlias (ModuleName.Canonical _ home) name args _ ->
170+ (H.nameToDoc home <> "." <> H.nameToDoc name)
171+ (map (typeToDoc RT.App . snd) args)
174+entryToDocs :: (N.Name, Can.Type) -> (H.Doc, H.Doc)
175+entryToDocs (name, tipe) =
176+ (H.nameToDoc name, typeToDoc RT.None tipe)
179+collectArgs :: Can.Type -> (Can.Type, [Can.Type])
182+ Can.TLambda a rest ->
184+ (b, cs) = collectArgs rest