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