我想为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,以及整个班级的文件名/行号范围?
我应该自己玩这个,但我很欣赏你已经知道的东西。
答案 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树,并检查文档中的坐标以获取特定表达式/语句