Как получить имя файла и номер строки конкретного JetBrains.ReSharper.Psi.IDeclaredElement? - PullRequest
1 голос
/ 28 июля 2011

Я хочу написать тестовое расширение фреймворка для 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 ]

3 голосов
/ 28 июля 2011

Да.

Сущность "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
);

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

0 голосов
/ 29 июля 2011

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

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

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

...