@@ -700,35 +700,42 @@ private structure ImportFailure where
700700
701701/-- Information generation from imported modules. -/
702702private structure ImportData where
703- cache : IO.Ref (Lean.Meta.Cache)
704703 errors : IO.Ref (Array ImportFailure)
705704
706705private def ImportData.new : BaseIO ImportData := do
707- let cache ← IO.mkRef {}
708706 let errors ← IO.mkRef #[]
709- pure { cache, errors }
707+ pure { errors }
708+
709+ structure Cache where
710+ ngen : NameGenerator
711+ core : Lean.Core.Cache
712+ meta : Lean.Meta.Cache
713+
714+ def Cache.empty (ngen : NameGenerator) : Cache := { ngen := ngen, core := {}, meta := {} }
710715
711716private def addConstImportData
712717 (env : Environment)
713718 (modName : Name)
714719 (d : ImportData)
720+ (cacheRef : IO.Ref Cache)
715721 (tree : PreDiscrTree α)
716722 (act : Name → ConstantInfo → MetaM (Array (InitEntry α)))
717723 (name : Name) (constInfo : ConstantInfo) : BaseIO (PreDiscrTree α) := do
718724 if constInfo.isUnsafe then return tree
719725 if !allowCompletion env name then return tree
720- let mstate : Meta.State := { cache := ←d.cache.get }
721- d.cache.set {}
726+ let { ngen, core := core_cache, meta := meta_cache } ← cacheRef.get
727+ let mstate : Meta.State := { cache := meta_cache }
728+ cacheRef.set (Cache.empty ngen)
722729 let ctx : Meta.Context := { config := { transparency := .reducible } }
723730 let cm := (act name constInfo).run ctx mstate
724731 let cctx : Core.Context := {
725732 fileName := default,
726733 fileMap := default
727734 }
728- let cstate : Core.State := {env}
735+ let cstate : Core.State := {env, cache := core_cache, ngen }
729736 match ←(cm.run cctx cstate).toBaseIO with
730- | .ok ((a, ms), _ ) =>
731- d.cache. set ms.cache
737+ | .ok ((a, ms), cs ) =>
738+ cacheRef. set { ngen := cs.ngen, core := cs.cache, meta := ms.cache }
732739 pure <| a.foldl (fun t e => t.push e.key e.entry) tree
733740 | .error e =>
734741 let i : ImportFailure := {
@@ -771,28 +778,30 @@ private def toFlat (d : ImportData) (tree : PreDiscrTree α) :
771778private partial def loadImportedModule (env : Environment)
772779 (act : Name → ConstantInfo → MetaM (Array (InitEntry α)))
773780 (d : ImportData)
781+ (cacheRef : IO.Ref Cache)
774782 (tree : PreDiscrTree α)
775783 (mname : Name)
776784 (mdata : ModuleData)
777785 (i : Nat := 0 ) : BaseIO (PreDiscrTree α) := do
778786 if h : i < mdata.constNames.size then
779787 let name := mdata.constNames[i]
780788 let constInfo := mdata.constants[i]!
781- let tree ← addConstImportData env mname d tree act name constInfo
782- loadImportedModule env act d tree mname mdata (i+1 )
789+ let tree ← addConstImportData env mname d cacheRef tree act name constInfo
790+ loadImportedModule env act d cacheRef tree mname mdata (i+1 )
783791 else
784792 pure tree
785793
786794private def createImportedEnvironmentSeq (env : Environment)
787795 (act : Name → ConstantInfo → MetaM (Array (InitEntry α)))
788- (start stop : Nat) : BaseIO (InitResults α) :=
789- do go (← ImportData.new) {} start stop
790- where go d (tree : PreDiscrTree α) (start stop : Nat) : BaseIO _ := do
796+ (start stop : Nat) : BaseIO (InitResults α) := do
797+ let cacheRef ← IO.mkRef (Cache.empty {})
798+ go (← ImportData.new) cacheRef {} start stop
799+ where go d cacheRef (tree : PreDiscrTree α) (start stop : Nat) : BaseIO _ := do
791800 if start < stop then
792801 let mname := env.header.moduleNames[start]!
793802 let mdata := env.header.moduleData[start]!
794- let tree ← loadImportedModule env act d tree mname mdata
795- go d tree (start+1 ) stop
803+ let tree ← loadImportedModule env act d cacheRef tree mname mdata
804+ go d cacheRef tree (start+1 ) stop
796805 else
797806 toFlat d tree
798807 termination_by stop - start
0 commit comments