Re[6]: родил
От: k.sid  
Дата: 28.03.08 04:31
Оценка:
Здравствуйте, qxWork, Вы писали:

W>перейди к декларациям, с элементами кэша ты ничего сделать не сможешь (например, если они из ассембли)

W>Пример

Спасибо, помогло

заодно упорядочил маленько (для себя) иерархии AST и иерархии сущностей. Поначалу немного сбивает с толку нестандартная техника — иерархия построена на интерфейсах, что допускает множественное наследование. Но со временем привыкаешь Вот что у меня примерно вышло:

1. AST — это то что сидит в Jetbrains.Resharper.PSI.Tree: IElement, IDeclaration — верхний уровень, их потомки ITypeDeclaration и ITypeMemberDeclaration — середина, и листья типа IClassDeclaration, IMethodDeclaration и т.д. (оставляю за скобками всякие ITreeNode и *CommentNode, т.к. до них пока еще мои интересы не дошли

2. А иерархия сущностей (у ней есть какая-нибудь аббревиатура?) — это то что сидит в Jetbrains.Resharper.PSI. Тут все проще: на верху IDeclaredElement, в середине ITypeElement и ITypeMember и в самом низу листья типа IClass, IMethod, IField и т.д.

3. Можно легко "перелазить" с одного дерева на другое: IDeclaredElement.GetDeclarations() — переходим от сущностей к AST; IDeclaration.DeclaredElement — от AST к сущностям.

4. По иерархии сущностей мы гуляем используя INamespace.GetNestedElements(declarationsCache) + ITypeElement.GetMembers() — для меня вполне удобно, как бы более объектно-ориентированно, чтоли. По AST можно гулять несколькими способами, сейчас я использую IRecursiveElementProcessor. Но зачастую удобнее (опять же для меня) дойти до нужного узла по иерархии сущностей и только от туда "перелезть" на AST. Например, грубо говоря, мне надо поменять все (или, еще лучше, конкретные) readonly поля на константы (т.е. модификатор readonly на const) — я могу: 1)прошерстить все AST (в котором на порядок больше узлов, чем в иерархии сущностей) в поиске этих конкретных полей и модификаторов или 2) дойти по иерархии сущностей до искомых полей и только там перелезть на AST для подмены модификаторов. Второй подход должен быть(?) более производительным, хотя в количестве строчек кода разницы практически не будет.


Кстати, у меня возникла некая путаница в терминах: AST(Abstract Syntax Tree) и PSI(?) — это одно и тоже? А у иерархии сущностей какая аббревиатура?)

И заодно маленько не понятно, почему я могу, допустим, поменять имя IClass-а, IMethod-а и т.д. (т.е. через иерархию сущностей), но не могу поменять их модификаторы?

Т.е., получается вроде как AST — это первичная вещь, а иерархия сущностей генерится с нее и будет валидна ровно до тех пор пока AST не поменяется, вернее пока не поменяется тот узел/узлы с которых генерилась эта конкретная сущность?

Всего наилучшего,
Костя

Кстати, наконец смог зарегистрироваться на сервере, через рабочий адрес, — мой домашний провайдер почемуто упорно режет письма с вашего сайта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.