Допустим, у меня есть два SyntaxTree
s A и B,
где B был создан путем применения изменений к A.
Я хотел бы получить следующую информацию:
- SyntaxNodes & Tokens, которые были удалены из A для создания B
- SyntaxNodes & Tokens, которые были добавлены к A для создания B
Есть ли для этого API?
Если нет, то как это можно эффективно вычислить?
Эта информация должна быть доступна для Roslyn,
так как неизменные GreenNode
являются общими для деревьев.
Я могу придумать одно решение: использовать SyntaxTree.GetChangedSpans()
, а затем искать пересекающиеся токены.
Однако это похоже на взлом, и я не уверен, всегда ли он точен.
Небольшое изменение текста может иметь значение. большое влияние на SyntaxTree
:
(например, замена *
на +
в выражении может изменить его порядок/приоритет)
HashSets
из-за нестабильнойGetHashCode()
реализации узлов). Равенство работает:SyntaxNode.IsEquivalentTo()
. Однако я хотел бы избежать сравнения каждого узла в A с каждым узлом в B bcs O(n^2). - person 3dGrabber   schedule 22.01.2016GreenNode
, как описано в блог Эрика Липперта. Однако общедоступного API для доступа кGreenNode
s нет. - person 3dGrabber   schedule 25.01.2016