Как получить имя файла и номер строки конкретного 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 и проверьте координаты в документе для конкретного выражения / утверждения