@@ -194,6 +194,24 @@ def throwLetTypeMismatchMessage {α} (fvarId : FVarId) : MetaM α := do
194194 throwError "invalid {declKind} declaration, term{indentExpr v}\n has type{indentExpr vType}\n but is expected to have type{indentExpr t}"
195195 | _ => unreachable!
196196
197+ /-- Adds note about definitions not unfolded because of the module system, if any. -/
198+ def mkUnfoldAxiomsNote (givenType expectedType : Expr) : MetaM MessageData := do
199+ let env ← getEnv
200+ if env.header.isModule then
201+ let origDiag := (← get).diag
202+ try
203+ let _ ← observing <| withOptions (diagnostics.set · true ) <| isDefEq givenType expectedType
204+ let blocked := (← get).diag.unfoldAxiomCounter.toList.filterMap fun (n, count) => do
205+ let count := count - origDiag.unfoldAxiomCounter.findD n 0
206+ guard <| count > 0 && getOriginalConstKind? env n matches some .defn
207+ return m!"{.ofConstName n} ↦ {count}"
208+ if !blocked.isEmpty then
209+ return MessageData.note m!"The following definitions were not unfolded because \
210+ their definition is not exposed:{indentD <| .joinSep blocked Format.line}"
211+ finally
212+ modify ({ · with diag := origDiag })
213+ return .nil
214+
197215/--
198216Return error message "has type{givenType}\nbut is expected to have type{expectedType}"
199217Adds the type’s types unless they are defeq.
@@ -226,19 +244,7 @@ def mkHasTypeButIsExpectedMsg (givenType expectedType : Expr)
226244 let (givenType, expectedType) ← addPPExplicitToExposeDiff givenType expectedType
227245 let trailing := trailing?.map (m!"\n " ++ ·) |>.getD .nil
228246 pure m!"has type{indentExpr givenType}\n but is expected to have type{indentExpr expectedType}{trailing}" )
229- let env ← getEnv
230- if env.header.isModule then
231- let origDiag := (← get).diag
232- let _ ← observing <| withOptions (diagnostics.set · true ) <| isDefEq givenType expectedType
233- let blocked := (← get).diag.unfoldAxiomCounter.toList.filterMap fun (n, count) => do
234- let count := count - origDiag.unfoldAxiomCounter.findD n 0
235- guard <| count > 0 && getOriginalConstKind? env n matches some .defn
236- return m!"{.ofConstName n} ↦ {count}"
237- if !blocked.isEmpty then
238- msg := msg ++ MessageData.note m!"The following definitions were not unfolded because \
239- their definition is not exposed:{indentD <| .joinSep blocked Format.line}"
240- modify ({ · with diag := origDiag })
241- return msg
247+ return msg ++ (← mkUnfoldAxiomsNote givenType expectedType)
242248
243249def throwAppTypeMismatch (f a : Expr) : MetaM α := do
244250 -- Clarify that `a` is "last" only if it may be confused with some preceding argument; otherwise,
0 commit comments