Как получить имя файла и номер строки конкретного JetBrains.ReSharper.Psi.IDeclaredElement?

Я хочу написать тестовый фреймворк для resharper. Документы для этого находятся здесь: http://confluence.jetbrains.net/display/ReSharper/Test+Framework+Support

Одним из аспектов этого является указание, является ли конкретный фрагмент кода частью теста. Кусок кода представлен как IDeclaredElement.

Можно ли получить имя файла и номер строки фрагмента кода, представленного конкретным IDeclaredElement?

Следуя ответу ниже:

@ Евгений, спасибо за ответ, интересно, не могли бы вы уточнить один момент для меня.

Предположим, что у пользователя есть этот тест, открытый в visual studio: https://github.com/fschwiet/DreamNJasmine/blob/master/NJasmine.Tests/SampleTest.cs Предположим, что пользователь щелкает правой кнопкой мыши по строке 48 "player.Resume()"выражение. Скажет ли мне IDeclaredElement, что они хотят работать в строке 48? Или это даст мне IDeclaredElement, соответствующий всему классу, и диапазон имен файлов / строк для всего класса?

Я должен сам поиграть с этим, но я ценю то, что вы уже знаете.

2 ответа

Решение

Да.

Сущность "IDeclaredElement" является символом кода (класс, метод, переменная и т. Д.). Он может быть загружен из метаданных сборки, он может быть объявлен в исходном коде, он может быть неявно взят из исходного кода.

Ты можешь использовать

var declarations = declaredElement.GetDeclarations() 

получить все элементы AST, которые его объявляют (например, это может вернуть несколько объявлений для частичного класса)

Тогда для любого IDeclaration вы можете использовать

var documentRange = declaration.GetDocumentRange()
if (documentRange.IsValid())
  Console.WriteLine ("File: {0} Line:{1}",
 DocumentManager.GetInstance(declaration.GetSolution()).GetProjectFile(documentRange.Document).Name,
documentRange.Document.GetCoordsByOffset(documentRange.TextRange.StartOffset).Line
);

Кстати, какое расширение тестового фреймворка вы разрабатываете?

Скажет ли мне IDeclaredElement, что они хотят работать в строке 48?

Еще раз: IDeclaredElement не имеет позиций в файле. Вместо этого это декларация у них. Для каждого объявления (IDeclaration является обычным узлом AST) в документе есть диапазон, который охватывает его. В моем предыдущем примере я использовал TextRange.StartOffset, хотя вы можете использовать TextRange.EndOffset.

Если вам нужно больше точной позиции в файле, просмотрите дерево AST и проверьте координаты в документе для конкретного выражения / утверждения

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