Example #1
0
        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)));
        }
Example #3
0
 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)))));
 }
Example #4
0
 public static ElementAccessExpressionSyntax WithArgumentList(this ElementAccessExpressionSyntax indexer, IEnumerable <ArgumentSyntax> arguments)
 => indexer.WithArgumentList(BracketedArgumentList(SeparatedList(arguments)));