1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Reporting.Render.Type
16import qualified Data.Map as Map
17import qualified Data.Maybe as Maybe
19import qualified AST.Source as Src
20import qualified AST.Canonical as Can
21import qualified AST.Module.Name as ModuleName
22import qualified Elm.Name as N
23import qualified Reporting.Annotation as A
24import qualified Reporting.Helpers as H
25import Reporting.Helpers ( Doc, (<+>), (<>) )
38lambda :: Context -> Doc -> Doc -> [Doc] -> Doc
39lambda context arg1 arg2 args =
42 H.sep (arg1 : map ("->" <+>) (arg2:args))
46 Func -> H.cat [ "(", lambdaDoc, ")" ]
47 App -> H.cat [ "(", lambdaDoc, ")" ]
50apply :: Context -> Doc -> [Doc] -> Doc
51apply context name args =
59 H.hang 4 (H.sep (name : args))
62 App -> H.cat [ "(", applyDoc, ")" ]
67tuple :: Doc -> Doc -> [Doc] -> Doc
71 zipWith (<+>) ("(" : repeat ",") (a:b:cs)
73 H.sep [ H.cat entries, ")" ]
76record :: [(Doc, Doc)] -> Maybe Doc -> Doc
77record entries maybeExt =
78 case (map entryToDoc entries, maybeExt) of
84 [ H.cat (zipWith (<+>) ("{" : repeat ",") fields)
92 , H.cat (zipWith (<+>) ("|" : repeat ",") fields)
98entryToDoc :: (Doc, Doc) -> Doc
99entryToDoc (fieldName, fieldType) =
100 H.hang 4 (H.sep [ fieldName <+> ":", fieldType ])
103recordSnippet :: (Doc, Doc) -> [(Doc, Doc)] -> Doc
104recordSnippet entry entries =
106 field = "{" <+> entryToDoc entry
107 fields = zipWith (<+>) (repeat ",") (map entryToDoc entries ++ ["..."])
109 H.sep [ H.cat (field:fields), "}" ]
116srcToDoc :: Context -> Src.Type -> Doc
117srcToDoc context (A.At _ tipe) =
119 Src.TLambda arg1 result ->
121 (arg2, rest) = collectSrcArgs result
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)
153 (map (srcToDoc None) cs)
156fieldToDocs :: (A.Located N.Name, Src.Type) -> (Doc, Doc)
157fieldToDocs (A.At _ fieldName, fieldType) =
158 ( H.nameToDoc fieldName
159 , srcToDoc None fieldType
163collectSrcArgs :: Src.Type -> (Src.Type, [Src.Type])
166 A.At _ (Src.TLambda a result) ->
168 (b, cs) = collectSrcArgs result
177-- CANONICAL TYPE TO DOC
180canToDoc :: Context -> Can.Type -> Doc
181canToDoc context tipe =
183 Can.TLambda arg1 result ->
185 (arg2, rest) = collectArgs result
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)
220entryToDocs :: (N.Name, Can.Type) -> (Doc, Doc)
221entryToDocs (name, tipe) =
222 (H.nameToDoc name, canToDoc None tipe)
225collectArgs :: Can.Type -> (Can.Type, [Can.Type])
228 Can.TLambda a rest ->
230 (b, cs) = collectArgs rest
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list