module Development.IDE.Types.Diagnostics (
LSP.Diagnostic(..),
FileDiagnostic,
LSP.DiagnosticSeverity(..),
DiagnosticStore,
List(..),
ideErrorText,
showDiagnostics,
showDiagnosticsColored,
) where
import Data.Maybe as Maybe
import qualified Data.Text as T
import Data.Text.Prettyprint.Doc
import qualified Language.Haskell.LSP.Types as LSP
import Language.Haskell.LSP.Types as LSP (
DiagnosticSeverity(..)
, Diagnostic(..)
, List(..)
)
import Language.Haskell.LSP.Diagnostics
import Data.Text.Prettyprint.Doc.Render.Text
import qualified Data.Text.Prettyprint.Doc.Render.Terminal as Terminal
import Data.Text.Prettyprint.Doc.Render.Terminal (Color(..), color)
import Development.IDE.Types.Location
ideErrorText :: NormalizedFilePath -> T.Text -> FileDiagnostic
ideErrorText fp msg = (fp, LSP.Diagnostic {
_range = noRange,
_severity = Just LSP.DsError,
_code = Nothing,
_source = Just "compiler",
_message = msg,
_relatedInformation = Nothing
})
type FileDiagnostic = (NormalizedFilePath, Diagnostic)
prettyRange :: Range -> Doc Terminal.AnsiStyle
prettyRange Range{..} = f _start <> "-" <> f _end
where f Position{..} = pretty (_line+1) <> colon <> pretty _character
stringParagraphs :: T.Text -> Doc a
stringParagraphs = vcat . map (fillSep . map pretty . T.words) . T.lines
showDiagnostics :: [FileDiagnostic] -> T.Text
showDiagnostics = srenderPlain . prettyDiagnostics
showDiagnosticsColored :: [FileDiagnostic] -> T.Text
showDiagnosticsColored = srenderColored . prettyDiagnostics
prettyDiagnostics :: [FileDiagnostic] -> Doc Terminal.AnsiStyle
prettyDiagnostics = vcat . map prettyDiagnostic
prettyDiagnostic :: FileDiagnostic -> Doc Terminal.AnsiStyle
prettyDiagnostic (fp, LSP.Diagnostic{..}) =
vcat
[ slabel_ "File: " $ pretty (fromNormalizedFilePath fp)
, slabel_ "Range: " $ prettyRange _range
, slabel_ "Source: " $ pretty _source
, slabel_ "Severity:" $ pretty $ show sev
, slabel_ "Message: "
$ case sev of
LSP.DsError -> annotate $ color Red
LSP.DsWarning -> annotate $ color Yellow
LSP.DsInfo -> annotate $ color Blue
LSP.DsHint -> annotate $ color Magenta
$ stringParagraphs _message
]
where
sev = fromMaybe LSP.DsError _severity
slabel_ :: String -> Doc a -> Doc a
slabel_ t d = nest 2 $ sep [pretty t, d]
cliLayout ::
Int
-> LayoutOptions
cliLayout renderWidth = LayoutOptions
{ layoutPageWidth = AvailablePerLine renderWidth 0.9
}
srenderPlain :: Doc ann -> T.Text
srenderPlain = renderStrict . layoutSmart (cliLayout defaultTermWidth)
srenderColored :: Doc Terminal.AnsiStyle -> T.Text
srenderColored =
Terminal.renderStrict .
layoutSmart defaultLayoutOptions { layoutPageWidth = AvailablePerLine 100 1.0 }
defaultTermWidth :: Int
defaultTermWidth = 80