@@ -249,7 +249,7 @@ where
249
249
mkBodyTask (body : Syntax) (new : IO.Promise (Option BodyProcessedSnapshot)) :
250
250
Language.SnapshotTask (Option BodyProcessedSnapshot) :=
251
251
let rangeStx := getBodyTerm? body |>.getD body
252
- { range? := rangeStx.getRange?, task := new.result }
252
+ { range? := rangeStx.getRange?, task := new.resultD default }
253
253
254
254
/--
255
255
If `body` allows for incremental tactic reporting and reuse, creates a snapshot task out of the
@@ -261,7 +261,7 @@ where
261
261
:= do
262
262
if let some e := getBodyTerm? body then
263
263
if let `(by $tacs*) := e then
264
- return (e, some { range? := mkNullNode tacs |>.getRange?, task := tacPromise.result })
264
+ return (e, some { range? := mkNullNode tacs |>.getRange?, task := tacPromise.resultD default })
265
265
tacPromise.resolve default
266
266
return (none, none)
267
267
@@ -1005,45 +1005,45 @@ def elabMutualDef (vars : Array Expr) (sc : Command.Scope) (views : Array DefVie
1005
1005
else
1006
1006
go
1007
1007
where
1008
- go :=
1009
- withAlwaysResolvedPromises views.size fun bodyPromises =>
1010
- withAlwaysResolvedPromises views.size fun tacPromises => do
1011
- let scopeLevelNames ← getLevelNames
1012
- let headers ← elabHeaders views bodyPromises tacPromises
1013
- let headers ← levelMVarToParamHeaders views headers
1014
- let allUserLevelNames := getAllUserLevelNames headers
1015
- withFunLocalDecls headers fun funFVars => do
1016
- for view in views, funFVar in funFVars do
1017
- addLocalVarInfo view.declId funFVar
1018
- let values ←
1019
- try
1020
- let values ← elabFunValues headers vars sc
1021
- Term.synthesizeSyntheticMVarsNoPostponing
1022
- values.mapM (instantiateMVarsProfiling ·)
1023
- catch ex =>
1024
- logException ex
1025
- headers.mapM fun header => withRef header.declId <| mkLabeledSorry header.type (synthetic := true ) (unique := true )
1026
- let headers ← headers.mapM instantiateMVarsAtHeader
1027
- let letRecsToLift ← getLetRecsToLift
1028
- let letRecsToLift ← letRecsToLift.mapM instantiateMVarsAtLetRecToLift
1029
- checkLetRecsToLiftTypes funFVars letRecsToLift
1030
- (if headers.all (·.kind.isTheorem) && !deprecated.oldSectionVars.get (← getOptions) then withHeaderSecVars vars sc headers else withUsed vars headers values letRecsToLift) fun vars => do
1031
- let preDefs ← MutualClosure.main vars headers funFVars values letRecsToLift
1032
- checkAllDeclNamesDistinct preDefs
1033
- for preDef in preDefs do
1034
- trace[Elab.definition] "{preDef.declName} : {preDef.type} :=\n {preDef.value}"
1035
- let preDefs ← withLevelNames allUserLevelNames <| levelMVarToParamTypesPreDecls preDefs
1036
- let preDefs ← instantiateMVarsAtPreDecls preDefs
1037
- let preDefs ← shareCommonPreDefs preDefs
1038
- let preDefs ← fixLevelParams preDefs scopeLevelNames allUserLevelNames
1039
- for preDef in preDefs do
1040
- trace[Elab.definition] "after eraseAuxDiscr, {preDef.declName} : {preDef.type} :=\n {preDef.value}"
1041
- addPreDefinitions preDefs
1042
- processDeriving headers
1043
- for view in views, header in headers do
1044
- -- NOTE: this should be the full `ref`, and thus needs to be done after any snapshotting
1045
- -- that depends only on a part of the ref
1046
- addDeclarationRangesForBuiltin header.declName view.modifiers.stx view.ref
1008
+ go := do
1009
+ let bodyPromises ← views.mapM fun _ => IO.Promise.new
1010
+ let tacPromises ← views.mapM fun _ => IO.Promise.new
1011
+ let scopeLevelNames ← getLevelNames
1012
+ let headers ← elabHeaders views bodyPromises tacPromises
1013
+ let headers ← levelMVarToParamHeaders views headers
1014
+ let allUserLevelNames := getAllUserLevelNames headers
1015
+ withFunLocalDecls headers fun funFVars => do
1016
+ for view in views, funFVar in funFVars do
1017
+ addLocalVarInfo view.declId funFVar
1018
+ let values ←
1019
+ try
1020
+ let values ← elabFunValues headers vars sc
1021
+ Term.synthesizeSyntheticMVarsNoPostponing
1022
+ values.mapM (instantiateMVarsProfiling ·)
1023
+ catch ex =>
1024
+ logException ex
1025
+ headers.mapM fun header => withRef header.declId <| mkLabeledSorry header.type (synthetic := true ) (unique := true )
1026
+ let headers ← headers.mapM instantiateMVarsAtHeader
1027
+ let letRecsToLift ← getLetRecsToLift
1028
+ let letRecsToLift ← letRecsToLift.mapM instantiateMVarsAtLetRecToLift
1029
+ checkLetRecsToLiftTypes funFVars letRecsToLift
1030
+ (if headers.all (·.kind.isTheorem) && !deprecated.oldSectionVars.get (← getOptions) then withHeaderSecVars vars sc headers else withUsed vars headers values letRecsToLift) fun vars => do
1031
+ let preDefs ← MutualClosure.main vars headers funFVars values letRecsToLift
1032
+ checkAllDeclNamesDistinct preDefs
1033
+ for preDef in preDefs do
1034
+ trace[Elab.definition] "{preDef.declName} : {preDef.type} :=\n {preDef.value}"
1035
+ let preDefs ← withLevelNames allUserLevelNames <| levelMVarToParamTypesPreDecls preDefs
1036
+ let preDefs ← instantiateMVarsAtPreDecls preDefs
1037
+ let preDefs ← shareCommonPreDefs preDefs
1038
+ let preDefs ← fixLevelParams preDefs scopeLevelNames allUserLevelNames
1039
+ for preDef in preDefs do
1040
+ trace[Elab.definition] "after eraseAuxDiscr, {preDef.declName} : {preDef.type} :=\n {preDef.value}"
1041
+ addPreDefinitions preDefs
1042
+ processDeriving headers
1043
+ for view in views, header in headers do
1044
+ -- NOTE: this should be the full `ref`, and thus needs to be done after any snapshotting
1045
+ -- that depends only on a part of the ref
1046
+ addDeclarationRangesForBuiltin header.declName view.modifiers.stx view.ref
1047
1047
1048
1048
1049
1049
processDeriving (headers : Array DefViewElabHeader) := do
@@ -1060,46 +1060,46 @@ namespace Command
1060
1060
1061
1061
def elabMutualDef (ds : Array Syntax) : CommandElabM Unit := do
1062
1062
let opts ← getOptions
1063
- withAlwaysResolvedPromises ds.size fun headerPromises => do
1064
- let snap? := (← read).snap?
1065
- let mut views := #[]
1066
- let mut defs := #[]
1067
- let mut reusedAllHeaders := true
1068
- for h : i in [0 :ds.size], headerPromise in headerPromises do
1069
- let d := ds[i]
1070
- let modifiers ← elabModifiers ⟨d[0 ]⟩
1071
- if ds.size > 1 && modifiers.isNonrec then
1072
- throwErrorAt d "invalid use of 'nonrec' modifier in 'mutual' block"
1073
- let mut view ← mkDefView modifiers d[1 ]
1074
- let fullHeaderRef := mkNullNode #[d[0 ], view.headerRef]
1075
- if let some snap := snap? then
1076
- view := { view with headerSnap? := some {
1077
- old? := do
1078
- -- transitioning from `Context.snap?` to `DefView.headerSnap?` invariant: if the
1079
- -- elaboration context and state are unchanged, and the syntax of this as well as all
1080
- -- previous headers is unchanged, then the elaboration result for this header (which
1081
- -- includes state from elaboration of previous headers!) should be unchanged.
1082
- guard reusedAllHeaders
1083
- let old ← snap.old?
1084
- -- blocking wait, `HeadersParsedSnapshot` (and hopefully others) should be quick
1085
- let old ← old.val.get.toTyped? DefsParsedSnapshot
1086
- let oldParsed ← old.defs[i]?
1087
- guard <| fullHeaderRef.eqWithInfoAndTraceReuse opts oldParsed.fullHeaderRef
1088
- -- no syntax guard to store, we already did the necessary checks
1089
- return ⟨.missing, oldParsed.headerProcessedSnap⟩
1090
- new := headerPromise
1091
- } }
1092
- defs := defs.push {
1093
- fullHeaderRef
1094
- headerProcessedSnap := { range? := d.getRange?, task := headerPromise.result }
1095
- }
1096
- reusedAllHeaders := reusedAllHeaders && view.headerSnap?.any (·.old?.isSome)
1097
- views := views.push view
1063
+ let headerPromises ← ds.mapM fun _ => IO.Promise.new
1064
+ let snap? := (← read).snap?
1065
+ let mut views := #[]
1066
+ let mut defs := #[]
1067
+ let mut reusedAllHeaders := true
1068
+ for h : i in [0 :ds.size], headerPromise in headerPromises do
1069
+ let d := ds[i]
1070
+ let modifiers ← elabModifiers ⟨d[0 ]⟩
1071
+ if ds.size > 1 && modifiers.isNonrec then
1072
+ throwErrorAt d "invalid use of 'nonrec' modifier in 'mutual' block"
1073
+ let mut view ← mkDefView modifiers d[1 ]
1074
+ let fullHeaderRef := mkNullNode #[d[0 ], view.headerRef]
1098
1075
if let some snap := snap? then
1099
- -- no non-fatal diagnostics at this point
1100
- snap.new.resolve <| .ofTyped { defs, diagnostics := .empty : DefsParsedSnapshot }
1101
- let sc ← getScope
1102
- runTermElabM fun vars => Term.elabMutualDef vars sc views
1076
+ view := { view with headerSnap? := some {
1077
+ old? := do
1078
+ -- transitioning from `Context.snap?` to `DefView.headerSnap?` invariant: if the
1079
+ -- elaboration context and state are unchanged, and the syntax of this as well as all
1080
+ -- previous headers is unchanged, then the elaboration result for this header (which
1081
+ -- includes state from elaboration of previous headers!) should be unchanged.
1082
+ guard reusedAllHeaders
1083
+ let old ← snap.old?
1084
+ -- blocking wait, `HeadersParsedSnapshot` (and hopefully others) should be quick
1085
+ let old ← old.val.get.toTyped? DefsParsedSnapshot
1086
+ let oldParsed ← old.defs[i]?
1087
+ guard <| fullHeaderRef.eqWithInfoAndTraceReuse opts oldParsed.fullHeaderRef
1088
+ -- no syntax guard to store, we already did the necessary checks
1089
+ return ⟨.missing, oldParsed.headerProcessedSnap⟩
1090
+ new := headerPromise
1091
+ } }
1092
+ defs := defs.push {
1093
+ fullHeaderRef
1094
+ headerProcessedSnap := { range? := d.getRange?, task := headerPromise.resultD default }
1095
+ }
1096
+ reusedAllHeaders := reusedAllHeaders && view.headerSnap?.any (·.old?.isSome)
1097
+ views := views.push view
1098
+ if let some snap := snap? then
1099
+ -- no non-fatal diagnostics at this point
1100
+ snap.new.resolve <| .ofTyped { defs, diagnostics := .empty : DefsParsedSnapshot }
1101
+ let sc ← getScope
1102
+ runTermElabM fun vars => Term.elabMutualDef vars sc views
1103
1103
1104
1104
builtin_initialize
1105
1105
registerTraceClass `Elab.definition.mkClosure
0 commit comments