1
1
mirror of https://github.com/github/semantic.git synced 2024-12-22 14:21:31 +03:00

Show the source of the error with a clang-style error message.

This commit is contained in:
Rob Rix 2017-05-01 10:51:12 -04:00
parent 434adf3eca
commit e33da12d1b

View File

@ -22,11 +22,12 @@ import Control.Monad.Free.Freer
import Data.Functor.Classes import Data.Functor.Classes
import Data.Functor.Foldable hiding (Nil) import Data.Functor.Foldable hiding (Nil)
import qualified Data.IntMap.Lazy as IntMap import qualified Data.IntMap.Lazy as IntMap
import Data.List ((!!))
import Data.Record import Data.Record
import qualified Info import qualified Info
import Prologue hiding (Alt, get, Location, state) import Prologue hiding (Alt, get, Location, state)
import Range (offsetRange) import Range (offsetRange)
import qualified Source (Source(..), drop, slice, sourceText) import qualified Source (Source(..), drop, slice, sourceText, actualLines)
import Text.Parser.TreeSitter.Language import Text.Parser.TreeSitter.Language
import Text.Show hiding (show) import Text.Show hiding (show)
@ -90,7 +91,10 @@ data Error symbol = Error
deriving (Eq, Show) deriving (Eq, Show)
showError :: Show symbol => Source.Source -> Error symbol -> ShowS showError :: Show symbol => Source.Source -> Error symbol -> ShowS
showError source Error{..} = showSourcePos errorPos . showString ": error: " . showExpectation showError source Error{..}
= showSourcePos errorPos . showString ": error: " . showExpectation . showChar '\n'
. showString (toS (Source.sourceText (Source.actualLines source !! Info.line errorPos))) -- actualLines results include line endings, so no newline here
. showString (replicate (Info.column errorPos) ' ') . showChar '^' . showChar '\n'
where showExpectation = case (errorExpected, errorActual) of where showExpectation = case (errorExpected, errorActual) of
([], Nothing) -> showString "no rule to match at end of input nodes" ([], Nothing) -> showString "no rule to match at end of input nodes"
(symbols, Nothing) -> showString "expected " . showSymbols symbols . showString " at end of input nodes" (symbols, Nothing) -> showString "expected " . showSymbols symbols . showString " at end of input nodes"