private void InferTypes(B.SystemPlan plan) { plan.InferTypeAliases(); foreach (A.TypeDecl t in Types) { foreach (var n in t.Names) { plan.AddType(n, t.Super); } plan.AddType(t.Super, null, silent: true); } foreach (A.HandlerDecl h in Handlers) { if (h.RHS is A.PushReaction pr) { if (plan.HasType(pr.Name)) { plan.GetTypePlan(pr.Name).InferConstructor(pr.Args, h, plan.GetTypePlan); } else { Console.WriteLine($"[A2B] Unknown pushed type '{pr.Name}'"); } } else if (h.RHS is A.WrapReaction wr) { if (plan.HasType(wr.Name)) { plan.GetTypePlan(wr.Name).InferConstructor(wr.Args, h, plan.GetTypePlan); } else { Console.WriteLine($"[A2B] Unknown wrapped type '{wr.Name}'"); } } } }