如何在Flutter/Dart中使用SimpleElementVisitor获取接口和方法体?

vsmadaxz  于 2023-11-14  发布在  Flutter
关注(0)|答案(1)|浏览(119)

我正在为我的Flutter项目做一些代码生成。我基本上想用source_gen重建一个完整的类。我使用SimpleElementVisitor来获取大部分数据。我没有问题获取字段,字段类型,方法名称和类名。
这就是我如何得到我的类名称:

@override
  void visitConstructorElement(ConstructorElement element) {
    final returnType = element.returnType.toString();
    className = returnType.replaceFirst('*', ''); 
  }

字符串
我想我可以得到我的第一个接口名称,例如像这样。

@override
  void visitClassElement(ClassElement element) {
    firstInterfaceName = element.interfaces.first;
  }


但不知何故,visitClassElement函数根本没有被访问,我觉得。甚至打印语句也没有执行。其他函数工作正常。
另外,我如何才能得到一个方法体?请不要只是张贴任何ChatGPT的答案。我已经尝试过了。提前感谢!

h43kikqp

h43kikqp1#

您的visitClassElement方法不起作用,因为在ElementVisitor应该覆盖的元素列表中没有一个ClassElement。但是有一些方法、字段和构造函数会触发对应的方法visitMethodElementvisitFieldElementvisitConstructorElement
但是如果你让你的ElementVisitor覆盖VisitationUnitElement的子元素,你可以从buildStep中获取,那么在它的子元素中有一个ClassElement,它肯定会被调用visitClassElement方法。下面是一个代码示例,它将允许调用visitClassElement方法-

@override
FutureOr<void> build(BuildStep buildStep) async {
  var visitor = ModelVisitor();
  final LibraryElement library = await buildStep.resolver.libraryFor(buildStep.inputId, allowSyntaxErrors: true);

  List<CompilationUnitElement> units = library.units;
  for (var unit in units) {
    unit.visitChildren(visitor);
  }
}

字符串

相关问题