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); }
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); } }
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; }
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; }