Skip to content
This repository was archived by the owner on Oct 25, 2023. It is now read-only.

Commit a7bc6ad

Browse files
committed
refactor: split config elab into its own file
1 parent 3454c01 commit a7bc6ad

File tree

2 files changed

+69
-53
lines changed

2 files changed

+69
-53
lines changed

Diff for: Lake/Load/Elab.lean

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/-
2+
Copyright (c) 2021 Mac Malone. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Mac Malone
5+
-/
6+
import Lean.Elab.Frontend
7+
import Lake.DSL.Extensions
8+
import Lake.Load.Config
9+
import Lake.Util.Log
10+
11+
namespace Lake
12+
open Lean System
13+
14+
deriving instance BEq, Hashable for Import
15+
16+
/- Cache for the imported header environment of Lake configuration files. -/
17+
initialize importEnvCache : IO.Ref (Std.HashMap (List Import) Environment) ← IO.mkRef {}
18+
19+
/-- Like `Lean.Elab.processHeader`, but using `importEnvCache`. -/
20+
def processHeader (header : Syntax) (opts : Options) (trustLevel : UInt32)
21+
(inputCtx : Parser.InputContext) : StateT MessageLog IO Environment := do
22+
try
23+
let imports := Elab.headerToImports header
24+
if let some env := (← importEnvCache.get).find? imports then
25+
return env
26+
let env ← importModules imports opts trustLevel
27+
importEnvCache.modify (·.insert imports env)
28+
return env
29+
catch e =>
30+
let pos := inputCtx.fileMap.toPosition <| header.getPos?.getD 0
31+
modify (·.add { fileName := inputCtx.fileName, data := toString e, pos })
32+
mkEmptyEnvironment
33+
34+
/-- Main module `Name` of a Lake configuration file. -/
35+
def configModuleName : Name := `lakefile
36+
37+
/-- Elaborate `configFile` with the given package directory and options. -/
38+
def elabConfigFile (pkgDir : FilePath) (configOpts : NameMap String)
39+
(configFile := pkgDir / defaultConfigFile) (leanOpts := Options.empty) : LogIO Environment := do
40+
41+
-- Read file and initialize environment
42+
let input ← IO.FS.readFile configFile
43+
let inputCtx := Parser.mkInputContext input configFile.toString
44+
let (header, parserState, messages) ← Parser.parseHeader inputCtx
45+
let (env, messages) ← processHeader header leanOpts 1024 inputCtx messages
46+
let env := env.setMainModule configModuleName
47+
48+
-- Configure extensions
49+
let env := dirExt.setState env pkgDir
50+
let env := optsExt.setState env configOpts
51+
52+
-- Elaborate File
53+
let commandState := Elab.Command.mkState env messages leanOpts
54+
let s ← Elab.IO.processCommands inputCtx parserState commandState
55+
56+
-- Log messages
57+
for msg in s.commandState.messages.toList do
58+
match msg.severity with
59+
| MessageSeverity.information => logInfo (← msg.toString)
60+
| MessageSeverity.warning => logWarning (← msg.toString)
61+
| MessageSeverity.error => logError (← msg.toString)
62+
63+
-- Check result
64+
if s.commandState.messages.hasErrors then
65+
error s!"{configFile}: package configuration has errors"
66+
else
67+
return s.commandState.env

Diff for: Lake/Load/Package.lean

+2-53
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,14 @@ Copyright (c) 2021 Mac Malone. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mac Malone
55
-/
6-
import Lean.Elab.Frontend
76
import Lake.DSL.Attributes
8-
import Lake.DSL.Extensions
97
import Lake.Config.FacetConfig
108
import Lake.Config.TargetConfig
11-
import Lake.Load.Config
9+
import Lake.Load.Elab
1210

1311
namespace Lake
1412
open Lean System
1513

16-
/-- Main module `Name` of a Lake configuration file. -/
17-
def configModuleName : Name := `lakefile
18-
19-
deriving instance BEq, Hashable for Import
20-
21-
/- Cache for the imported header environment of Lake configuration files. -/
22-
initialize importEnvCache : IO.Ref (Std.HashMap (List Import) Environment) ← IO.mkRef {}
23-
24-
/-- Like `Lean.Elab.processHeader`, but using `importEnvCache`. -/
25-
def processHeader (header : Syntax) (opts : Options) (trustLevel : UInt32)
26-
(inputCtx : Parser.InputContext) : StateT MessageLog IO Environment := do
27-
try
28-
let imports := Elab.headerToImports header
29-
if let some env := (← importEnvCache.get).find? imports then
30-
return env
31-
let env ← importModules imports opts trustLevel
32-
importEnvCache.modify (·.insert imports env)
33-
return env
34-
catch e =>
35-
let pos := inputCtx.fileMap.toPosition <| header.getPos?.getD 0
36-
modify (·.add { fileName := inputCtx.fileName, data := toString e, pos })
37-
mkEmptyEnvironment
38-
3914
/-- Like `Lean.Environment.evalConstCheck` but with plain universe-polymorphic `Except`. -/
4015
unsafe def evalConstCheck (env : Environment) (opts : Options) (α) (type : Name) (const : Name) : Except String α :=
4116
match env.find? const with
@@ -144,30 +119,4 @@ the given directory with the given configuration file.
144119
-/
145120
def Package.load (dir : FilePath) (configOpts : NameMap String)
146121
(configFile := dir / defaultConfigFile) (leanOpts := Options.empty) : LogIO Package := do
147-
148-
-- Read file and initialize environment
149-
let input ← IO.FS.readFile configFile
150-
let inputCtx := Parser.mkInputContext input configFile.toString
151-
let (header, parserState, messages) ← Parser.parseHeader inputCtx
152-
let (env, messages) ← processHeader header leanOpts 1024 inputCtx messages
153-
let env := env.setMainModule configModuleName
154-
155-
-- Configure extensions
156-
let env := dirExt.setState env dir
157-
let env := optsExt.setState env configOpts
158-
159-
-- Elaborate File
160-
let commandState := Elab.Command.mkState env messages leanOpts
161-
let s ← Elab.IO.processCommands inputCtx parserState commandState
162-
163-
-- Report errors
164-
for msg in s.commandState.messages.toList do
165-
match msg.severity with
166-
| MessageSeverity.information => logInfo (← msg.toString)
167-
| MessageSeverity.warning => logWarning (← msg.toString)
168-
| MessageSeverity.error => logError (← msg.toString)
169-
if s.commandState.messages.hasErrors then
170-
error s!"package configuration `{configFile}` has errors"
171-
172-
-- Load package from the environment
173-
Package.loadFromEnv s.commandState.env
122+
Package.loadFromEnv (← elabConfigFile dir configOpts configFile leanOpts)

0 commit comments

Comments
 (0)