11import Qpf.Macro.Data.Replace
2+ import Qpf.Macro.Data.RecForm
23import Qpf.Macro.Data.View
34import Qpf.Macro.NameUtils
45
@@ -15,7 +16,12 @@ partial def countConstructorArgs : Syntax → Nat
1516 | _ => 0
1617
1718
18- def mkConstructorsWithNameAndType (view : DataView) (shape : Name) (nameGen : CtorView → Ident) (ty : Term) := do
19+ def mkConstructorsWithNameAndType
20+ (view : DataView) (shape : Name)
21+ (nameGen : CtorView → Ident) (argTy retTy : Term)
22+ (binders : TSyntaxArray ``Parser.Term.bracketedBinder)
23+
24+ := do
1925 for ctor in view.ctors do
2026 trace[QPF] "mkConstructors\n {ctor.declName} : {ctor.type?}"
2127 let n_args := (ctor.type?.map countConstructorArgs).getD 0
@@ -36,8 +42,12 @@ def mkConstructorsWithNameAndType (view : DataView) (shape : Name) (nameGen : Ct
3642 `(fun $args:ident* => $mk ($shapeCtor $args:ident*))
3743 let body ← body
3844
39- let type : Term := TSyntax.mk <|
40- (ctor.type?.map fun type => Replace.replaceAllStx view.getExpectedType ty type).getD ty
45+ let recType := view.getExpectedType
46+ let forms := RecursionForm.extract ctor recType
47+
48+ let x := forms.map $ RecursionForm.replaceRec view.getExpectedType argTy
49+ let type ← RecursionForm.toType retTy x
50+
4151 let modifiers : Modifiers := {
4252 isNoncomputable := view.modifiers.isNoncomputable
4353 attrs := #[{
@@ -48,7 +58,7 @@ def mkConstructorsWithNameAndType (view : DataView) (shape : Name) (nameGen : Ct
4858
4959 let cmd ← `(
5060 $(quote modifiers):declModifiers
51- def $declId :ident : $type := $body:term
61+ def $declId :ident $binders* : $type := $body:term
5262 )
5363
5464 trace[QPF] "mkConstructor.cmd = {cmd}"
@@ -62,7 +72,6 @@ def mkConstructors (view : DataView) (shape : Name) : CommandElabM Unit := do
6272 let explicit ← view.getExplicitExpectedType
6373 let nameGen := (mkIdent <| Name.stripPrefix2 (←getCurrNamespace) ·.declName)
6474
65- mkConstructorsWithNameAndType view shape nameGen explicit
66-
75+ mkConstructorsWithNameAndType view shape nameGen explicit explicit #[]
6776
6877end Data.Command
0 commit comments