【问题标题】:How do I get the AstNode from some Element, in Dart Analyzer / source-gen?如何在 Dart Analyzer / source-gen 中从某个元素获取 AstNode?
【发布时间】:2019-11-23 15:21:07
【问题描述】:

我正在使用 source_gen 通过 Dart analyzer 解析一些 Dart 文件。

我正在扩展 GeneratorForAnnotation<>,并覆盖方法 FutureOr<String> generateForAnnotatedElement(Element element, ConstantReader annotation, BuildStep buildStep)。 这个方法给了我一个基本元素,我会一直导航到找到其他元素,比如MethodElement

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

AstNode node = methodElement.computeNode();

更详细的:

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();
    }
}

很遗憾,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

我的问题:如何获得AstNode

【问题讨论】:

    标签: dart dart-analyzer


    【解决方案1】:

    知道了:

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

    【讨论】:

    • 您也可以使用analyzer 包中的NodeLocatorNodeLocator2。出于某种原因,它没有导出到 API 文档,但它非常有用。还有一个名为ElementLocator 的对应物则相反:从AstNode 获取Element
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2014-08-05
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多