如何获取特定 JetBrains.ReSharper.Psi.IDeclaredElement 的文件名和行号?
Posted
技术标签:
【中文标题】如何获取特定 JetBrains.ReSharper.Psi.IDeclaredElement 的文件名和行号?【英文标题】:How to get the filename and line number of a particular JetBrains.ReSharper.Psi.IDeclaredElement? 【发布时间】:2011-07-28 06:37:01 【问题描述】:我想为 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,以及整个类的文件名/行号范围?
我应该自己玩这个,但我很欣赏你已经知道的东西。
【问题讨论】:
【参考方案1】:是的。
“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
);
顺便问一下,您正在开发哪个测试框架扩展?
【讨论】:
感谢您的回复。框架在这里:github.com/fschwiet/DreamNJasmine. Evgeny 我更新了问题,以寻求有关将返回的内容的更多详细信息。感谢您的帮助。【参考方案2】:IDeclaredElement 是否会具体告诉我他们想要在 第 48 行?
再一次:IDeclaredElement 在文件中没有位置。相反,它的声明拥有它们。 对于每个声明(IDeclaration 是一个常规的 AST 节点),文档中都有一个覆盖它的范围。在我之前的示例中,我使用了 TextRange.StartOffset,但您可以使用 TextRange.EndOffset。
如果需要更精确的文件位置,请遍历AST树,查看文件中具体的表达/语句坐标
【讨论】:
感谢 Evgeny。我不介意 IDeclaredElement 和 GetDeclarations() 返回的对象之间的区别,因为我对整体功能更感兴趣——我是否可以在单击的委托中获取特定元素。听起来这将在 AST 中可用。我专注于行号,但想想这很草率,因为有人可以在同一行上放很多其他东西。无论如何,干杯以上是关于如何获取特定 JetBrains.ReSharper.Psi.IDeclaredElement 的文件名和行号?的主要内容,如果未能解决你的问题,请参考以下文章