如何从 Dart Analyzer / source-gen 中的某个元素获取 AstNode?

Mar*_*rcG 7 dart dart-analyzer

我正在使用source_genDart 解析一些 Dart 文件analyzer

我正在扩展GeneratorForAnnotation<>和覆盖方法 FutureOr<String> generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep)。此方法为我提供了一个基本元素,我可以导航该元素直到找到其他元素,例如 a MethodElement

一旦我掌握了这个MethodElement,我想详细分析该方法的块。我想要这样的东西:

AstNode node = methodElement.computeNode();
Run Code Online (Sandbox Code Playgroud)

更详细地:

class MyGenerator extends GeneratorForAnnotation<MyAnnotation> {

    @override
    FutureOr<String> generateForAnnotatedElement(
        Element element, ConstantReader annotation, BuildStep buildStep,
    ) {
      if (element is ClassElement)
        for (MethodElement methodElement in element.methods) {
          AstNode node = methodElement.computeNode();
          processMyNode(node);
        }
      else
        throw AssertionError();
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,computeNode已弃用。如果我尝试调用它,我会得到:

NoSuchMethodError: Class 'RestrictedAnalysisContext' has no instance method 'resolveCompilationUnit' with matching arguments.
Receiver: Instance of 'RestrictedAnalysisContext'
Tried calling: resolveCompilationUnit(Instance of 'FileSource', Instance of 'LibraryElementImpl')
Found: resolveCompilationUnit(Source, LibraryElement) => CompilationUnit
Run Code Online (Sandbox Code Playgroud)

我的问题:我怎样才能得到AstNode

Mar*_*rcG 6

知道了:

AstNode getAstNodeFromElement(Element element) {
  AnalysisSession session = element.session;
  ParsedLibraryResult parsedLibResult = session.getParsedLibraryByElement(element.library);
  ElementDeclarationResult elDeclarationResult = parsedLibResult.getElementDeclaration(element);
  return elDeclarationResult.node;
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 [`NodeLocator`](https://github.com/dart-lang/sdk/blob/b8c5ecd5aaecf0a70794d344bfdf5a3064e3bb12/pkg/analyzer/lib/src/dart/ast/utilities.dart#L2444) 或 [`NodeLocator2 `](https://github.com/dart-lang/sdk/blob/b8c5ecd5aaecf0a70794d344bfdf5a3064e3bb12/pkg/analyzer/lib/src/dart/ast/utilities.dart#L2537),来自`analyzer`包。由于某些原因,它没有导出到 API 文档中,但它非常有用。还有一个名为“ElementLocator”的对应项,它执行相反的操作:从“AstNode”获取“Element”。 (2认同)