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); }
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)); }
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); }
public void TestIsInstance() { Assert.False(TupleExpressionSyntaxWrapper.IsInstance(null)); Assert.False(TupleExpressionSyntaxWrapper.IsInstance(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression))); }