Skip to content

Commit c9a09fd

Browse files
committed
Improve error reporting of builtin fn parser.
1 parent d8129e3 commit c9a09fd

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

plutus-core/plutus-core/src/PlutusCore/Error.hs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ import PlutusCore.Pretty
3838
import Control.Lens hiding (use)
3939
import Control.Monad.Error.Lens
4040
import Control.Monad.Except
41+
import Data.Map (Map)
4142
import Data.Text qualified as T
4243
import ErrorCode
44+
import PlutusCore.Default (DefaultFun)
4345
import Prettyprinter (hardline, indent, squotes, (<+>))
4446
import Text.Megaparsec as M
4547
import Universe (Closed (Everywhere), GEq, GShow)
@@ -54,7 +56,7 @@ throwingEither r e = case e of
5456
data ParserError
5557
= UnknownBuiltinType T.Text SourcePos
5658
| BuiltinTypeNotAStar T.Text SourcePos
57-
| UnknownBuiltinFunction T.Text SourcePos
59+
| UnknownBuiltinFunction T.Text SourcePos (Map T.Text DefaultFun)
5860
| InvalidBuiltinConstant T.Text T.Text SourcePos
5961
deriving stock (Eq, Ord, Generic)
6062
deriving anyclass (NFData)
@@ -117,7 +119,7 @@ instance Pretty SourcePos where
117119
instance Pretty ParserError where
118120
pretty (UnknownBuiltinType s loc) = "Unknown built-in type" <+> squotes (pretty s) <+> "at" <+> pretty loc
119121
pretty (BuiltinTypeNotAStar ty loc) = "Expected a type of kind star (to later parse a constant), but got:" <+> squotes (pretty ty) <+> "at" <+> pretty loc
120-
pretty (UnknownBuiltinFunction s loc) = "Unknown built-in function" <+> squotes (pretty s) <+> "at" <+> pretty loc
122+
pretty (UnknownBuiltinFunction s loc lBuiltin) = "Unknown built-in function" <+> squotes (pretty s) <+> "at" <+> pretty loc <+> ". Parsable functions are " <+> pretty (show lBuiltin)
121123
pretty (InvalidBuiltinConstant c s loc) = "Invalid constant" <+> squotes (pretty c) <+> "of type" <+> squotes (pretty s) <+> "at" <+> pretty loc
122124

123125
instance ShowErrorComponent ParserError where

plutus-core/plutus-core/src/PlutusCore/Parser/Builtin.hs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,34 @@ module PlutusCore.Parser.Builtin where
77
import Data.Text qualified as T
88
import Data.Text.Internal.Read (hexDigitToInt)
99
import PlutusPrelude (Word8)
10-
import Text.Megaparsec (MonadParsec (takeWhileP), choice, many, manyTill)
10+
import Text.Megaparsec (MonadParsec (takeWhileP), choice, customFailure, getSourcePos, many, manyTill)
1111
import Text.Megaparsec.Char (char, hexDigitChar)
1212
import Text.Megaparsec.Char.Lexer qualified as Lex hiding (hexadecimal)
1313

1414
import Data.ByteString (pack)
1515
import Data.Map (Map, empty, insert, lookup)
1616
import PlutusCore.Default
17+
import PlutusCore.Error
1718
import PlutusCore.Parser.ParserCommon (Parser, isIdentifierChar, lexeme, symbol, whitespace)
1819
import PlutusCore.Parser.Type (defaultUniType)
1920
import PlutusCore.Pretty (display)
2021
import Prelude hiding (lookup)
2122

22-
mkCachedBuiltin :: [DefaultFun] -> Map T.Text DefaultFun -> Map T.Text DefaultFun
23-
mkCachedBuiltin (hdFns:tlFns) builtinMap =
24-
mkCachedBuiltin tlFns (insert (display hdFns) hdFns builtinMap)
25-
mkCachedBuiltin [] builtinMap = builtinMap
26-
2723
cachedBuiltin :: Map T.Text DefaultFun
28-
cachedBuiltin = mkCachedBuiltin [minBound .. maxBound] empty
24+
cachedBuiltin
25+
= foldl
26+
(\ currMap fn -> insert (display fn) fn currMap)
27+
empty
28+
[minBound .. maxBound]
2929

3030
-- | Parser for builtin functions. Atm the parser can only parse `DefaultFun`.
3131
builtinFunction :: Parser DefaultFun
3232
builtinFunction = lexeme $ do
33-
txt <- takeWhileP (Just "identifier") isIdentifierChar
33+
txt <- takeWhileP (Just "builtin function identifier") isIdentifierChar
3434
case lookup txt cachedBuiltin of
35-
Nothing -> error $ "Not a builtin" <> show cachedBuiltin <> show txt
35+
Nothing -> do
36+
pos <- getSourcePos
37+
customFailure $ UnknownBuiltinFunction txt pos cachedBuiltin
3638
Just builtin -> pure builtin
3739

3840
signedInteger :: Parser Integer

0 commit comments

Comments
 (0)