Mar*_*rcG 7 dart dart-analyzer
我正在使用source_gen
Dart 解析一些 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
?
知道了:
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)