public LNode GetWithFn(AdtParam part, bool isAbstract, Symbol virtualOverride, IEnumerable <AdtParam> allParts) { int totalParts = allParts.Count(); var withField = F.Id("With" + part.NameId.Name); var args = LNode.List(); foreach (AdtParam otherPart in allParts) { if (part == otherPart) { args.Add(F.Id("newValue")); } else { args.Add(otherPart.NameId); } } var attrs = new VList <LNode>(F.Id(S.Public)); if (isAbstract) { attrs.Add(F.Id(S.Abstract)); } if (virtualOverride != null && (!isAbstract || virtualOverride == S.Override)) { attrs.Add(F.Id(virtualOverride)); } LNode method; LNode type = part.Type; LNode retType = part.ContainingType.TypeNameWithoutAttrs; if (isAbstract) { method = LNode.Call(LNode.List(attrs), CodeSymbols.Fn, LNode.List(retType, withField, LNode.Call(CodeSymbols.AltList, LNode.List(LNode.Call(LNode.List(part.OriginalDecl.Attrs), CodeSymbols.Var, LNode.List(type, LNode.Id((Symbol)"newValue"))))))); } else { method = LNode.Call(LNode.List(attrs), CodeSymbols.Fn, LNode.List(retType, withField, LNode.Call(CodeSymbols.AltList, LNode.List(LNode.Call(LNode.List(part.OriginalDecl.Attrs), CodeSymbols.Var, LNode.List(type, LNode.Id((Symbol)"newValue"))))), LNode.Call(CodeSymbols.Braces, LNode.List(LNode.Call(CodeSymbols.Return, LNode.List(LNode.Call(CodeSymbols.New, LNode.List(LNode.Call(TypeNameWithoutAttrs, LNode.List(args)))))))).SetStyle(NodeStyle.Statement))); } return(method); }
public LNode GetWithFn(AdtParam part, bool isAbstract, Symbol virtualOverride, IEnumerable<AdtParam> allParts) { LNode genericClassName = this.TypeName; int totalParts = allParts.Count(); var withField = F.Id("With" + part.NameId.Name); var args = LNode.List(); foreach (AdtParam otherPart in allParts) { if (part == otherPart) args.Add(F.Id("newValue")); else args.Add(otherPart.NameId); } var attrs = new RVList<LNode>(F.Id(S.Public)); if (isAbstract) attrs.Add(F.Id(S.Abstract)); if (virtualOverride != null && (!isAbstract || virtualOverride == S.Override)) attrs.Add(F.Id(virtualOverride)); LNode method; LNode type = part.Type; LNode retType = part.ContainingType.TypeName; if (isAbstract) { method = LNode.Call(new RVList<LNode>(attrs), CodeSymbols.Fn, LNode.List(retType, withField, LNode.Call(CodeSymbols.AltList, LNode.List(LNode.Call(new RVList<LNode>(part.OriginalDecl.Attrs), CodeSymbols.Var, LNode.List(type, LNode.Id((Symbol) "newValue"))))))); } else { method = LNode.Call(new RVList<LNode>(attrs), CodeSymbols.Fn, LNode.List(retType, withField, LNode.Call(CodeSymbols.AltList, LNode.List(LNode.Call(new RVList<LNode>(part.OriginalDecl.Attrs), CodeSymbols.Var, LNode.List(type, LNode.Id((Symbol) "newValue"))))), LNode.Call(CodeSymbols.Braces, LNode.List(LNode.Call(CodeSymbols.Return, LNode.List(LNode.Call(CodeSymbols.New, LNode.List(LNode.Call(genericClassName, new RVList<LNode>(args)))))))).SetStyle(NodeStyle.Statement))); } return method; }