private static SyntaxNode CreateMethod(SyntaxGenerator generator, Node node, Options options, List <ParameterGenerationInfo> param)
        {
            return(generator.MethodDeclaration(node.Name == "Type" ? "TypeNode" : node.Name,
                                               param.SelectMany(x => x.Parameters),
                                               null,
                                               SyntaxFactory.ParseTypeName(SharedGeneratorion.RedNodeName(node.Name)),
                                               Accessibility.Public,
                                               DeclarationModifiers.Static,
                                               param.SelectMany(x => x.Code)
                                               .Concat(new[]
            {
                generator.LocalDeclarationStatement("__green",
                                                    generator.ObjectCreationExpression(
                                                        SyntaxFactory.ParseTypeName(SharedGeneratorion.GreenNodeName(node.Name)),
                                                        param.Select(x => generator.IdentifierName(x.FinalIdentifier)))),
                generator.LocalDeclarationStatement("__red", generator.CastExpression(
                                                        SyntaxFactory.ParseTypeName(SharedGeneratorion.RedNodeName(node.Name)),
                                                        generator.InvocationExpression(
                                                            generator.MemberAccessExpression(generator.IdentifierName("__green"),
                                                                                             options.CreateRed), generator.LiteralExpression(null),
                                                            generator.LiteralExpression(0)))),

                generator.ReturnStatement(generator.IdentifierName("__red"))
            })
                                               ));
        }
示例#2
0
        public static SyntaxNode CreateGreenNode(SyntaxGenerator generator, Node node, Options options)
        {
            List <SyntaxNode> classContents = new List <SyntaxNode>();

            foreach (Member type in node.Members)
            {
                classContents.Add(CreateMember(generator, type));
            }


            classContents.Add(CreateConstructor(generator, node, options));
            classContents.Add(CreateGetChild(generator, node, options));
            if (!node.Abstract)
            {
                classContents.Add(CreateCreateRed(generator, node, options));
            }
            classContents.Add(CreateRepaceChild(generator, node, options));



            return(generator.ClassDeclaration(
                       SharedGeneratorion.GreenNodeName(node.Name),
                       modifiers: DeclarationModifiers.None.WithIsAbstract(node.Abstract),
                       accessibility: Accessibility.Internal,
                       baseType: SyntaxFactory.ParseTypeName(SharedGeneratorion.GreenNodeName(node.BaseClass)),
                       members: classContents
                       ));
        }
示例#3
0
        private static SyntaxNode CreateRepaceChild(SyntaxGenerator generator, Node node, Options options)
        {
            List <SyntaxNode> cases = new List <SyntaxNode>();

            cases.AddRange(node.AllChildren()
                           .Select((c, i) => generator.SwitchSection(
                                       generator.LiteralExpression(i),
                                       new[]
            {
                generator.ReturnStatement(
                    generator.ObjectCreationExpression(
                        SyntaxFactory.ParseTypeName(SharedGeneratorion.GreenNodeName(node.Name)),
                        node.AllProperties()
                        .Select(x => generator.Argument(generator.IdentifierName(x.Name)))
                        .Concat(node.AllChildren()
                                .Select((q, z) => generator.Argument(
                                            z == i
                                                ? generator.CastExpression(
                                                SyntaxFactory.ParseTypeName(
                                                    SharedGeneratorion.GreenNodeName(q.Type)),
                                                generator.IdentifierName(options.NewChild))
                                                : generator.IdentifierName(q.Name)
                                            )))
                        )
                    )
            }

                                       )));

            cases.Add(generator.DefaultSwitchSection(new[]
            {
                generator.ThrowStatement(generator.ObjectCreationExpression(
                                             SyntaxFactory.ParseTypeName(options.InvalidChildReplace)))
            }));


            SyntaxNode switchStatement = generator.SwitchStatement(generator.IdentifierName(options.Index),
                                                                   cases);


            return(generator.MethodDeclaration(
                       options.WithReplacedChild,
                       new[]
            {
                generator.ParameterDeclaration(options.NewChild, options.GreenBase()),
                generator.ParameterDeclaration(options.Index, generator.TypeExpression(SpecialType.System_Int32))
            },
                       null,
                       options.GreenBase(),
                       Accessibility.Internal,
                       DeclarationModifiers.Override,
                       new[]
            {
                switchStatement
            }
                       ));
        }
示例#4
0
 public static TypeSyntax GreenBase(this Options options)
 {
     return(SyntaxFactory.ParseTypeName(SharedGeneratorion.GreenNodeName(options.BaseName)));
 }