@@ -57,23 +57,24 @@ type Parsing m = (P.MonadParsec Void String m, MonadWriter FC m)
5757runparser :: Parser st res -> st -> String -> String -> Either ParseError res
5858runparser p i inputname s =
5959 case P.parse (runWriterT (evalStateT p i)) inputname s of
60− Left err -> Left $ ParseError s err
60+ Left err -> Left $ ParseError err
6161 Right v -> Right $ fst v
6262
6363{- * Parse errors -}
6464
65−data ParseError = ParseError String (P.ParseError (P.Token String) Void)
65+newtype ParseError = ParseError (P.ParseErrorBundle String Void)
6666
6767instance Message ParseError where
68− messageExtent (ParseError _ err) = sourcePositionFC pos
68+ messageExtent (ParseError err) = sourcePositionFC pos
6969 where
70− (pos NonEmpty.:| _) = P.errorPos err
71− messageText (ParseError _ err) = PP.text . init . P.parseErrorTextPretty $ err
72− messageSource (ParseError src _) = Just src
70+ (pos, _) = P.reachOffsetNoLine (P.errorOffset err') (P.bundlePosState err)
71+ err' = NonEmpty.head . P.bundleErrors $ err
72+ messageText (ParseError err) = PP.text . init . P.errorBundlePretty $ err
73+ messageSource (ParseError err) = Just . P.sourceName . P.pstateSourcePos . P.bundlePosState $ err
7374
7475-- | A fully formatted parse error, with caret and bar, etc.
7576prettyError :: ParseError -> String
76−prettyError (ParseError s err) = P.parseErrorPretty' s err
77+prettyError (ParseError err) = P.errorBundlePretty err
7778
7879{- * Mark and restore -}
7980