访问VS语言服务(Visual Studio Extensibility)中的其他文件



我正在编写自定义语言服务,如中所述https://msdn.microsoft.com/en-us/library/bb166533.aspx

现在我正在为 AuthoringScope 编写代码 (https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.authoringscope.aspx) 我的问题出在 GetDeclarations 方法中。

我可以通过 ParseRequest.Text 属性访问当前文件的文本。它允许我列出文件中的所有方法和变量,但我如何访问其他文件内容?我需要访问其他文件内容以构建此文件的 AST 树,但我不知道该怎么做。

就我个人而言,我发现 MPF"助手"类(如 AuthoringScope)有点限制,并且手动实现所有内容(我承认,这确实需要更多时间,但最终要灵活得多)。

无论如何,听起来您的语言(像大多数语言一样!)在语义解析级别具有文件之间的依赖关系。这意味着您必须:

a) 一直重新解析大量文本,这在大型项目中
可能太慢了或 b) 维护项目文件的全局聚合解析,并在文件(或项目属性)更改时动态更新它

b)显然要困难得多,但几乎可以肯定是最好的方法。一般的大纲是在通过 EnvDTE 打开解决方案后发现所有项目,解析所有项目(发现每个项目中的所有文件,再次通过 EnvDTE),并将所有内容存储在某种可索引的数据结构中,以便您可以对其进行快速查询(对于语义语法突出显示,请转到定义等)。然后,您需要侦听所有位置的更改并适当地重新解析 - 您需要检查解决方案的打开/关闭(IVsSolutionEvents),正在添加/删除/重命名/卸载/加载的项目(IVsSolutionEvents/IVsSolutionEvents4),正在添加/删除/重命名的文件(IVsHierarchyEvents),正在编辑的文件(IVsTextViewCreationListener + ITextBuffer.Changed)和项目配置更改(IVsUpdateSolutionEventsIVsHierarchyEvents)。

无论您选择 a) 还是 b),您仍然需要能够检查文件是否在编辑器中打开(可能具有未保存的更改)。您可以通过 IVsRunningDocumentTable 服务检查文件是否已在运行文档表中打开(但不要忘记先使用 Path.GetFullPath() 规范化路径),这将返回文档数据的IntPtr,可以诱使该文件生成文件ITextBuffer,其中包含文件的文本(和整个缓冲区历史记录!当然,如果它没有打开,你必须从磁盘上读取它。

最新更新