|
/- |
|
Copyright (c) 2023 Scott Morrison. All rights reserved. |
|
Released under Apache 2.0 license as described in the file LICENSE. |
|
Authors: Scott Morrison |
|
-/ |
|
import Lean.Elab.Frontend |
|
|
|
open Lean Elab |
|
|
|
namespace Lean.Elab.IO |
|
|
|
/ |
|
Wrapper for `IO.processCommands` that enables info states, and returns |
|
* the new command state |
|
* messages |
|
* info trees |
|
-/ |
|
def processCommandsWithInfoTrees |
|
(inputCtx : Parser.InputContext) (parserState : Parser.ModuleParserState) |
|
(commandState : Command.State) : IO (Command.State Γ List Message Γ List InfoTree) := do |
|
let commandState := { commandState with infoState.enabled := true } |
|
let s β IO.processCommands inputCtx parserState commandState <&> Frontend.State.commandState |
|
pure (s, s.messages.msgs.toList, s.infoState.trees.toList) |
|
|
|
/ |
|
Process some text input, with or without an existing command state. |
|
If there is no existing environment, we parse the input for headers (e.g. import statements), |
|
and create a new environment. |
|
Otherwise, we add to the existing environment. |
|
|
|
Returns the resulting command state, along with a list of messages and info trees. |
|
-/ |
|
def processInput (input : String) (cmdState? : Option Command.State) |
|
(opts : Options := {}) (fileName : Option String := none) : |
|
IO (Command.State Γ List Message Γ List InfoTree) := unsafe do |
|
Lean.initSearchPath (β Lean.findSysroot) |
|
enableInitializersExecution |
|
let fileName := fileName.getD "<input>" |
|
let inputCtx := Parser.mkInputContext input fileName |
|
let (parserState, commandState) β match cmdState? with |
|
| none => do |
|
let (header, parserState, messages) β Parser.parseHeader inputCtx |
|
let (env, messages) β processHeader header opts messages inputCtx |
|
pure (parserState, (Command.mkState env messages opts)) |
|
| some cmdState => do |
|
pure ({ : Parser.ModuleParserState }, cmdState) |
|
processCommandsWithInfoTrees inputCtx parserState commandState |
|
|