1
1
mirror of https://github.com/github/semantic.git synced 2024-12-30 10:27:45 +03:00

Add some combinators for working with SGR codes.

This commit is contained in:
Rob Rix 2017-05-19 16:07:30 -04:00
parent 8ab1c25f30
commit aca843ed3f

View File

@ -167,7 +167,7 @@ data ErrorCause symbol
-- | Pretty-print an Error with reference to the source where it occurred. -- | Pretty-print an Error with reference to the source where it occurred.
showError :: Show symbol => Source.Source -> Error symbol -> ShowS showError :: Show symbol => Source.Source -> Error symbol -> ShowS
showError source Error{..} showError source Error{..}
= showSourcePos errorPos . showString ": " . showString (setSGRCode [SetColor Foreground Vivid Red]) . showString "error" . showString (setSGRCode []) . showString ": " . showExpectation . showChar '\n' = showSourcePos errorPos . showString ": " . withSGRCode [SetColor Foreground Vivid Red] "error" . showString ": " . showExpectation . showChar '\n'
. showString context -- actualLines results include line endings, so no newline here . showString context -- actualLines results include line endings, so no newline here
. showString (replicate (succ (Info.column errorPos + lineNumberDigits)) ' ') . showChar '^' . showChar '\n' . showString (replicate (succ (Info.column errorPos + lineNumberDigits)) ' ') . showChar '^' . showChar '\n'
. showString (prettyCallStack callStack) . showChar '\n' . showString (prettyCallStack callStack) . showChar '\n'
@ -179,6 +179,8 @@ showError source Error{..}
context = maybe "\n" (toS . Source.sourceText . sconcat) (nonEmpty [ Source.Source (toS (showLineNumber i)) <> Source.Source ": " <> l | (i, l) <- zip [1..] (Source.actualLines source), inRange (Info.line errorPos - 2, Info.line errorPos) i ]) context = maybe "\n" (toS . Source.sourceText . sconcat) (nonEmpty [ Source.Source (toS (showLineNumber i)) <> Source.Source ": " <> l | (i, l) <- zip [1..] (Source.actualLines source), inRange (Info.line errorPos - 2, Info.line errorPos) i ])
showLineNumber n = let s = show n in replicate (lineNumberDigits - length s) ' ' <> s showLineNumber n = let s = show n in replicate (lineNumberDigits - length s) ' ' <> s
lineNumberDigits = succ (floor (logBase 10 (fromIntegral (Info.line errorPos) :: Double))) lineNumberDigits = succ (floor (logBase 10 (fromIntegral (Info.line errorPos) :: Double)))
showSGRCode = showString . setSGRCode
withSGRCode code string = showSGRCode code . showString string . showSGRCode []
showSymbols :: Show symbol => [symbol] -> ShowS showSymbols :: Show symbol => [symbol] -> ShowS
showSymbols [] = showString "end of input nodes" showSymbols [] = showString "end of input nodes"