@@ -7,32 +7,34 @@ module PlutusCore.Parser.Builtin where
77import Data.Text qualified as T
88import Data.Text.Internal.Read (hexDigitToInt )
99import PlutusPrelude (Word8 )
10- import Text.Megaparsec (MonadParsec (takeWhileP ), choice , many , manyTill )
10+ import Text.Megaparsec (MonadParsec (takeWhileP ), choice , customFailure , getSourcePos , many , manyTill )
1111import Text.Megaparsec.Char (char , hexDigitChar )
1212import Text.Megaparsec.Char.Lexer qualified as Lex hiding (hexadecimal )
1313
1414import Data.ByteString (pack )
1515import Data.Map (Map , empty , insert , lookup )
1616import PlutusCore.Default
17+ import PlutusCore.Error
1718import PlutusCore.Parser.ParserCommon (Parser , isIdentifierChar , lexeme , symbol , whitespace )
1819import PlutusCore.Parser.Type (defaultUniType )
1920import PlutusCore.Pretty (display )
2021import 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-
2723cachedBuiltin :: 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`.
3131builtinFunction :: Parser DefaultFun
3232builtinFunction = 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
3840signedInteger :: Parser Integer
0 commit comments