blob: beb6f275fa5c4568a97032184e549e43e81a3cd0 [file] [edit]
import Lean
open Lean
structure S1 where
(x y : Nat)
structure S2 extends S1 where
(z : Nat)
structure S3 where
(w : Nat)
structure S4 extends S2, S3 where
(s : Nat)
def check (b : Bool) : CoreM Unit :=
unless b do throwError "check failed"
class S5 where
(x y : Nat)
inductive D
| mk (x y z : Nat) : D
/--
info: #[constants, quotInit, diagnostics, const2ModIdx, extensions, irBaseExts, header]
#[toS2, toS1, x, y, z, toS3, w, s]
(some [S4.toS2, S2.toS1])
#[S2, S3]
#[S2, S3, S1]
-/
#guard_msgs in
#eval show CoreM Unit from do
let env ← getEnv
IO.println (getStructureFields env ``Kernel.Environment)
check $ getStructureFields env `S4 == #[`toS2, `toS3, `s]
check $ getStructureFields env `S1 == #[`x, `y]
check $ isSubobjectField? env `S4 `toS2 == some `S2
check $ getStructureSubobjects env `S4 == #[`S2, `S3]
check $ findField? env `S4 `x == some `S1
check $ findField? env `S4 `x1 == none
check $ isStructure env `S1
check $ isStructure env `S2
check $ isStructure env `S3
check $ isStructure env `S4
check $ isStructure env `S5
check $ !isStructure env `Nat
check $ !isStructure env `D
check $ getPathToBaseStructure? env `S1 `S4 == some [`S4.toS2, `S2.toS1]
IO.println (getStructureFieldsFlattened env `S4)
IO.println (getPathToBaseStructure? env `S1 `S4)
IO.println (getStructureSubobjects env `S4)
IO.println (← getAllParentStructures `S4)
pure ()
def dumpStructInfo (structName : Name) : CoreM Unit := do
let env ← getEnv
let some info := getStructureInfo? env structName
| throwError "no such structure {structName}"
IO.println s!"\
struct: {info.structName}\n\
fields: {info.fieldNames}\n\
field infos: {info.fieldInfo.map fun info => s!"({info.fieldName}, {info.subobject?}, {info.projFn})"}\n\
parent infos: {info.parentInfo.map fun info => (info.structName, info.subobject, info.projFn)}"
/--
info: struct: S1
fields: #[x, y]
field infos: #[(y, none, S1.y), (x, none, S1.x)]
parent infos: #[]
-/
#guard_msgs in #eval dumpStructInfo `S1
/--
info: struct: S2
fields: #[toS1, z]
field infos: #[(z, none, S2.z), (toS1, (some S1), S2.toS1)]
parent infos: #[(S1, (true, S2.toS1))]
-/
#guard_msgs in #eval dumpStructInfo `S2
/--
info: struct: S3
fields: #[w]
field infos: #[(w, none, S3.w)]
parent infos: #[]
-/
#guard_msgs in #eval dumpStructInfo `S3
/--
info: struct: S4
fields: #[toS2, toS3, s]
field infos: #[(s, none, S4.s), (toS2, (some S2), S4.toS2), (toS3, (some S3), S4.toS3)]
parent infos: #[(S2, (true, S4.toS2)), (S3, (true, S4.toS3))]
-/
#guard_msgs in #eval dumpStructInfo `S4
/-!
Basic diamond
-/
structure A1 where
x : Nat
structure A2 extends A1 where
y : Nat
structure A3 extends A1 where
z : Nat
structure A4 extends A2, A3 where
w : Nat
/--
info: struct: A1
fields: #[x]
field infos: #[(x, none, A1.x)]
parent infos: #[]
-/
#guard_msgs in #eval dumpStructInfo `A1
/--
info: struct: A2
fields: #[toA1, y]
field infos: #[(y, none, A2.y), (toA1, (some A1), A2.toA1)]
parent infos: #[(A1, (true, A2.toA1))]
-/
#guard_msgs in #eval dumpStructInfo `A2
/--
info: struct: A3
fields: #[toA1, z]
field infos: #[(z, none, A3.z), (toA1, (some A1), A3.toA1)]
parent infos: #[(A1, (true, A3.toA1))]
-/
#guard_msgs in #eval dumpStructInfo `A3
/--
info: struct: A4
fields: #[toA2, z, w]
field infos: #[(z, none, A4.z), (w, none, A4.w), (toA2, (some A2), A4.toA2)]
parent infos: #[(A2, (true, A4.toA2)), (A3, (false, A4.toA3))]
-/
#guard_msgs in #eval dumpStructInfo `A4
/-!
Abbreviation in parent
-/
abbrev AA1 := A1
structure A5 extends AA1 where
a : Nat
/--
info: struct: A5
fields: #[toA1, a]
field infos: #[(a, none, A5.a), (toA1, (some A1), A5.toA1)]
parent infos: #[(A1, (true, A5.toA1))]
-/
#guard_msgs in #eval dumpStructInfo `A5
/-!
Regression test: make sure mathlib `Type*` still elaborates with levels in correct order.
During development, this came out as `AddEquiv.{u_10, u_9}`.
-/
section
elab "Type*" : term => do
let u ← Lean.Meta.mkFreshLevelMVar
Lean.Elab.Term.levelMVarToParam (.sort (.succ u))
variable {F α β M N P G H : Type*}
structure AddEquiv (A B : Type*) : Type
/-- info: AddEquiv.{u_9, u_10} (A : Type u_9) (B : Type u_10) : Type -/
#guard_msgs in #check AddEquiv
end