1

我想为 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,以及整个类的文件名/行号范围?

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

4

2 回答 2

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

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

于 2011-07-28T15:08:20.997 回答
0

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

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

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

于 2011-07-29T08:46:20.643 回答