Resharper API для выделенного текста и удаленной генерации кода

Я хотел бы написать плагин Resharper, который позволит мне генерировать код в другом классе на основе выделенного текста, и API не самый прозрачный. На какие методы мне следует обратить внимание, чтобы получить доступ к выделенному тексту и к генерации кода вне текущего класса?

1 ответ

Решение

Когда вы пишете действие контекста или что-то в этом роде (прочитайте здесь http://confluence.jetbrains.net/display/ReSharper/ReSharper+7+Plugin+Development о действиях и действиях контекста), вы получаете экземпляр IDataContext. Возьмите текстовый элемент управления, документ и выделение из него следующим образом:

var textControl = context.GetData(TextControl.DataContext.DataConstants.TEXT_CONTROL);
var document = textControl.Document;
var solution = projectFile.GetSolution();
TextRange selection = textControl.Selection.OneDocRangeWithCaret();

Используйте document.GetText, чтобы получить текст для диапазона выбора.

Чтобы сгенерировать код за пределами вашего текущего класса, вам нужно найти объявленный элемент другого класса. Для этого вам нужно использовать IDeclarationsCache, см. Http://confluence.jetbrains.net/display/ReSharper/4.01+Caches+%28R7%29 об этом. Когда вы получите объявленный элемент, используйте метод GetDeclarations() для получения доступа ко всем объявлениям вашего класса (может быть несколько объявлений из-за частичных классов) и приведите его к IClassLikeDeclaration. Используйте метод AddClassMemberDeclaration для добавления членов и RemoveClassMemberDeclaration для удаления. При добавлении члена класса используйте фабрику элементов для создания добавленного элемента (см. http://confluence.jetbrains.net/display/ReSharper/3.2+Creating+Code+Elements+%28R7%29).

Не стесняйтесь обращаться ко мне, если у вас есть дополнительные вопросы.

Другие вопросы по тегам