private static IEnumerable <MemberDeclarationSyntax> GenerateField(Field field, IReadOnlyList <Operation> operations) { List <string> opNames = operations.Where(o => o.Fields.Any(f => f.Id == field.Id)).Select(o => o.Id).OrderBy(n => n).ToList(); if (opNames.Count == 0) { throw new Exception("Found Field with no usages: " + field.Entries); } if (field.Entries.Count > 1) { string stringPropName = field.Id.First().ToString().ToUpper() + field.Id.Substring(1) + (!field.IsEnum || field.EnumAsString ? "String" : "Int"); yield return(CreateAutoProperty(stringPropName, !field.IsEnum || field.EnumAsString ? "string" : "int", CreateAttribute(field.Id))); yield return(CreateCanSerializeAt(stringPropName, opNames)); foreach (FieldEntry ent in field.Entries) { string getStr = GetGetter(field, stringPropName, ent); string setStr = GetSetter(field, stringPropName); yield return(CreateProperty(ent.Name, ent.Type, CreateIgnoreAttribute()) .AddAccessorListAccessors(CreateArrowExpression(SyntaxKind.GetAccessorDeclaration, getStr)) .AddAccessorListAccessors(CreateArrowExpression(SyntaxKind.SetAccessorDeclaration, setStr))); } yield break; } FieldEntry entry = field.Entries.First(); if (field.EnumAsString) { yield return(CreateAutoProperty(entry.Name, entry.Type, CreateIgnoreAttribute())); string getStr = string.Format("{0}.ToString();", entry.Name); string setStr = string.Format("{0} = ({1})Enum.Parse(typeof({1}), value);", entry.Name, entry.Type); yield return(CreateProperty(entry.Name + "String", "string", CreateAttribute(field.Id)) .AddAccessorListAccessors(CreateArrowExpression(SyntaxKind.GetAccessorDeclaration, getStr)) .AddAccessorListAccessors(CreateArrowExpression(SyntaxKind.SetAccessorDeclaration, setStr))); yield return(CreateCanSerializeAt(entry.Name + "String", opNames)); yield break; } yield return(CreateAutoProperty(entry.Name, entry.Type, CreateAttribute(field.Id))); yield return(CreateCanSerializeAt(entry.Name, opNames)); }
private static string GetGetter(Field field, string stringPropName, FieldEntry ent) { if (!field.IsEnum) { return(string.Format("{1}.Parse({0});", stringPropName, ent.Type)); } if (field.EnumAsString) { return(string.Format("({1})Enum.Parse(typeof({1}), {0});", stringPropName, ent.Type)); } return(string.Format("({1}){0};", stringPropName, ent.Type)); }