コード例 #1
0
        private static ISet <ISymbol> GetAssignedMemberSymbols(IList <MemberUsage> memberUsages)
        {
            var assignedMembers = new HashSet <ISymbol>();

            foreach (var memberUsage in memberUsages)
            {
                ExpressionSyntax node = memberUsage.SyntaxNode;
                var memberSymbol      = memberUsage.Symbol;

                // Handle "expr.FieldName"
                if (node.Parent is MemberAccessExpressionSyntax simpleMemberAccess &&
                    simpleMemberAccess.Name == node)
                {
                    node = simpleMemberAccess;
                }

                // Handle "((expr.FieldName))"
                node = node.GetSelfOrTopParenthesizedExpression();

                if (IsValueType(memberSymbol))
                {
                    // Handle (((exp.FieldName)).Member1).Member2
                    var parentMemberAccess = node.Parent as MemberAccessExpressionSyntax;
                    while (IsParentMemberAccess(parentMemberAccess, node))
                    {
                        node = parentMemberAccess.GetSelfOrTopParenthesizedExpression();
                        parentMemberAccess = node.Parent as MemberAccessExpressionSyntax;
                    }

                    node = node.GetSelfOrTopParenthesizedExpression();
                }

                var parentNode = node.Parent;

                if (PreOrPostfixOpSyntaxKinds.Contains(parentNode.Kind()))
                {
                    assignedMembers.Add(memberSymbol);
                    continue;
                }

                if (parentNode is AssignmentExpressionSyntax assignment)
                {
                    if (assignment.Left == node)
                    {
                        assignedMembers.Add(memberSymbol);
                    }

                    continue;
                }

                if (parentNode is ArgumentSyntax argument &&
                    (!argument.RefOrOutKeyword.IsKind(SyntaxKind.None) || TupleExpressionSyntaxWrapper.IsInstance(argument.Parent)))
                {
                    assignedMembers.Add(memberSymbol);
                }
            }

            return(assignedMembers);
        }
コード例 #2
0
        public void TestIsInstance()
        {
            Assert.False(TupleExpressionSyntaxWrapper.IsInstance(null));
            Assert.False(TupleExpressionSyntaxWrapper.IsInstance(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)));

            var syntaxNode = this.CreateTupleExpression();

            Assert.True(TupleExpressionSyntaxWrapper.IsInstance(syntaxNode));
        }
コード例 #3
0
            static int GetTupleCount(ExpressionSyntax assignmentLeft)
            {
                var result = 0;

                if (TupleExpressionSyntaxWrapper.IsInstance(assignmentLeft))
                {
                    result = ((TupleExpressionSyntaxWrapper)assignmentLeft).Arguments.Count;
                }
                else if (DeclarationExpressionSyntaxWrapper.IsInstance(assignmentLeft) &&
                         (DeclarationExpressionSyntaxWrapper)assignmentLeft is { } leftDeclaration &&
                         ParenthesizedVariableDesignationSyntaxWrapper.IsInstance(leftDeclaration.Designation))
                {
                    result = ((ParenthesizedVariableDesignationSyntaxWrapper)leftDeclaration.Designation).Variables.Count;
                }
                return(result);
            }
コード例 #4
0
 public void TestIsInstance()
 {
     Assert.False(TupleExpressionSyntaxWrapper.IsInstance(null));
     Assert.False(TupleExpressionSyntaxWrapper.IsInstance(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)));
 }