protected ExpressionSyntax GetNewExpression(ExpressionSyntax expression, NodeReplacement replacement) { var visitor = new MemberAccessExpressionsCSharpSyntaxVisitor(); expression.Accept(visitor); var members = new LinkedList <MemberAccessExpressionSyntax>(visitor.Members); var current = members.Last; while (current != null) { if (replacement.IsValidNode(current)) { // extract custom data into the replacement object replacement.ExtractValues(current.Value); var oldNode = replacement.ComputeOld(current); var newNode = replacement.ComputeNew(current); return(expression.ReplaceNode(oldNode, newNode)); } current = current.Previous; } throw new System.InvalidOperationException("should not get here"); }