如何获取特定JetBrains.ReSharper.Psi.IDeclaredElement的文件名和行号?

时间:2011-07-28 06:37:01

标签: resharper resharper-plugins resharper-sdk

我想为resharper编写一个测试框架扩展。这方面的文档在这里:http://confluence.jetbrains.net/display/ReSharper/Test+Framework+Support

这方面的一个方面是指示特定代码段是否是测试的一部分。这段代码表示为IDeclaredElement。

是否可以获取由特定IDeclaredElement表示的一段代码的文件名和行号?

跟进以下回复:

@Evgeny,谢谢你的回答,我想知道你是否可以为我澄清一点。

假设用户在visual studio中打开了此测试:https://github.com/fschwiet/DreamNJasmine/blob/master/NJasmine.Tests/SampleTest.cs 假设用户右键单击第48行,即“player.Resume()”表达式。 IDeclaredElement会告诉我他们想要在第48行运行吗?或者它是否会给我一个与整个班级相对应的IDeclaredElement,以及整个班级的文件名/行号范围?

我应该自己玩这个,但我很欣赏你已经知道的东西。

2 个答案:

答案 0 :(得分:3)

“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
);

顺便说一句,您正在开发哪个测试框架扩展?

答案 1 :(得分:0)

  

IDeclaredElement会告诉我具体他们想要运行吗?   第48行?

再一次:IDeclaredElement在文件中没有位置。相反,它的声明有它们。 对于每个声明(IDeclaration是常规AST节点),文档中都有覆盖它的范围。在我之前的示例中,我使用了TextRange.StartOffset,但您可以使用TextRange.EndOffset。

如果您需要更多文件中的prcise位置,请遍历AST树,并检查文档中的坐标以获取特定表达式/语句