IEnumerable <INamedTypeSymbol> FindNearestTupleConstructionWithInferrableType(SyntaxNode root, SemanticModel semanticModel, int position, SignatureHelpTriggerInfo triggerInfo,
                                                                                      ITypeInferenceService typeInferrer, ISyntaxFactsService syntaxFacts, CancellationToken cancellationToken, out ExpressionSyntax targetExpression)
        {
            // Walk upward through TupleExpressionSyntax/ParenthsizedExpressionSyntax looking for a
            // place where we can infer a tuple type.
            TupleExpressionSyntax         tupleExpression         = null;
            ParenthesizedExpressionSyntax parenthesizedExpression = null;

            while (TryGetTupleExpression(triggerInfo.TriggerReason, root, position, syntaxFacts, cancellationToken, out tupleExpression) ||
                   TryGetParenthesizedExpression(triggerInfo.TriggerReason, root, position, syntaxFacts, cancellationToken, out parenthesizedExpression))
            {
                targetExpression = (ExpressionSyntax)tupleExpression ?? parenthesizedExpression;
                var inferredTypes = typeInferrer.InferTypes(semanticModel, targetExpression.SpanStart, cancellationToken);

                var tupleTypes = inferredTypes.Where(t => t.IsTupleType).OfType <INamedTypeSymbol>().ToList();
                if (tupleTypes.Any())
                {
                    return(tupleTypes);
                }

                position = targetExpression.GetFirstToken().SpanStart;
            }

            targetExpression = null;
            return(null);
        }
Example #2
0
        public override Ust VisitTupleExpression(TupleExpressionSyntax node)
        {
            var result = new TupleCreateExpression()
            {
                TextSpan     = node.GetTextSpan(),
                Initializers = new List <Expression>()
            };

            for (int i = 0; i < node.Arguments.Count; i++)
            {
                var arg        = node.Arguments[i];
                var assignment = new AssignmentExpression
                {
                    Left     = new IdToken($"Item{i + 1}", arg.GetTextSpan()),
                    Right    = (Expression)VisitAndReturnNullIfError(arg.Expression),
                    TextSpan = arg.GetTextSpan()
                };
                result.Initializers.Add(assignment);

                if (arg.NameColon != null)
                {
                    result.Initializers.Add(new AssignmentExpression
                    {
                        Left     = (IdToken)VisitAndReturnNullIfError(arg.NameColon.Name),
                        Right    = (Expression)VisitAndReturnNullIfError(arg.Expression),
                        TextSpan = assignment.TextSpan
                    });
                }
            }

            return(result);
        }
Example #3
0
 private Doc PrintTupleExpressionSyntax(TupleExpressionSyntax node) =>
 Group(
     PrintArgumentListLikeSyntax(
         node.OpenParenToken,
         node.Arguments,
         node.CloseParenToken
         )
     );
Example #4
0
        public override void VisitTupleExpression(TupleExpressionSyntax node)
        {
            foreach (ArgumentSyntax argument in node.Arguments)
            {
                argument.Accept(this);
            }

            base.VisitTupleExpression(node);
        }
Example #5
0
        public override Evaluation VisitTupleExpression(TupleExpressionSyntax node)
        {
            foreach (ArgumentSyntax argument in node.Arguments)
            {
                argument.Accept <Evaluation>(this);
            }

            return(base.VisitTupleExpression(node));
        }
Example #6
0
 public static CodeAction ChangeTypeToVar(
     Document document,
     TupleExpressionSyntax tupleExpression,
     string title          = null,
     string equivalenceKey = null)
 {
     return(CodeAction.Create(
                title ?? "Change type to 'var'",
                ct => DocumentRefactorings.ChangeTypeToVarAsync(document, tupleExpression, ct),
                equivalenceKey));
 }
Example #7
0
 public static Task <Document> FixListAsync(
     Document document,
     TupleExpressionSyntax tupleExpression,
     ListFixMode fixMode = ListFixMode.Fix,
     CancellationToken cancellationToken = default)
 {
     return(FixListAsync(
                document,
                tupleExpression,
                tupleExpression.OpenParenToken,
                tupleExpression.Arguments,
                fixMode,
                cancellationToken));
 }
Example #8
0
        public override void VisitTupleExpression(TupleExpressionSyntax node)
        {
            if (!PreVisit(node))
            {
                return;
            }

            foreach (ArgumentSyntax argument in node.Arguments)
            {
                argument.Accept(this);
            }

            base.VisitTupleExpression(node);

            PostVisit(node);
        }
Example #9
0
 public override void VisitTupleExpression(TupleExpressionSyntax node)
 {
     _TupleValues = new Stack <decimal>();
     base.VisitTupleExpression(node);
     if (_TupleValues.Count != 2)
     {
         Errors.Add(RateRulesErrors.MissingArgument);
     }
     else
     {
         var ask = _TupleValues.Pop();
         var bid = _TupleValues.Pop();
         Values.Push(new BidAsk(bid, ask));
     }
     _TupleValues = null;
 }
        public static Task <Document> ChangeTypeAsync(
            Document document,
            TypeSyntax type,
            ITypeSymbol typeSymbol,
            CancellationToken cancellationToken = default)
        {
            if (type.IsVar &&
                type.Parent is DeclarationExpressionSyntax declarationExpression &&
                declarationExpression.Designation.IsKind(SyntaxKind.ParenthesizedVariableDesignation))
            {
#if DEBUG
                SyntaxNode parent = declarationExpression.Parent;

                switch (parent.Kind())
                {
                case SyntaxKind.SimpleAssignmentExpression:
                {
                    var assignmentExpression = (AssignmentExpressionSyntax)parent;
                    Debug.Assert(object.ReferenceEquals(assignmentExpression.Left, declarationExpression));
                    break;
                }

                case SyntaxKind.ForEachVariableStatement:
                {
                    var forEachStatement = (ForEachVariableStatementSyntax)parent;
                    Debug.Assert(object.ReferenceEquals(forEachStatement.Variable, declarationExpression));
                    break;
                }

                default:
                {
                    SyntaxDebug.Fail(parent);
                    break;
                }
                }
#endif
                TupleExpressionSyntax tupleExpression = CreateTupleExpression(typeSymbol)
                                                        .WithTriviaFrom(declarationExpression);

                return(document.ReplaceNodeAsync(declarationExpression, tupleExpression, cancellationToken));
            }

            TypeSyntax newType = ChangeType(type, typeSymbol);

            return(document.ReplaceNodeAsync(type, newType, cancellationToken));
        }
        private bool GetOuterMostTupleExpressionInSpan(SyntaxNode root, int position, 
            ISyntaxFactsService syntaxFacts, TextSpan currentSpan, CancellationToken cancellationToken, out TupleExpressionSyntax result)
        {
            result = null;
            while (TryGetTupleExpression(SignatureHelpTriggerReason.InvokeSignatureHelpCommand,
                root, position, syntaxFacts, cancellationToken, out var expression))
            {
                if (!currentSpan.Contains(expression.Span))
                {
                    break;
                }

                result = expression;
                position = expression.SpanStart;
            }

            return result != null;
        }
        public static Task <Document> ChangeTypeToVarAsync(
            Document document,
            TupleExpressionSyntax tupleExpression,
            CancellationToken cancellationToken = default)
        {
            SeparatedSyntaxList <VariableDesignationSyntax> variables = tupleExpression.Arguments
                                                                        .Select(f => f.Expression)
                                                                        .Cast <DeclarationExpressionSyntax>()
                                                                        .Select(f => f.Designation)
                                                                        .ToSeparatedSyntaxList();

            DeclarationExpressionSyntax declarationExpression = DeclarationExpression(
                VarType(),
                ParenthesizedVariableDesignation(variables))
                                                                .WithTriviaFrom(tupleExpression)
                                                                .WithFormatterAnnotation();

            return(document.ReplaceNodeAsync(tupleExpression, declarationExpression, cancellationToken));
        }
Example #13
0
        private bool GetOuterMostTupleExpressionInSpan(SyntaxNode root, int position,
                                                       ISyntaxFactsService syntaxFacts, TextSpan currentSpan, CancellationToken cancellationToken, out TupleExpressionSyntax result)
        {
            result = null;
            while (TryGetTupleExpression(SignatureHelpTriggerReason.InvokeSignatureHelpCommand,
                                         root, position, syntaxFacts, cancellationToken, out var expression))
            {
                if (!currentSpan.Contains(expression.Span))
                {
                    break;
                }

                result   = expression;
                position = expression.SpanStart;
            }

            return(result != null);
        }
Example #14
0
 private bool TryGetTupleExpression(SignatureHelpTriggerReason triggerReason, SyntaxNode root, int position,
                                    ISyntaxFactsService syntaxFacts, CancellationToken cancellationToken, out TupleExpressionSyntax tupleExpression)
 {
     return(CommonSignatureHelpUtilities.TryGetSyntax(root, position, syntaxFacts, triggerReason, IsTupleExpressionTriggerToken,
                                                      IsTupleArgumentListToken, cancellationToken, out tupleExpression));
 }
Example #15
0
 private static bool IsTupleArgumentListToken(TupleExpressionSyntax tupleExpression, SyntaxToken token)
 {
     return(tupleExpression.Arguments.FullSpan.Contains(token.SpanStart) &&
            token != tupleExpression.CloseParenToken);
 }
 private static bool IsTupleArgumentListToken(TupleExpressionSyntax tupleExpression, SyntaxToken token)
 {
     return tupleExpression.Arguments.FullSpan.Contains(token.SpanStart) &&
         token != tupleExpression.CloseParenToken;
 }
 public override void VisitTupleExpression(TupleExpressionSyntax node)
 {
 }
 public INamedTypeSymbol?ToSymbol(TupleExpressionSyntax node)
 => Model.GetDeclaredSymbol(node, CancellationToken);
 private bool TryGetTupleExpression(SignatureHelpTriggerReason triggerReason, SyntaxNode root, int position, 
     ISyntaxFactsService syntaxFacts, CancellationToken cancellationToken, out TupleExpressionSyntax tupleExpression)
 {
     return CommonSignatureHelpUtilities.TryGetSyntax(root, position, syntaxFacts, triggerReason, IsTupleExpressionTriggerToken, 
         IsTupleArgumentListToken, cancellationToken, out tupleExpression);
 }
 public TameTupleExpressionSyntax(TupleExpressionSyntax node)
 {
     Node = node;
     AddChildren();
 }
Example #21
0
 public override void VisitTupleExpression(TupleExpressionSyntax node)
 {
     LogUnsupportedSyntax(node);
 }
Example #22
0
 public override void VisitTupleExpression(TupleExpressionSyntax node)
 {
     this.VisitExpression(node);
 }
            private ITypeSymbol GetTupleType(
                TupleExpressionSyntax tuple)
            {
                if (!TryGetTupleTypesAndNames(tuple.Arguments, out var elementTypes, out var elementNames))
                {
                    return null;
                }

                return Compilation.CreateTupleTypeSymbol(elementTypes, elementNames);
            }
 private void AddTypeAndName(
     TupleExpressionSyntax tuple,
     ArrayBuilder<ITypeSymbol> elementTypesBuilder,
     ArrayBuilder<string> elementNamesBuilder)
 {
     var tupleType = GetTupleType(tuple);
     elementTypesBuilder.Add(tupleType);
     elementNamesBuilder.Add(null);
 }
 /// <inheritdoc />
 public override Expression VisitTupleExpression(TupleExpressionSyntax node)
 {
     return(Expressive.Tuple(
                node.Arguments.Select(x => (ParameterExpression)x.Expression.Accept(this))
                ));
 }
Example #26
0
 public override void VisitTupleExpression(TupleExpressionSyntax node)
 {
     throw new NotImplementedException();
 }
Example #27
0
 public static Doc Print(TupleExpressionSyntax node) =>
 Doc.Group(
     ArgumentListLike.Print(node.OpenParenToken, node.Arguments, node.CloseParenToken)
     );
 //
 // Summary:
 //     Called when the visitor visits a TupleExpressionSyntax node.
 public virtual void VisitTupleExpression(TupleExpressionSyntax node);