コード例 #1
0
        public WebInfoGenerationData GetClassForWebElement(WebElementInfo info)
        {
            var className   = GetClassNameFromElementName(info.Name);
            var propName    = className.Substring(1);
            var constInfoCD = GetClassForConstInfo(info);

            var baseClassName = info.GetType().Name;
            var docComment    = GetDocCommentWithText(info.Description);

            var infoComment = GetDocCommentWithText("Information about element");

            var infoProperty = SF.PropertyDeclaration(
                SF.ParseTypeName($"{InfoStaticClassName}.{InfoClassName}"),
                SF.Identifier(InfoClassName)
                )
                               .WithAccessorList(
                SF.AccessorList(
                    SF.List(
                        new List <AccessorDeclarationSyntax>
            {
                SF.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                .WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken)),
                SF.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
                .WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken))
            }
                        )
                    )
                .WithOpenBraceToken(SF.Token(SyntaxKind.OpenBraceToken))
                .WithCloseBraceToken(SF.Token(SyntaxKind.CloseBraceToken))
                )
                               .AddModifiers(SF.Token(SyntaxKind.PublicKeyword).WithLeadingTrivia(SF.Trivia(infoComment)));

            var getInstMd = GetGetInstanceMethod(className);

            var cd = SF.ClassDeclaration(className)
                     .AddModifiers(SF.Token(SyntaxKind.PublicKeyword).WithLeadingTrivia(SF.Trivia(docComment)))
                     .AddBaseListTypes(SF.SimpleBaseType(SF.IdentifierName(baseClassName)))
                     .AddMembers(infoProperty, getInstMd, constInfoCD);

            var genData = new WebInfoGenerationData
            {
                ClassName    = className,
                PropertyName = propName,
                ClassSyntax  = cd,
                Element      = info
            };

            FillWithChildrenElementsProperties(genData, out List <WebInfoGenerationData> childrenGens);

            AddCtor(genData, childrenGens);

            FillWithChildrenElementsClasses(genData, childrenGens);

            return(genData);
        }
コード例 #2
0
        private void FillWithChildrenElementsClasses(WebInfoGenerationData genData, List <WebInfoGenerationData> childrenGens)
        {
            if (childrenGens == null || childrenGens.Count == 0)
            {
                return;
            }

            foreach (var childGen in childrenGens)
            {
                genData.ClassSyntax = genData.ClassSyntax.AddMembers(childGen.ClassSyntax);
            }
        }
コード例 #3
0
        private void FillWithChildrenElementsProperties(WebInfoGenerationData genData, out List <WebInfoGenerationData> childrenGens)
        {
            childrenGens = null;
            if (!(genData.Element is CombinedWebElementInfo combinedInfo))
            {
                return;
            }

            childrenGens = combinedInfo.Elements
                           ?.Select(e => GetClassForWebElement(e)).ToList()
                           ?? new List <WebInfoGenerationData>();

            if (childrenGens.Count == 0)
            {
                return;
            }

            var members = new List <MemberDeclarationSyntax>();

            foreach (var childGen in childrenGens)
            {
                var docComment = GetDocCommentWithText(childGen.Element.Description);

                var pd = SF.PropertyDeclaration(
                    SF.IdentifierName(SF.Identifier(childGen.ClassName)),
                    SF.Identifier(childGen.PropertyName)
                    )
                         .WithAccessorList(
                    SF.AccessorList(
                        SF.List(
                            new List <AccessorDeclarationSyntax>
                {
                    SF.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                    .WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken)),
                    SF.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
                    .WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken))
                }
                            )
                        )
                    .WithOpenBraceToken(SF.Token(SyntaxKind.OpenBraceToken))
                    .WithCloseBraceToken(SF.Token(SyntaxKind.CloseBraceToken))
                    )
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword).WithLeadingTrivia(SF.Trivia(docComment)));

                members.Add(pd);
            }

            var cd = genData.ClassSyntax.AddMembers(members.ToArray());

            genData.ClassSyntax = cd;
        }
コード例 #4
0
        private void AddCtor(WebInfoGenerationData genData, List <WebInfoGenerationData> childrenGens)
        {
            var statements = new List <StatementSyntax>();

            var infoInit = SF.ExpressionStatement(
                SF.AssignmentExpression(
                    SyntaxKind.SimpleAssignmentExpression,
                    SF.IdentifierName(InfoClassName),
                    SF.ObjectCreationExpression(SF.ParseTypeName($"{InfoStaticClassName}.{InfoClassName}"))
                    .WithArgumentList(SF.ArgumentList())
                    )
                );

            statements.Add(infoInit);

            var locatorInit = SF.ExpressionStatement(
                SF.AssignmentExpression(
                    SyntaxKind.SimpleAssignmentExpression,
                    SF.IdentifierName(LocatorClassName),
                    SF.ObjectCreationExpression(SF.IdentifierName(nameof(WebLocatorInfo)))
                    .WithArgumentList(SF.ArgumentList())
                    )
                );

            statements.Add(locatorInit);

            var locatorProps = new List <string>
            {
                nameof(WebLocatorInfo.LocatorType),
                nameof(WebLocatorInfo.LocatorValue),
                nameof(WebLocatorInfo.IsRelative)
            };

            foreach (var locatorProp in locatorProps)
            {
                var st = SF.ExpressionStatement(
                    SF.AssignmentExpression(
                        SyntaxKind.SimpleAssignmentExpression,
                        SF.MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            SF.IdentifierName(LocatorClassName),
                            SF.IdentifierName(locatorProp)
                            ),
                        SF.MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            SF.MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                SF.IdentifierName(InfoStaticClassName),
                                SF.IdentifierName(LocatorStaticClassName)
                                ),
                            SF.IdentifierName(locatorProp)
                            )
                        )
                    );
                statements.Add(st);
            }

            if (childrenGens?.Count > 0)
            {
                var elsInit = SF.ExpressionStatement(
                    SF.AssignmentExpression(
                        SyntaxKind.SimpleAssignmentExpression,
                        SF.IdentifierName(nameof(CombinedWebElementInfo.Elements)),
                        SF.ObjectCreationExpression(
                            SF.GenericName(SF.Identifier("List"))
                            .WithTypeArgumentList(SF.TypeArgumentList(SF.SingletonSeparatedList <TypeSyntax>(SF.IdentifierName(nameof(WebElementInfo)))))
                            )
                        .WithArgumentList(SF.ArgumentList())
                        )
                    );
                statements.Add(elsInit);

                foreach (var childGen in childrenGens)
                {
                    var propInit = SF.ExpressionStatement(
                        SF.AssignmentExpression(
                            SyntaxKind.SimpleAssignmentExpression,
                            SF.IdentifierName(childGen.PropertyName),
                            SF.ObjectCreationExpression(SF.IdentifierName(childGen.ClassName))
                            .WithArgumentList(SF.ArgumentList())
                            )
                        );
                    statements.Add(propInit);

                    var parentSt = SF.ExpressionStatement(
                        SF.AssignmentExpression(
                            SyntaxKind.SimpleAssignmentExpression,
                            SF.MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                SF.IdentifierName(childGen.PropertyName),
                                SF.IdentifierName(nameof(WebElementInfo.Parent))
                                ),
                            SF.ThisExpression()
                            )
                        );
                    statements.Add(parentSt);

                    var elsAddSt = SF.ExpressionStatement(
                        SF.InvocationExpression(
                            SF.MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                SF.IdentifierName(nameof(CombinedWebElementInfo.Elements)),
                                SF.IdentifierName("Add")
                                )
                            ).WithArgumentList(
                            SF.ArgumentList(
                                SF.SingletonSeparatedList(SF.Argument(SF.IdentifierName(childGen.PropertyName)))
                                )
                            )
                        );
                    statements.Add(elsAddSt);
                }
            }

            var summary = GetDocCommentWithText(genData.Element.Description);

            var ctor = SF.ConstructorDeclaration(SF.Identifier(genData.ClassName))
                       .WithBody(SF.Block(statements))
                       .WithModifiers(SF.TokenList(SF.Token(SyntaxKind.PublicKeyword).WithLeadingTrivia(SF.Trivia(summary))));

            var cd = genData.ClassSyntax.AddMembers(ctor);

            genData.ClassSyntax = cd;
        }