Есть ли где нормальное описание для разработки плагинов?
От: AlexNek  
Дата: 08.10.12 22:10
Оценка:
Пока все что удалось найти — этоReSharper Plugin Development, но там настолько мало и обзорно, что толка весьма мало.
Пока приходится рыться по доступным исходникам реальных плагинов и пытаться найти что то подобное. Но как видишь "нутро" плагина только диву даешься откуда это стало известно разработчикам плагина? Может чего пропустил?

Вообще то нужен аналог решарповского локализатора строк, только не в ресурсы. Для одной строки под курсором и одного класса это уже удалось. А вот с итерацией по классам и методам застрял

И как вообще написать плагин совместиый с 5,6,7 версией решарпера?
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
Re: Есть ли где нормальное описание для разработки плагинов?
От: DmitriN Россия http://nesteruk.wordpress.com
Дата: 09.10.12 06:43
Оценка:
Привет! Для того чтобы разобраться как все работает, помимо Plugin Dev Guide советую также обратить внимание на сэмплы, приложенные к SDK — в них покрыты примеры реализации всех основных фич Решарпера. Что касается итераций по классам и методам, то советую обратить внимание на эту секцию — в ней описан в том числе и IRecursiveElementProcessor, который можно запустить сразу на целом файле и быстро найти все ноды, которые являются строковыми литералами.

Если будут еще вопросы, можно писать мне напрямую: dn /sobaka/ jetbrains /dot/ com
Re: Есть ли где нормальное описание для разработки плагинов?
От: DmitriN Россия http://nesteruk.wordpress.com
Дата: 09.10.12 07:15
Оценка:
Да, и что касается обратной совместимости: я бы рекомендовал скорее писать под разные версии в разных брэнчах, но чисто теоретически, иметь одну кодовую базу для нескольких версий Решарпера реально, только придется использовать очень много #if-ов, и механизм сборки подработать чтобы все собиралось с правильной версией SDK. В качестве примера есть плагин OpenWrap который так делает.
Re[2]: Есть ли где нормальное описание для разработки плагинов?
От: AlexNek  
Дата: 09.10.12 19:26
Оценка:
Здравствуйте, DmitriN, Вы писали:

DN>Привет! Для того чтобы разобраться как все работает, помимо Plugin Dev Guide советую также обратить внимание на сэмплы, приложенные к SDK — в них покрыты примеры реализации всех основных фич Решарпера.

Большое спасибо за быстрый ответ, ну уж никак не ожидал получил ответ от составителя документации, как мне кажется.
На личном опыте знаю знаю насколько тяжело писать документацию, а уж тем более получить результат который удовлетворит многих. Так что, если я буду писать плохие слова относительно документации, не воспринимайте на свой счет. Мне всего лишь хочется сделать документацию чуть лучше.
А без дэмок было бы то совсем тяжело.

DN>Что касается итераций по классам и методам, то советую обратить внимание на эту секцию — в ней описан в том числе и IRecursiveElementProcessor, который можно запустить сразу на целом файле и быстро найти все ноды, которые являются строковыми литералами.

Я как то сразу отмел "демонов", так как все действия думалось делать исключительно по запросу пользователя. Типа как в FindText примере.

Да и информации там, как обычно, негусто
 An element processor is a class implementing an interface such as IRecursiveElementProcessor, that lets you walk around all the tree nodes in a particular block of code

Под описанием я пониманию что то типа этого
Хотя Дев Экспрес для описания мне нравится больше

DN>Если будут еще вопросы, можно писать мне напрямую

Постараюсь не напрягать прямым контактом
Да и может еще кому пригодится.
-----
Пока опишу какие трудности были и остались в памяти.
1. Building, running and debugging plugin
сразу натыкаешся на эту ссылку. Но там ни слова о том что отладка работает только если в проекте установлена версия НЕТ 4.0, вроде элементарно, но с 3.5 также собирается, но без возможностей установки точек установа. Пробовал и "/RootSuffix Exp" (Кстати, в "1.3 Project Set-Up (R7)" об этом ключике тоже ни слова , предлагается вначале отключить плагин) и что то еще, пока не догадался глянуть на Target. Хотя после отладки прийдется опять 3.5 ставить для работы в 2008.
2. Документация
Ее катастрофически мало да и та что есть страдает отсутствием законченности. Вот например, потребовалось создать проперти.
Сразу вышел на 3.2 Creating Code Elements (R7)
Но там можно найти только "начало", что в принципе из демок и так понятно.
Так что первая строка получилась без особого труда
IPropertyDeclaration propertyDeclaration = factory.CreatePropertyDeclaration(type, newText.ToString());

Сорри, некоторый труд все же был, нужно было найти как определить type. Правильно или нет не знаю, но получилось так.
IClrTypeName clrName = new ClrTypeName("string");
IType type = new DeclaredTypeFromCLRName(clrName, provider.PsiModule);

После, стало ясно что нужно искать get и set. По счастью нашлось в factory
IAccessorDeclaration accessorDeclaration = factory.CreateAccessorDeclaration(AccessorKind.GETTER, true);

Понятно, что одно нужно вложить в другое. Подходящая функция нашлась по имени, а вот параметры пришлось подбирать.
propertyDeclaration.AddAccessorDeclarationBefore(accessorDeclaration, null);

Дальше оказалось сложнее, что же именно добавлять в get? После некоторого поиска по исходникам и пар "озарений" получилось
            string returnOperator = String.Format("{{return \"{0}\";}}", stringValue);
            IBlock block = factory.CreateBlock(returnOperator);
            accessorDeclaration.SetBody(block);

Основная загвоздка заключалась в том, как же теперь вставить эту проперти в нужный класс? Хорошо из какого то плагина удалось стащить.
        private IClassDeclaration GetClassDeclaration()
        {
            if (provider != null)
            {
                ITreeNode tokenAfterCaret = provider.TokenAfterCaret;
                if (tokenAfterCaret != null)
                {
                    ICSharpExpression expression = tokenAfterCaret.Parent as ICSharpExpression;
                    if (expression == null)
                    {
                        return null;
                    }

                    return expression.GetContainingTypeDeclaration() as IClassDeclaration;
                }
            }

            return null;
        }

А уж догадаться об этой строке уже ни составило никакого труда
classDeclaration.AddClassMemberDeclaration(propertyDeclaration);

А в итоге получилась большая радость — есть "свое, лично созданное" проперти
Кстати, все вставляется без проблем в автоматически сгенерированный плагин. Класс ...Action

Правда радость довольно быстро прошла, как только захотелось вставить эту проперти в какой либо другой класс, которого еще к тому же может и не быть

Как думается, подобной информации явно не хватает в этом разделе (3.2)
PropertyDeclaration
   AccessorDeclaration
      Block
        Текст

А также — как создать отдельные элементы и что как найти для вставки этих элементов.
Отчего бы также не привести несколько "законченных примеров"? Которые можно просто скопировать и вставить.
Также непонятно отсутствие ссылки "следующий" раздел в конце текущего раздела.

Вот еще случайно только что нашел:
Writing plug-ins for ReSharper: Part 1 of Undefined
Writing plug-ins for ReSharper: Part 2 of N
ReSharper 7 Overview for Plugin Developers

Жалко что неизвестно сколько есть частей, да и нет на эти тексты ссылки из раздела "разработка плагинов". И кто знает сколько есть еще полезного в других местах на сайте.
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
Re[2]: Есть ли где нормальное описание для разработки плагинов?
От: AlexNek  
Дата: 09.10.12 19:26
Оценка:
Здравствуйте, DmitriN, Вы писали:

DN>Да, и что касается обратной совместимости: я бы рекомендовал скорее писать под разные версии в разных брэнчах, но чисто теоретически, иметь одну кодовую базу для нескольких версий Решарпера реально, только придется использовать очень много #if-ов, и механизм сборки подработать чтобы все собиралось с правильной версией SDK. В качестве примера есть плагин OpenWrap который так делает.

Короче понятно, не стоит с этим связываться А старые SDK где-то есть?

Остался еще один вопрос, который всегда с надеждой проверяется после выхода очередной версии.
Когда удастся справится с "OutOfMemory exceptions"? Или в 2012 студии уже исправили?
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.