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 :: Module -> [Module] -> D.Doc
95 timeCompare m1 m2 = compare (_time m1) (_time m2)
96 (NE.List m ms) = NE.sortBy timeCompare (NE.List err errs)
98 D.vcat (toDocHelp m ms)
101toDocHelp :: Module -> [Module] -> [D.Doc]
102toDocHelp module1 modules =
109 module2 : otherModules ->
111 : toSeparator module1 module2
112 : toDocHelp module2 otherModules
115toSeparator :: Module -> Module -> D.Doc
116toSeparator beforeModule afterModule =
118 before = ModuleName.toChars (_name beforeModule) ++ " ↑ "
119 after = " ↓ " ++ ModuleName.toChars (_name afterModule)
122 [ D.indent (80 - length before) (D.fromChars before)
123 , "====o======================================================================o===="
134moduleToDoc :: Module -> D.Doc
135moduleToDoc (Module _ path _ source err) =
138 toReports (Code.toSource source) err
140 D.vcat $ map (reportToDoc path) (NE.toList reports)
143reportToDoc :: FilePath -> Report.Report -> D.Doc
144reportToDoc path (Report.Report title _ _ message) =
146 [ toMessageBar title path
153toMessageBar :: String -> FilePath -> D.Doc
154toMessageBar title filePath =
157 4 + length title + 1 + length filePath
159 D.dullcyan $ D.fromChars $
161 ++ " " ++ replicate (max 1 (80 - usedSpace)) '-'
169toJson :: Module -> E.Value
170toJson (Module name path _ source err) =
173 toReports (Code.toSource source) err
176 [ "path" ==> E.string (Utf8.fromChars path)
177 , "name" ==> E.string (Name.toUtf8 name)
178 , "problems" ==> E.array (map reportToJson (NE.toList reports))
182reportToJson :: Report.Report -> E.Value
183reportToJson (Report.Report title region _sgstns message) =
185 [ "title" ==> E.string (Utf8.fromChars title)
186 , "region" ==> encodeRegion region
187 , "message" ==> D.encode message
191encodeRegion :: A.Region -> E.Value
192encodeRegion (A.Region (A.Position sr sc) (A.Position er ec)) =
196 [ ("line", E.int (fromIntegral sr))
197 , ("column", E.int (fromIntegral sc))
201 [ ("line", E.int (fromIntegral er))
202 , ("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