private IEnumerable <MethodDeclarationSyntax> GenerateConvenienceMutators(CoreDescriptor.CollectionEntry entry) { const string NodesParamName = "nodes"; var nodeType = Descriptor.GetNodeTypeIdentifierName(); var entryNodeType = entry.GetNodeTypeIdentifierName(); yield return(CreateWithNodeList()); yield return(CreateWithParams()); yield return(CreateAddEnumerable()); yield return(CreateAddParams()); MethodDeclarationSyntax CreateWithNodeList() { return (MethodDeclaration(nodeType, Names.WithPrefix + entry.Identifier) .AddModifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword) .AddParameterListParameters( Parameter(ThisParameterToken) .AddModifiers(SyntaxKind.ThisKeyword) .WithType(Descriptor.GetNodeTypeIdentifierName()), Parameter(entry.Identifier) .WithType( entry.GetNodeTypeIdentifierName().ToNodeListType())) .AddBodyStatements( ReturnStatement( ThisParameterSyntax .MemberAccess( IdentifierName(Names.UpdateWith)) .InvokeWithArguments( ThisParameterSyntax .MemberAccess(NodeGenerator.CorePropertyIdentifierName) .MemberAccess( IdentifierName(Names.WithPrefix + entry.Identifier)) .InvokeWithArguments( entry.IdentifierName .MemberAccess( IdentifierName(Names.ToCoreArray)) .InvokeWithArguments()))))); } MethodDeclarationSyntax CreateWithParams() { return(CreateMutator(Names.WithPrefix, CreateParameters(), CreateNodesExpression())); IEnumerable <ParameterSyntax> CreateParameters() { yield return (Parameter( Identifier(NodesParamName)) .AddModifiers(SyntaxKind.ParamsKeyword) .WithType( entryNodeType.ToArrayType())); }
static StatementSyntax CreateNotSimpleInitialization(CoreDescriptor.Entry entry) { return (CorePropertyIdentifierName .MemberAccess(entry.IdentifierName) .MemberAccess( IdentifierName(entry.IsCollection ? Names.ToListNode : Names.ToNode)) .InvokeWithArguments( ThisExpression()) .AssignTo(entry.IdentifierName) .AsStatement()); }