1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
12import qualified Data.ByteString as B
13import qualified Data.Name as Name
14import qualified Data.NonEmptyList as NE
15import qualified Data.OneOrMore as OneOrMore
16import qualified Data.Utf8 as Utf8
18import qualified Elm.ModuleName as ModuleName
20import qualified Json.Encode as E
21import Json.Encode ((==>))
22import qualified Reporting.Annotation as A
23import qualified Reporting.Doc as D
24import qualified Reporting.Error.Canonicalize as Canonicalize
25import qualified Reporting.Error.Import as Import
26import qualified Reporting.Error.Main as Main
27import qualified Reporting.Error.Pattern as Pattern
28import qualified Reporting.Error.Syntax as Syntax
29import qualified Reporting.Error.Type as Type
30import qualified Reporting.Render.Code as Code
31import qualified Reporting.Render.Type.Localizer as L
32import qualified Reporting.Report as Report
41 { _name :: ModuleName.Raw
44 , _source :: B.ByteString
54 = BadSyntax Syntax.Error
55 | BadImports (NE.List Import.Error)
56 | BadNames (OneOrMore.OneOrMore Canonicalize.Error)
57 | BadTypes L.Localizer (NE.List Type.Error)
58 | BadMains L.Localizer (OneOrMore.OneOrMore Main.Error)
59 | BadPatterns (NE.List Pattern.Error)
66toReports :: Code.Source -> Error -> NE.List Report.Report
69 BadSyntax syntaxError ->
70 NE.List (Syntax.toReport source syntaxError) []
73 fmap (Import.toReport source) errs
76 fmap (Canonicalize.toReport source) (OneOrMore.destruct NE.List errs)
78 BadTypes localizer errs ->
79 fmap (Type.toReport source localizer) errs
81 BadMains localizer errs ->
82 fmap (Main.toReport localizer source) (OneOrMore.destruct NE.List errs)
85 fmap (Pattern.toReport source) errs
92toDoc :: NE.List Module -> D.Doc
95 timeCompare m1 m2 = compare (_time m1) (_time m2)
96 (NE.List m ms) = NE.sortBy timeCompare modules
98 D.vcat (toDocHelp m ms)
101toDocHelp :: Module -> [Module] -> [D.Doc]
102toDocHelp module1 modules =
105 [moduleToDoc module1]
107 module2 : otherModules ->
109 : toSeparator module1 module2
110 : toDocHelp module2 otherModules
113toSeparator :: Module -> Module -> D.Doc
114toSeparator beforeModule afterModule =
116 before = ModuleName.toChars (_name beforeModule) ++ " ↑ "
117 after = " ↓ " ++ ModuleName.toChars (_name afterModule)
120 [ D.indent (80 - length before) (D.fromChars before)
121 , "====o======================================================================o===="
132moduleToDoc :: Module -> D.Doc
133moduleToDoc (Module _ path _ source err) =
136 toReports (Code.toSource source) err
138 D.vcat $ map (reportToDoc path) (NE.toList reports)
141reportToDoc :: FilePath -> Report.Report -> D.Doc
142reportToDoc path (Report.Report title _ _ message) =
144 [ toMessageBar title path
151toMessageBar :: String -> FilePath -> D.Doc
152toMessageBar title filePath =
155 4 + length title + 1 + length filePath
157 D.dullcyan $ D.fromChars $
159 ++ " " ++ replicate (max 1 (80 - usedSpace)) '-'
167toJson :: NE.List Module -> E.Value
169 E.array (map moduleToJson (NE.toList modules))
172moduleToJson :: Module -> E.Value
173moduleToJson (Module name path _ source err) =
176 toReports (Code.toSource source) err
179 [ "path" ==> E.string (Utf8.fromChars path)
180 , "name" ==> E.string (Name.toUtf8 name)
181 , "problems" ==> E.array (map reportToJson (NE.toList reports))
185reportToJson :: Report.Report -> E.Value
186reportToJson (Report.Report title region _sgstns message) =
188 [ "title" ==> E.string (Utf8.fromChars title)
189 , "region" ==> encodeRegion region
190 , "message" ==> D.encode message
194encodeRegion :: A.Region -> E.Value
195encodeRegion (A.Region (A.Position sr sc) (A.Position er ec)) =
199 [ ("line", E.int (fromIntegral sr))
200 , ("column", E.int (fromIntegral sc))
204 [ ("line", E.int (fromIntegral er))
205 , ("column", E.int (fromIntegral ec))
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