/-!
# Check types when pretty printing dot notation for structure projections

In type mismatch errors, the 'object of dot notation' might not be valid for dot notation.
-/

structure Foo : Type where
  out : Nat

/-!
Was printing `true.out`, but it should have been `Foo.out true`.
-/
/--
error: Application type mismatch: In the application
  Foo.out true
the final argument
  true
has type
  Bool : Type
but is expected to have type
  Foo : Type
---
info: sorry.out : Nat
-/
#guard_msgs in #check Foo.out true

/-!
Verifying that generalized field notation does not have this bug.
-/
def Foo.out' (f : Foo) : Nat := f.out
/--
error: Application type mismatch: In the application
  Foo.out' true
the final argument
  true
has type
  Bool : Type
but is expected to have type
  Foo : Type
---
info: sorry.out' : Nat
-/
#guard_msgs in #check Foo.out' true

/-!
Verifying that projection notation still pretty prints as normal.
-/
section
variable (f : Foo)
/-- info: f.out : Nat -/
#guard_msgs in #check f.out
end

/-!
Verifying that projection notation still pretty prints through type synonys.
-/
section
def Baz := Foo
variable (f : Baz)
/-- info: f.out : Nat -/
#guard_msgs in #check f.out
end
