static CodeAction CreateIndexerCodeAction(Document document, SyntaxNode root, ExpressionSyntax node, IPropertySymbol indexer, ElementAccessExpressionSyntax elementAccess) { var arguments = elementAccess.ArgumentList.Arguments; var idx = arguments.IndexOf(node.Parent as ArgumentSyntax); var name = indexer.Parameters[idx].Name; return(CodeActionFactory.Create( node.Span, DiagnosticSeverity.Info, string.Format("Add argument name '{0}'", name), t2 => { var newArguments = SyntaxFactory.SeparatedList <ArgumentSyntax>( elementAccess.ArgumentList.Arguments.Take(idx).Concat( elementAccess.ArgumentList.Arguments.Skip(idx).Select((arg, i) => { if (arg.NameColon != null) { return arg; } return arg.WithNameColon(SyntaxFactory.NameColon(indexer.Parameters[i + idx].Name)); }) ) ); var newAttribute = elementAccess.WithArgumentList(elementAccess.ArgumentList.WithArguments(newArguments)); var newRoot = root.ReplaceNode((SyntaxNode)elementAccess, newAttribute).WithAdditionalAnnotations(Formatter.Annotation); return Task.FromResult(document.WithSyntaxRoot(newRoot)); } )); }
/// <summary> /// Visits the given <see cref="ElementAccessExpressionSyntax"/>, /// optionally replacing its index by /// </summary> public override SyntaxNode VisitElementAccessExpression(ElementAccessExpressionSyntax node) { var arguments = node.ArgumentList.Arguments; for (int i = 0; i < arguments.Count; i++) { ArgumentSyntax index = node.ArgumentList.Arguments[i]; // Ensure the index is an int IOperation operation = semanticModel.GetOperation(index.Expression); if (operation?.Type?.MetadataName != typeof(int).Name) { continue; } // Replace expr[index] by expr[index - startAt] ArgumentSyntax newIndex = SyntaxFactory.Argument( SyntaxFactory.BinaryExpression(SyntaxKind.SubtractExpression, index.Expression, startAtSyntax) ); arguments = arguments.RemoveAt(i) .Insert(i, newIndex); } return(node.WithArgumentList(node.ArgumentList.WithArguments(arguments))); }
public static ElementAccessExpressionSyntax WithExpressionsAsArgumentList( this ElementAccessExpressionSyntax elementAccessExpression, params ExpressionSyntax?[] expressions) { return(elementAccessExpression.WithArgumentList( F.BracketedArgumentList( F.SeparatedList(expressions.Where(e => e != null).Select(F.Argument))))); }
public static ElementAccessExpressionSyntax WithArgumentList(this ElementAccessExpressionSyntax indexer, IEnumerable <ArgumentSyntax> arguments) => indexer.WithArgumentList(BracketedArgumentList(SeparatedList(arguments)));