【问题标题】:Best way to extract all solution symbols with Roslyn使用 Roslyn 提取所有解决方案符号的最佳方法
【发布时间】:2016-03-04 06:18:53
【问题描述】:

我们过去开发了一个基于 codedom 的代码生成工具,用于为我们的解决方案自动生成一些代码。解决方案是解析完整的代码树以存储我们工具所需的自定义信息,但我总是发现它与 VS 已经在后台所做的完全重复。随着 Roslyn 的引入,我期望有一种更好的方法从编译器中提取符号定义,允许我直接查询解决方案符号表,而无需我存储自定义数据以满足我们的需求。无论如何我们都不需要更改代码,我们只需要读取对象定义,如类、特定方法、元数据等。

我的问题是,阅读这些符号需要什么?我是否需要再次解析所有项目/文档以查找这些符号,还是有一个 API 可以让我提取这些符号?

【问题讨论】:

  • 你是写VS扩展还是独立工具?您正在寻找 Roslyn 的 SemanticModel
  • 我正在编写一个 VS 扩展是的,据我所知,它仍然需要遍历所有语法树并获取所有语义模型。我希望 Roslyn(或 VisualStudio Workspace)是否已经有一些 API 可以轻松访问这些信息。
  • 您需要所有个符号吗?还是您需要找到某些类型的符号? (在您提到的评论中,您正在寻找派生类型作为示例)。是否还需要分析参数符号和局部变量?
  • 我将需要其中的大部分(1000 多个定义)我们的生成器会自动执行一些前端开发,我们生成公开的服务、值对象定义等。当我们保存文件时,我们会检查哪种类型我们使用 T4 模板保存并生成相应客户端代码的对象。
  • 所以不确定它是否已经回答,但是是的,VS 工作区已经可以为您提供符号 l 信息。正如@SLaks 所观察到的那样,这只是您以这种方式获取编译和行走符号的问题,或者如果这适合您的场景,则可以成为分析器。

标签: .net code-generation roslyn


【解决方案1】:

您可以注册一个基于符号的操作(使用AnalysisContext.RegisterSymbolAction),每当分析符号时都会调用该操作。但是因为您不只是想要单个符号,所以注册编译开始操作可能会更好,它会在内部注册一个符号操作。这样,在编译结束操作中,您将拥有属于整个项目的所有符号信息。

【讨论】:

  • 所以,我明白了,它取决于项目的编译过程,并且在加载项目时将不可用,除非我从源代码手动构建一个编译单元,对吧?
  • 您不必手动构建。在 VS 内部,诊断分析器会自动执行。所以当项目被加载时,分析器被触发。查看例如 this 介绍教程以获取更多信息。
  • 我需要试试这个。所以我假设一旦我们更改符号定义,分析器处理程序就会被调用
【解决方案2】:

您正在寻找SymbolFinder class,您可以使用它来查找对(MEF 导入的)VisualStudioWorkspace 中每个项目的 SemanticModel 中的符号的所有引用。

【讨论】:

  • 谢谢,但我认为我没有表达清楚(英语不是我的主要语言)。我正在寻找的是获取所有特定符号(例如:扩展 BaseClass 或具有特定元数据的所有类),而不是来自特定符号的引用。
  • @JoãoFernandes:扩展基类的类只是一种特定的引用。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多