1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Reporting.Render.Code
13import qualified Data.List as List
14import Data.Word (Word16)
16import qualified Reporting.Annotation as A
17import qualified Reporting.Doc as D
18import Reporting.Doc (Doc)
26 Source [(Word16, String)]
29toSource :: String -> Source
39(|>) :: a -> (a -> b) -> b
44render :: Source -> A.Region -> Maybe A.Region -> Doc
45render (Source sourceLines) region@(A.Region (A.Position startLine _) (A.Position endLine _)) maybeSubRegion =
49 |> drop (fromIntegral (startLine - 1))
50 |> take (fromIntegral (1 + endLine - startLine))
53 length (show (fst (last relevantLines)))
56 maybe region id maybeSubRegion
58 case makeUnderline width endLine smallerRegion of
60 drawLines True width smallerRegion relevantLines D.empty
63 drawLines False width smallerRegion relevantLines underline
66makeUnderline :: Int -> Word16 -> A.Region -> Maybe Doc
67makeUnderline width realEndLine (A.Region (A.Position start c1) (A.Position end c2)) =
68 if start /= end || end < realEndLine then
73 spaces = replicate (fromIntegral c1 + width + 1) ' '
74 zigzag = replicate (max 1 (fromIntegral (c2 - c1))) '^'
76 Just (D.fromChars spaces <> D.dullred (D.fromChars zigzag))
79drawLines :: Bool -> Int -> A.Region -> [(Word16, String)] -> Doc -> Doc
80drawLines addZigZag width (A.Region (A.Position startLine _) (A.Position endLine _)) sourceLines finalLine =
82 map (drawLine addZigZag width startLine endLine) sourceLines
86drawLine :: Bool -> Int -> Word16 -> Word16 -> (Word16, String) -> Doc
87drawLine addZigZag width startLine endLine (n, line) =
88 addLineNumber addZigZag width startLine endLine n (D.fromChars line)
91addLineNumber :: Bool -> Int -> Word16 -> Word16 -> Word16 -> Doc -> Doc
92addLineNumber addZigZag width start end n line =
98 replicate (width - length number) ' ' ++ number ++ "|"
101 if addZigZag && start <= n && n <= end then
106 D.fromChars lineNumber <> spacer <> line
118renderPair :: Source -> A.Region -> A.Region -> CodePair
119renderPair source@(Source sourceLines) region1 region2 =
121 (A.Region (A.Position startRow1 startCol1) (A.Position endRow1 endCol1)) = region1
122 (A.Region (A.Position startRow2 startCol2) (A.Position endRow2 endCol2)) = region2
124 if startRow1 == endRow1 && endRow1 == startRow2 && startRow2 == endRow2 then
126 lineNumber = show startRow1
127 spaces1 = replicate (fromIntegral startCol1 + length lineNumber + 1) ' '
128 zigzag1 = replicate (fromIntegral (endCol1 - startCol1)) '^'
129 spaces2 = replicate (fromIntegral (startCol2 - endCol1)) ' '
130 zigzag2 = replicate (fromIntegral (endCol2 - startCol2)) '^'
132 (Just line) = List.lookup startRow1 sourceLines
136 [ D.fromChars lineNumber <> "| " <> D.fromChars line
137 , D.fromChars spaces1 <> D.dullred (D.fromChars zigzag1) <>
138 D.fromChars spaces2 <> D.dullred (D.fromChars zigzag2)
143 (render source region1 Nothing)
144 (render source region2 Nothing)
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