diff --git a/src/Init/Lean/Elab/Frontend.lean b/src/Init/Lean/Elab/Frontend.lean
index e02723832a..431bf6544f 100644
--- a/src/Init/Lean/Elab/Frontend.lean
+++ b/src/Init/Lean/Elab/Frontend.lean
@@ -62,6 +62,14 @@ end Frontend
open Frontend
+def process (input : String) (env : Environment) (opts : Options) (fileName : Option String := none) : Environment × MessageLog :=
+let fileName := fileName.getD "";
+let ctx := Parser.mkParserContextCore env input fileName;
+let cmdState := Command.mkState env {} opts;
+match (processCommands ctx).run { commandState := cmdState, parserState := {} } with
+| EStateM.Result.ok _ s => (s.commandState.env, s.commandState.messages)
+| EStateM.Result.error _ s => (s.commandState.env, s.commandState.messages)
+
def testFrontend (input : String) (opts : Options := {}) (fileName : Option String := none) : IO (Environment × MessageLog) :=
do env ← mkEmptyEnvironment;
let fileName := fileName.getD "";
diff --git a/tests/lean/run/frontend1.lean b/tests/lean/run/frontend1.lean
index 1102ce5cec..3e96b5f1b9 100644
--- a/tests/lean/run/frontend1.lean
+++ b/tests/lean/run/frontend1.lean
@@ -3,16 +3,16 @@ open Lean
open Lean.Elab
def run (input : String) : MetaIO Unit :=
-do opts ← MetaIO.getOptions;
- (env, messages) ← liftM $ testFrontend input opts;
+do env ← MetaIO.getEnv;
+ opts ← MetaIO.getOptions;
+ let (env, messages) := process input env opts;
messages.toList.forM $ fun msg => IO.println msg;
pure ()
set_option trace.Elab true
#eval run
-"import Init.Core
- universe u universe v
+"universe u universe v
section namespace foo.bla end bla end foo
variable (p q : Prop)
variable (_ b : _)
@@ -24,4 +24,5 @@ set_option trace.Elab true
#check α
#check Nat.succ
#check Nat.add
+ #check run
end"