public static ParameterListSyntax GetParameterListSyntax(this Method method, INamespaceSet namespaces, ISymbolMap symbols) { method = method ?? throw new ArgumentNullException(nameof(method)); namespaces = namespaces ?? throw new ArgumentNullException(nameof(namespaces)); symbols = symbols ?? throw new ArgumentNullException(nameof(symbols)); return(SF.ParameterList(SF.SeparatedList(GetParameters()))); IEnumerable <ParameterSyntax> GetParameters() { if (method.Parameters == null) { yield break; } foreach (Parameter parameter in method.Parameters) { namespaces.Add(parameter.Type); yield return(SF.Parameter( SF.List <AttributeListSyntax>(), SF.TokenList(), symbols.GetTypeSyntax(parameter.Type), symbols.GetNameSyntaxToken(parameter), null )); } } }
private static SyntaxNode Normalize(SyntaxNode root, IEnumerable <SyntaxNode> members, Scope scope) { var appClass = root .DescendantNodes() .OfType <ClassDeclarationSyntax>() .Where(@class => @class.Identifier.ToString() == "testclass") .FirstOrDefault(); if (appClass == null) { appClass = CSharp.ClassDeclaration("testclass"); } return(CSharp.CompilationUnit() .WithMembers(CSharp.List(new[] { (MemberDeclarationSyntax) appClass .WithMembers(CSharp.List( members.Select( member => { var method = member as MethodDeclarationSyntax; if (method == null) { return member; } return method.WithParameterList( method .ParameterList .AddParameters(CSharp.Parameter( CSharp.ParseToken("result")) .WithType(CSharp.ParseTypeName("Dictionary<string, object>")))); }))) }))); }
public BracketedParameterListSyntax?BuildParameterList() { if (Count == 0) { return(null); } return(F.BracketedParameterList(F.SeparatedList(this.Select(a => F.Parameter(F.Identifier(a.TupleSafeName)).WithType(a.Type))))); }
public ParameterSyntax Build() => _type != null ? SF.Parameter(SF.List <AttributeListSyntax>(), SF.TokenList(), ParseType(_type), SF.ParseToken(_name), null) : SF.Parameter(SF.List <AttributeListSyntax>(), SF.TokenList(), null, SF.ParseToken(_name), null);
/// <inheritdoc /> public override ClassDeclarationSyntax Apply(ClassDeclarationSyntax node, INamedTypeSymbol symbol, CancellationToken cancellationToken) { var parameters = ImmutableArray.CreateBuilder <ParameterSyntax>(); var arguments = ImmutableArray.CreateBuilder <ArgumentSyntax>(); var ctorStmts = ImmutableArray.CreateBuilder <StatementSyntax>(); // Generate all parameters and statements var members = symbol.GetMembers(); for (int i = 0; i < members.Length; i++) { IPropertySymbol member = members[i] as IPropertySymbol; if (member == null || !member.IsReadOnly || !member.CanBeReferencedByName) { continue; } // Read-only prop, we good string propName = member.Name; string paramName = $"{char.ToLower(propName[0]).ToString()}{propName.Substring(1)}"; TypeSyntax paramType = ((PropertyDeclarationSyntax)member.DeclaringSyntaxReferences[0] .GetSyntax(cancellationToken)).Type; MemberAccessExpressionSyntax propAccess = F.MemberAccessExpression( K.SimpleMemberAccessExpression, F.ThisExpression(), F.IdentifierName(propName) ); // Make parameter & argument parameters.Add(F.Parameter(F.Identifier(paramName)).WithType(paramType)); arguments.Add(F.Argument(propAccess)); // Make ctor stmt ctorStmts.Add(F.ExpressionStatement( F.AssignmentExpression(K.SimpleAssignmentExpression, propAccess, F.IdentifierName(paramName) ) )); } // The ctor is full, make all the 'with' methods TypeSyntax returnType = F.IdentifierName(symbol.Name); MemberDeclarationSyntax[] additionalMethods = new MemberDeclarationSyntax[parameters.Count + 1]; arguments.Capacity = arguments.Count; ImmutableArray <ArgumentSyntax> args = arguments.MoveToImmutable(); for (int i = 0; i < parameters.Count; i++) { ParameterSyntax parameter = parameters[i]; string parameterName = parameter.Identifier.Text; ArgumentSyntax name = F.Argument(F.IdentifierName(parameterName)); SeparatedSyntaxList <ArgumentSyntax> allArguments = F.SeparatedList(args.Replace(args[i], name)); StatementSyntax returnStmt = F.ReturnStatement( F.ObjectCreationExpression(returnType).WithArgumentList(F.ArgumentList(allArguments)) ); additionalMethods[i] = F.MethodDeclaration(returnType, $"With{char.ToUpper(parameterName[0]).ToString()}{parameterName.Substring(1)}") .AddModifiers(F.Token(K.PublicKeyword), F.Token(K.NewKeyword)) .AddParameterListParameters(parameter) .AddBodyStatements(returnStmt); } // Add the private ctor additionalMethods[parameters.Count] = F.ConstructorDeclaration(symbol.Name) .AddModifiers(F.Token(K.PrivateKeyword)) .AddParameterListParameters(parameters.ToArray()) .AddBodyStatements(ctorStmts.ToArray()); return(node.AddMembers(additionalMethods)); }