feat: update fieldMap with composite field

This commit is contained in:
Leonardo de Moura 2021-08-10 20:04:41 -07:00
parent ae03f15c92
commit 0623bb3860
2 changed files with 31 additions and 2 deletions

View file

@ -396,8 +396,9 @@ where
let fieldParentStructName ← getStructureName fieldType
if (← findExistingField? infos fieldParentStructName).isSome then
copyFields infos fieldType fun nestedFieldMap infos => do
-- TODO: update fieldMap
copy (i+1) fieldMap infos
let fieldVal ← mkCompositeField fieldType nestedFieldMap
trace[Meta.debug] "composite, {fieldName} := {fieldVal}"
copy (i+1) (fieldMap.insert fieldName fieldVal) infos
else
addNewField
else
@ -413,6 +414,17 @@ where
| some value => return { info with value? := value }
| none => return info
mkCompositeField (parentType : Expr) (fieldMap : FieldMap) : TermElabM Expr := do
let env ← getEnv
let Expr.const parentStructName us _ ← pure parentType.getAppFn | unreachable!
let parentCtor := getStructureCtor env parentStructName
let mut result := mkAppN (mkConst parentCtor.name us) parentType.getAppArgs
for fieldName in getStructureFields env parentStructName do
match fieldMap.find? fieldName with
| some val => result := mkApp result val
| none => throwError "failed to copied fields from parent structure{indentExpr parentType}" -- TODO improve error message
return result
private def mkToParentName (parentStructName : Name) : Name :=
Name.mkSimple $ "to" ++ parentStructName.eraseMacroScopes.getString! -- erase macro scopes?

View file

@ -39,3 +39,20 @@ def f'' (a b d e : Nat) : D'' :=
theorem ex3 (a b d e: Nat) : (f'' a b d e |>.c) = a :=
rfl
structure B1 where
a : Nat
b : Nat
structure C1 extends B1 where
d : Nat
e : Nat
c : Nat := b + e
structure D1 extends A, C1
def f1 (a b d e : Nat) : D1 :=
{ a, b, d, e }
theorem ex4 (a b d e: Nat) : (f1 a b d e |>.c) = b + e :=
rfl