@@ -415,6 +415,10 @@ structure PostponedEntry where
415415structure Diagnostics where
416416 /-- Number of times each declaration has been unfolded -/
417417 unfoldCounter : PHashMap Name Nat := {}
418+ /--
419+ Number of times each axiom was tried to be unfolded, which may point to an inaccessible def value.
420+ -/
421+ unfoldAxiomCounter : PHashMap Name Nat := {}
418422 /-- Number of times `f a =?= f b` heuristic has been used per function `f`. -/
419423 heuristicCounter : PHashMap Name Nat := {}
420424 /-- Number of times a TC instance is used. -/
@@ -670,30 +674,39 @@ def mkInfoCacheKey (expr : Expr) (nargs? : Option Nat) : MetaM InfoCacheKey :=
670674
671675/-- If diagnostics are enabled, record that `declName` has been unfolded. -/
672676def recordUnfold (declName : Name) : MetaM Unit := do
673- modifyDiag fun { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
677+ modifyDiag fun { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
674678 let newC := if let some c := unfoldCounter.find? declName then c + 1 else 1
675- { unfoldCounter := unfoldCounter.insert declName newC, heuristicCounter, instanceCounter, synthPendingFailures }
679+ { unfoldCounter := unfoldCounter.insert declName newC, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures }
680+
681+ def recordUnfoldAxiom (declName : Name) : MetaM Unit := do
682+ modifyDiag fun { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
683+ let newC := if let some c := unfoldAxiomCounter.find? declName then c + 1 else 1
684+ { unfoldCounter, unfoldAxiomCounter := unfoldAxiomCounter.insert declName newC, heuristicCounter, instanceCounter, synthPendingFailures }
685+
686+ def resetUnfoldAxiom : MetaM Unit := do
687+ modifyDiag fun { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures, .. } =>
688+ { unfoldCounter, unfoldAxiomCounter := {}, heuristicCounter, instanceCounter, synthPendingFailures }
676689
677690/-- If diagnostics are enabled, record that heuristic for solving `f a =?= f b` has been used. -/
678691def recordDefEqHeuristic (declName : Name) : MetaM Unit := do
679- modifyDiag fun { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
692+ modifyDiag fun { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
680693 let newC := if let some c := heuristicCounter.find? declName then c + 1 else 1
681- { unfoldCounter, heuristicCounter := heuristicCounter.insert declName newC, instanceCounter, synthPendingFailures }
694+ { unfoldCounter, unfoldAxiomCounter, heuristicCounter := heuristicCounter.insert declName newC, instanceCounter, synthPendingFailures }
682695
683696/-- If diagnostics are enabled, record that instance `declName` was used during TC resolution. -/
684697def recordInstance (declName : Name) : MetaM Unit := do
685- modifyDiag fun { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
698+ modifyDiag fun { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
686699 let newC := if let some c := instanceCounter.find? declName then c + 1 else 1
687- { unfoldCounter, heuristicCounter, instanceCounter := instanceCounter.insert declName newC, synthPendingFailures }
700+ { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter := instanceCounter.insert declName newC, synthPendingFailures }
688701
689702/-- If diagnostics are enabled, record that synth pending failures. -/
690703def recordSynthPendingFailure (type : Expr) : MetaM Unit := do
691704 if (← isDiagnosticsEnabled) then
692705 unless (← get).diag.synthPendingFailures.contains type do
693706 -- We need to save the full context since type class resolution uses multiple metavar contexts and different local contexts
694707 let msg ← addMessageContextFull m!"{type}"
695- modifyDiag fun { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
696- { unfoldCounter, heuristicCounter, instanceCounter, synthPendingFailures := synthPendingFailures.insert type msg }
708+ modifyDiag fun { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures } =>
709+ { unfoldCounter, unfoldAxiomCounter, heuristicCounter, instanceCounter, synthPendingFailures := synthPendingFailures.insert type msg }
697710
698711def getLocalInstances : MetaM LocalInstances :=
699712 return (← read).localInstances
0 commit comments