private ExpressionSyntax ReplaceWithMessage(ExpressionSyntax expression, string whichOrAnd, string renameMethod, string prefix = "", string postfix = "") { var replacements = new[] { NodeReplacement.Remove(whichOrAnd), NodeReplacement.Remove("Message"), NodeReplacement.RemoveOccurrence("Should", occurrence: 2) }; var newExpression = GetNewExpression(expression, replacements); var rename = NodeReplacement.RenameAndExtractArguments(renameMethod, "WithMessage"); newExpression = GetNewExpression(newExpression, rename); ArgumentSyntax newArgument = null; switch (rename.Arguments[0].Expression) { case IdentifierNameSyntax identifier: newArgument = SF.Argument(SF.ParseExpression($"$\"{prefix}{{{identifier.Identifier.Text}}}{postfix}\"")); break; case LiteralExpressionSyntax literal: newArgument = SF.Argument(SF.ParseExpression($"\"{prefix}{literal.Token.ValueText}{postfix}\"")); break; } var replacement = NodeReplacement.WithArguments("WithMessage", rename.Arguments.Replace(rename.Arguments[0], newArgument)); return(GetNewExpression(newExpression, replacement)); }
public static InvocationExpressionSyntax ToNameof(this string name) { return(SF.InvocationExpression( SF.IdentifierName("nameof")) .WithArgumentList( SF.ArgumentList( SF.SingletonSeparatedList <ArgumentSyntax>( SF.Argument( SF.IdentifierName("C")))))); }
private static StatementSyntax MakeThrowSyntax(Location location, ExpressionSyntax condition, string msg, string expr) { // message, expression, file, position, width string file = location.SourceTree.FilePath; ArgumentSyntax[] argsSyntax = { F.Argument(F.LiteralExpression(K.StringLiteralExpression, F.Literal(msg))), F.Argument(F.LiteralExpression(K.StringLiteralExpression, F.Literal(expr))), F.Argument(file == null ? F.LiteralExpression(K.NullLiteralExpression) : F.LiteralExpression(K.StringLiteralExpression, F.Literal(file))), F.Argument(F.LiteralExpression(K.NumericLiteralExpression, F.Literal(location.SourceSpan.Start))), F.Argument(F.LiteralExpression(K.NumericLiteralExpression, F.Literal(location.SourceSpan.Length))) }; return(F.IfStatement( condition, F.ParseStatement($"throw new {typeof(AssertionException).FullName}({string.Join<ArgumentSyntax>(", ", argsSyntax)});") )); }
/// <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)); }
public ExpressionSyntax?BuildArgumentListWithOriginalNames() { if (Count == 0) { return(null); } return(IsMultiDimensional ? (ExpressionSyntax)F.TupleExpression(F.SeparatedList(this.Select(a => F.Argument(F.IdentifierName(a.OriginalName))).ToArray())) : F.IdentifierName(this[0].OriginalName)); }