From e0337c18e49e4d04d3e09d3c2125b9ac697acf1a Mon Sep 17 00:00:00 2001 From: Paul Cadman Date: Wed, 8 Feb 2023 16:23:11 +0000 Subject: [PATCH] Add internal core-eval option to evaluate named function identifier (#1819) --- app/Commands/Dev/Internal/CoreEval.hs | 19 ++++++++- app/Commands/Dev/Internal/CoreEval/Options.hs | 11 ++++- tests/positive/Internal/LiteralInt.juvix | 3 ++ tests/smoke/Commands/dev/internal.smoke.yaml | 40 +++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/app/Commands/Dev/Internal/CoreEval.hs b/app/Commands/Dev/Internal/CoreEval.hs index 42142f4287..48e49f81eb 100644 --- a/app/Commands/Dev/Internal/CoreEval.hs +++ b/app/Commands/Dev/Internal/CoreEval.hs @@ -2,14 +2,31 @@ module Commands.Dev.Internal.CoreEval where import Commands.Base import Commands.Dev.Internal.CoreEval.Options +import Data.HashMap.Internal.Strict (elems) import Data.HashMap.Strict qualified as HashMap import Evaluator import Juvix.Compiler.Core.Data.InfoTable +import Juvix.Compiler.Core.Language.Base import Juvix.Compiler.Core.Transformation qualified as Core import Juvix.Compiler.Core.Translation +import Safe (headMay) + +getSymbol :: forall r. Member App r => InfoTable -> Text -> Sem r Symbol +getSymbol tab name = maybe failAction (return . (^. identifierSymbol)) mIdent + where + identifiers :: [IdentifierInfo] + identifiers = elems (tab ^. infoIdentifiers) + + mIdent :: Maybe IdentifierInfo + mIdent = headMay (filter ((== name) . (^. identifierName)) identifiers) + + failAction :: Sem r a + failAction = exitMsg (ExitFailure 1) (name <> " is not a function identifier") runCommand :: (Members '[Embed IO, App] r) => InternalCoreEvalOptions -> Sem r () runCommand localOpts = do tab <- (^. coreResultTable) <$> runPipeline (localOpts ^. internalCoreEvalInputFile) upToCore let tab' = Core.applyTransformations (project localOpts ^. internalCoreEvalTransformations) tab - forM_ ((tab' ^. infoMain) >>= ((tab' ^. identContext) HashMap.!?)) (evalAndPrint localOpts tab') + ms <- mapM (getSymbol tab') (localOpts ^. internalCoreEvalSymbolName) + let symbol = ms <|> (tab' ^. infoMain) + forM_ (symbol >>= ((tab' ^. identContext) HashMap.!?)) (evalAndPrint localOpts tab') diff --git a/app/Commands/Dev/Internal/CoreEval/Options.hs b/app/Commands/Dev/Internal/CoreEval/Options.hs index 703dae91a9..4d958b86fa 100644 --- a/app/Commands/Dev/Internal/CoreEval/Options.hs +++ b/app/Commands/Dev/Internal/CoreEval/Options.hs @@ -9,7 +9,8 @@ data InternalCoreEvalOptions = InternalCoreEvalOptions { _internalCoreEvalTransformations :: [TransformationId], _internalCoreEvalShowDeBruijn :: Bool, _internalCoreEvalNoIO :: Bool, - _internalCoreEvalInputFile :: AppPath File + _internalCoreEvalInputFile :: AppPath File, + _internalCoreEvalSymbolName :: Maybe Text } deriving stock (Data) @@ -42,4 +43,12 @@ parseInternalCoreEval = do <> help "Don't interpret the IO effects" ) _internalCoreEvalInputFile <- parseInputJuvixFile + _internalCoreEvalSymbolName <- + optional $ + strOption + ( long "symbol-name" + <> short 's' + <> help "Evaluate a function identifier (default: main)" + <> metavar "NAME" + ) pure InternalCoreEvalOptions {..} diff --git a/tests/positive/Internal/LiteralInt.juvix b/tests/positive/Internal/LiteralInt.juvix index 5ed33219f2..ac9781c51c 100644 --- a/tests/positive/Internal/LiteralInt.juvix +++ b/tests/positive/Internal/LiteralInt.juvix @@ -5,4 +5,7 @@ module LiteralInt; f : Nat; f := 1; + + main : IO; + main := printNatLn 2; end; diff --git a/tests/smoke/Commands/dev/internal.smoke.yaml b/tests/smoke/Commands/dev/internal.smoke.yaml index 848888d1f6..15ded63972 100644 --- a/tests/smoke/Commands/dev/internal.smoke.yaml +++ b/tests/smoke/Commands/dev/internal.smoke.yaml @@ -50,3 +50,43 @@ tests: matches: |- (.+)\/([^\/]+)\.juvix\:[0-9]*\:[0-9]*\-[0-9]*\: error exit-status: 1 + + - name: internal-core-eval + command: + - juvix + - dev + - internal + - core-eval + args: + - positive/Internal/LiteralInt.juvix + stdout: | + suc (suc zero) + exit-status: 0 + + - name: internal-core-eval-transform + command: + - juvix + - dev + - internal + - core-eval + - --transforms + - nat-to-int + args: + - positive/Internal/LiteralInt.juvix + stdout: | + 2 + exit-status: 0 + + - name: internal-core-eval-symbol-name + command: + - juvix + - dev + - internal + - core-eval + - --symbol-name + - f + args: + - positive/Internal/LiteralInt.juvix + stdout: | + suc zero + exit-status: 0