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

如何获取特定JetBrains.ReSharper.Psi.IDeclaredElement的文件名和行号?,resharper,resharper-plugins,resharper-sdk,Resharper,Resharper Plugins,Resharper Sdk,我想为resharper编写一个测试框架扩展。有关此操作的文档如下所示: 其中一个方面是指示特定代码段是否是测试的一部分。这段代码表示为IDeclaredElement 是否可以获取由特定IDeclaredElement表示的代码段的文件名和行号 对以下答复采取后续行动: @埃夫根尼,谢谢你的回答,我想知道你能否为我澄清一点 假设用户在visual studio中打开了此测试: 假设用户在第48行右键单击“player.Resume()”表达式。 IDeclaredElement会具体告诉我他们

我想为resharper编写一个测试框架扩展。有关此操作的文档如下所示:

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

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

对以下答复采取后续行动:

@埃夫根尼,谢谢你的回答,我想知道你能否为我澄清一点

假设用户在visual studio中打开了此测试: 假设用户在第48行右键单击“player.Resume()”表达式。 IDeclaredElement会具体告诉我他们想在第48行运行吗?或者它会给我一个与整个类对应的IDeclaredElement,以及整个类的文件名/行号范围

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

是的

“IDeclaredElement”实体是代码符号(类、方法、变量等)。它可以从程序集元数据加载,可以在源代码中声明,也可以隐式地来自源代码

你可以用

var declarations = declaredElement.GetDeclarations() 
获取声明它的所有AST元素(例如,这可能会为分部类返回多个声明)

然后,对于任何标识,您都可以使用

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树,并检查文档中的坐标以获得特定的表达式/语句

谢谢您的回复。框架在这里:。Evgeny我更新了问题,寻求关于返回内容的更多细节。谢谢你的帮助,谢谢埃夫根尼。我并不在意IDeclaredElement和GetDeclarations()返回的对象之间的区别,因为我更感兴趣的是整体功能——是否可以在单击的委托中获取特定元素。听起来这将在AST中提供。我把注意力集中在行号上,但考虑到这一点,我觉得这太草率了,因为有人可能会在同一行上放很多其他的东西。无论如何,干杯