使用 Roslyn,如何枚举 Visual Basic 文档中的成员(命名空间、类等)详细信息?

2024-03-20

使用 Roslyn,确定 Visual Basic 文档成员的唯一机制似乎是:

var members = SyntaxTree.GetRoot().DescendantNodes().Where(node =>
      node is ClassStatementSyntax ||
      node is FunctionAggregationSyntax ||
      node is IncompleteMemberSyntax ||
      node is MethodBaseSyntax ||
      node is ModuleStatementSyntax ||
      node is NamespaceStatementSyntax ||
      node is PropertyStatementSyntax ||
      node is SubNewStatementSyntax
    );

如何获得会员name, StarLineNumber and EndLineNumber每个成员的?


不仅存在一种获得它的方法:

1)当你尝试时:我不会向所有善良的成员展示这种方式(他们的数量很大并且逻辑是相似的),但只展示其中的一个,例如ClassStatementSyntax:

  • 实现它的名字只是得到ClassStatementSyntax.Identifier.ValueText
  • 要获得起始线,您可以使用Location作为方式之一:
var location = Location.Create(SyntaxTree, ClassStatementSyntax.Identifier.Span);
var startLine = location.GetLineSpan().StartLinePosition.Line;
  • 检索结束行的逻辑看起来像接收开始行的逻辑,但它依赖于相应的结束语句(某种结束语句或 self)

2)更有用的方式——使用SemanticModel获取您想要的数据: 通过这种方式,您将只需要接收语义信息ClassStatementSyntax, ModuleStatementSyntxt and NamespaceStatementSyntax,只需致电即可收到他们的所有成员GetMembers():

...

  SemanticModel semanticModel = // usually it is received from the corresponding compilation
  var typeSyntax = // ClassStatementSyntax, ModuleStatementSyntxt or NamespaceStatementSyntax
  string name = null;
  int startLine;
  int endLine;

  var info = semanticModel.GetSymbolInfo(typeSyntax);
  if (info.Symbol is INamespaceOrTypeSymbol typeSymbol)
  {
      name = typeSymbol.Name; // retrieve Name
      startLine = semanticModel.SyntaxTree.GetLineSpan(typeSymbol.DeclaringSyntaxReferences[0].Span).StartLinePosition.Line; //retrieve start line
      endLine = semanticModel.SyntaxTree.GetLineSpan(typeSymbol.DeclaringSyntaxReferences[0].Span).EndLinePosition.Line; //retrieve end line
      foreach (var item in typeSymbol.GetMembers())
      {
          // do the same logic for retrieving name and lines for all others members without calling GetMembers()
      }
  }
  else if (semanticModel.GetDeclaredSymbol(typeSyntax) is INamespaceOrTypeSymbol typeSymbol2)
  {
      name = typeSymbol2.Name; // retrieve Name
      startLine = semanticModel.SyntaxTree.GetLineSpan(typeSymbol2.DeclaringSyntaxReferences[0].Span).StartLinePosition.Line; //retrieve start line
      endLine = semanticModel.SyntaxTree.GetLineSpan(typeSymbol2.DeclaringSyntaxReferences[0].Span).EndLinePosition.Line; //retrieve end line

      foreach (var item in typeSymbol2.GetMembers())
      {
          // do the same logic for retrieving name and lines for all others members without calling GetMembers()
      }
  }

但请注意,当您有部分声明时,您的DeclaringSyntaxReferences会有几个项目,所以你需要过滤SyntaxReference按你当前的SyntaxTree

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Roslyn,如何枚举 Visual Basic 文档中的成员(命名空间、类等)详细信息? 的相关文章

随机推荐

  • Git 和 Visual Studio 项目参考

    好吧 我的问题的简短版本是 当您的项目在多个解决方案之间共享时 在 Git 中处理项目引用的最佳方法是什么 我的 Git 存储库应该如何组织 长版本是 我们是一个小型开发团队 5 名开发人员 目前我们使用 TFS 作为我们的源代码控制和构建
  • 当页面的数据上下文用于其他绑定时,如何绑定到 WPF 依赖属性?

    当页面的数据上下文用于其他绑定时 如何绑定到 WPF 依赖属性 简单的问题 需要设置元素的数据上下文 XAML
  • UITableView 自动尺寸无法正常工作

    我有一个表格视图 其中填充了来自 Firebase 的数据 但是 当使用自动尺寸调整表格视图大小时 某些文本会被截断 这是我的故事板 约束设置为顶部 底部 右侧和左侧 当没有大量文本时 它工作正常 如此处所示 但是 当我用大量文本填充单元格
  • 谷歌地图 API v3 - 最近的街景

    当某个地点无法使用街景时 我想找到最近的有街景的地点 我能想到的唯一办法就是 radius 0 noOfPoints 3 while radius lt 10 miles radius radius 0 2 miles points cal
  • Prism,用Unity连接Views和ViewModels,试图理解它

    使用 Unity 创建视图和视图模型 使用 Unity 作为依赖项注入容器类似于使用 MEF 基于属性的注入和基于构造函数的注入都是 支持的 主要区别在于这些类型通常是 在运行时没有隐式发现 相反 他们必须是 已向容器注册 通常 您在视图模
  • 如何让 QFileDialog 选择并返回多个文件夹[重复]

    这个问题在这里已经有答案了 我希望用户能够选择多个文件夹 然后将这些文件夹的路径存储在列表中 我怎样才能做到这一点 我当前的 QFileDialog 如下所示 str QtGui QFileDialog getExistingDirecto
  • C++ CLI 集合初始值设定项语法

    C CLI 支持此功能吗 我想在 C CLI 中执行类似以下 C 示例的操作 var dictionary new Dictionary
  • 适用于 Java 的最佳 CLI 解析器 [重复]

    这个问题在这里已经有答案了 哪种 Java CLI 解析器比其他解析器更易于使用且可扩展性更好 以下是一些最受欢迎的 它们的功能都很齐全 使用过前两个后我可以推荐它们 公共命令行界面 http commons apache org cli
  • 使用 FOS 用户捆绑包编辑用户配置文件

    我将 symfony 2 与 FOSUserBundle 一起使用 问题是当添加用户时 当前登录的用户配置文件将被当前添加的用户替换 然后当我尝试编辑其他用户配置文件时 唯一可编辑的是当前登录的用户配置文件用户 FOSUserBundle
  • 如何在数据库中存储目录/层次/树结构?

    如何在数据库中存储目录 层次结构 树结构 即MSSQL服务器 olavk 看起来你没有看到我自己的答案 我使用的方式比递归查询好得多 p p s This is http www developerfusion co uk show 463
  • 一次附加多个 pandas 数据框[重复]

    这个问题在这里已经有答案了 我试图找到某种方法一次附加多个 pandas 数据帧 而不是使用它们一一附加 df append df 假设有 5 个 pandas 数据框t1 t2 t3 t4 t5 我如何立即附加它们 相当于 df rbin
  • 您需要从工作树的顶层运行此命令

    我正在尝试安装多蒂斯尼普斯 http www vim org scripts script php script id 2715 当我输入 cd vim git submodule add https github com SirVer u
  • 在 Windows 中生成随机文件

    有谁有办法在 Windows 中生成随机数据文件吗 我想生成 50 000 个小 2K 文件作为示例 您可以在批处理循环中运行 fsutil 以创建任意大小的文件 fsutil file createnew filename extensi
  • 如何找到所有未选中的复选框?

    在 jQuery 中 如何找到所有 未选中 的复选框 checkbox checked 似乎我所有的复选框都是选中的 但我需要的是所有未选中的复选框 您使用 not http docs jquery com Selectors not se
  • 如何在 Node JS 中编写非阻塞 if 语句?

    我在 php 中有一个 if 语句 if isTrue db record exists id else 第一个条件是真 假布尔检查 第二个条件调用一个函数来查看数据库表中是否存在一行并返回 true 或 false 我想在 Node JS
  • “exec:”python“:在$ PATH中找不到可执行文件

    我在跑步Arduino 集成开发环境 1 8 12 on Ubuntu 18 04 4 LTS 我正在尝试编译 ESP32 相机模块的示例代码 Arduino IDE 上带有默认示例的标准相机模块 但出现此错误 我认为这不是 Arduino
  • 在 C# 中将字符串转换为泛型类型(基本类型或数组)

    我想将字符串转换为给定的泛型类型T 它可以是基本类型或字符串 例如int or string 或基本类型或字符串的数组 例如int or string 我有以下功能 T Str2Val
  • 使用 PHP 中的 REST API 在 SalesForce 中创建潜在客户

    在过去的几天里 我一直在尝试通过 SalesForce 的 REST API 创建潜在客户 但我一生都无法让它发挥作用 我能够毫无问题地获得访问令牌 但从那时起 就创建潜在客户而言 我绝对没有运气 我在所有文档中不断看到 curl http
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 Roslyn,如何枚举 Visual Basic 文档中的成员(命名空间、类等)详细信息?

    使用 Roslyn 确定 Visual Basic 文档成员的唯一机制似乎是 var members SyntaxTree GetRoot DescendantNodes Where node gt node is ClassStateme