This PR improves the “expected type mismatch” error message by omitting the type's types when they are defeq, and putting them into separate lines when not. I found it rather tediuos to parse the error message when the expected type is long, because I had to find the `:` in the middle of a large expression somewhere. Also, when both are of sort `Prop` or `Type` it doesn't add much value to print the sort (and it’s only one hover away anyways).
46 lines
1.2 KiB
Text
46 lines
1.2 KiB
Text
set_option pp.mvars false
|
||
|
||
/--
|
||
error: type mismatch
|
||
congrArg ?_ (congrArg ?_ ?_)
|
||
has type
|
||
?_ (?_ ?_) = ?_ (?_ ?_)
|
||
but is expected to have type
|
||
OfNat.ofNat 0 = OfNat.ofNat 1
|
||
-/
|
||
#guard_msgs in
|
||
theorem ex1 : (@OfNat.ofNat Nat 0 Zero.toOfNat0) = @OfNat.ofNat Nat 1 One.toOfNat1 := by
|
||
refine congrArg _ (congrArg _ ?_)
|
||
rfl
|
||
|
||
/--
|
||
error: tactic 'apply' failed, could not unify the conclusion of `@congrArg`
|
||
?_ ?_ = ?_ ?_
|
||
with the goal
|
||
OfNat.ofNat 0 = OfNat.ofNat 1
|
||
|
||
Note: The full type of `@congrArg` is
|
||
∀ {α : Sort _} {β : Sort _} {a₁ a₂ : α} (f : α → β), a₁ = a₂ → f a₁ = f a₂
|
||
⊢ OfNat.ofNat 0 = OfNat.ofNat 1
|
||
-/
|
||
#guard_msgs in
|
||
example : (@OfNat.ofNat Nat 0 Zero.toOfNat0) = @OfNat.ofNat Nat 1 One.toOfNat1 := by
|
||
apply congrArg
|
||
apply congrArg
|
||
apply rfl
|
||
|
||
/--
|
||
error: tactic 'apply' failed, could not unify the conclusion of `@congrArg`
|
||
?_ ?_ = ?_ ?_
|
||
with the goal
|
||
OfNat.ofNat 0 = OfNat.ofNat 1
|
||
|
||
Note: The full type of `@congrArg` is
|
||
∀ {α : Sort _} {β : Sort _} {a₁ a₂ : α} (f : α → β), a₁ = a₂ → f a₁ = f a₂
|
||
⊢ OfNat.ofNat 0 = OfNat.ofNat 1
|
||
-/
|
||
#guard_msgs in
|
||
theorem ex2 : (@OfNat.ofNat Nat 0 Zero.toOfNat0) = @OfNat.ofNat Nat 1 One.toOfNat1 := by
|
||
apply congrArg
|
||
apply congrArg
|
||
apply rfl
|