【问题标题】:Dart Analyzer: Find instances of a class or its descendantsDart Analyzer:查找类或其后代的实例
【发布时间】:2018-09-19 02:50:33
【问题描述】:

我正在使用build 包获取.dart 文件并查找某个类或其子类的定义。 ClassElement也可以用于子类吗?

我只希望特定类的单个定义在项目的一个文件中,但没有理由客户不能子类化并疯狂。

【问题讨论】:

  • 我认为应该使用allSupertypes 方法。 github.com/dart-lang/source_gen/blob/master/source_gen/lib/src/… 可能会有所帮助。另请参阅它如何在github.com/dart-lang/json_serializable/… 中使用
  • 我对这个问题做了一个建议的编辑——通常当我们谈论类时,“实例”是指使用new NameOfType(); 创建的对象。我认为您在这里寻找的是类“定义”或“子类”。
  • 我实际上是在寻找一个能够调用toString() 的实例。我只是在使用一种解决方法,我给出一个示例用法,人们可以复制它。无需分析仪。

标签: dart dart-analyzer dart-build


【解决方案1】:

没有办法直接抓取所有的子类,但是你可以找到所有的类,并检查每一个是不是你感兴趣的那个的子类。

首先使用BuildStep.inputLibrary 获取要为其生成代码的文件的LibraryElement。从那里找到库中带有var classes = libraryElement.units.expand((cu) => cu.types); 的所有类。然后通过检查您感兴趣的类型的ClassElement 是否在您正在检查的类型的ClassElement.allSupertypes 中来检查每个是否是您感兴趣的类的子类。 var subtypes = classes.where((c) => c.allSupertypes.contains(lookingFor));.

您可能会发现来自source_genLibraryReaderTypeChecker 实用程序很有用。

【讨论】:

  • 如果子类位于不同的库(通常是文件)中怎么办?
  • 我不知道找到它们的有效方法。构建系统(以及分析器在其中的使用)没有“完整程序”的概念,只有通过导入您正在运行的任何文件可访问的代码。您很可能需要运行一个构建器,其主要输入是“入口点”(具有 main()),然后遍历所有传递导入。
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2010-11-12
相关资源
最近更新 更多