Я смотрю Roslyn CTP и, хотя он решает аналогичную проблему с API дерева выражений, оба неизменяемы, но Roslyn делает это совершенно по-другому:
-
Expressionузлы не имеют ссылки на родительский node, модифицируются с помощьюExpressionVisitorи поэтому большие части могут быть повторно использованы. -
Roslyn
SyntaxNode, с другой стороны, имеет ссылку на своего родителя, поэтому все узлы эффективно становятся блоком, который невозможно повторно использовать. Для внесения изменений предлагаются такие методы, какUpdate,ReplaceNodeи т.д.
Где это заканчивается? Document? Project? ISolution? API поддерживает пошаговое изменение дерева (вместо кнопки вверх), но делает ли каждый шаг полную копию?
Почему они сделали такой выбор? Есть ли какой-то интересный трюк, который мне не хватает?