gpt4 book ai didi

dart - 如何获得 MethodInvocation 的完全限定目标?

转载 作者:行者123 更新时间:2023-12-04 15:31:14 25 4
gpt4 key购买 nike

我正在尝试查找特定方法的用法。在这种情况下,我想找到 foo.go() 的用法/调用,但不是 bar.go() .以下代码将查找 go() 的所有调用在任何类(class)上。在下面的代码中,node.target简单地给我 x这是 var 名称,但我正在努力弄清楚该方法属于哪个类。

测试.dart

void main() {
var x = new Foo();
x.go();

x = new Bar();
x.go();
}

class Foo {
go() {
print('I am foo');
}
}

class Bar {
go() {
print('I am bar');
}
}

分析.dart
import 'package:analyzer/analyzer.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';

void main() {
var targetFile = parseDartFile('test.dart');
var visitor = new UsageVisitor('foo.go');
targetFile.visitChildren(visitor);
}

class UsageVisitor extends UnifyingAstVisitor {
String _class;
String _method;

UsageVisitor(this._class, this._method);

@override
visitMethodInvocation(MethodInvocation node) {
print({
'target' : node.target.toString(), // in both cases, gives "x" -- I need "Foo" and "Bar", respectively
'methodName': node.methodName.toString() // gives "go"
});

return super.visitNode(node);
}
}

我如何区分 foo.go() 之间的差异(在分析器级别)和 bar.go() ?

最佳答案

问题是test.dart正在无上下文解析 需要解析其中包含的元素。

这方面的一个例子包含在 analyzer package within the Dart SDK 中。

将其分解为您拥有的步骤:

1 - 设置解析器

PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
DartSdk sdk = new FolderBasedDartSdk(resourceProvider, resourceProvider.getFolder(args[0]));

var resolvers = [
new DartUriResolver(sdk),
new ResourceUriResolver(resourceProvider)
];

2 - 创建一个 AnalysisContext使用解析器
AnalysisContext context = AnalysisEngine.instance.createAnalysisContext()
..sourceFactory = new SourceFactory(resolvers);

3 - 添加您的 SourceChangeSet
Source source = new FileSource(resourceProvider.getFile(args[1]));
ChangeSet changeSet = new ChangeSet()..addedSource(source);

3.1 - 应用 ChangeSetAnalysisContext
context.applyChanges(changeSet);

3.2 - 获取 LibraryElement
我不确定这是否总是需要的。对于简单的文件,也许可以跳过它。 ¯(◉◡◔)/¯
LibraryElement libElement = context.computeLibraryElement(source);

4 - 解析您的 Source !
CompilationUnit resolvedUnit = context.resolveCompilationUnit(source, libElement);

5 - 运行您的 Visitor
resolvedUnit.accept(visitor)

不幸的是,这不仅仅是调用 parseDartFile() 的更多代码但好消息是您的 Visitor应该无需进一步更改即可工作。

祝你好运!

关于dart - 如何获得 MethodInvocation 的完全限定目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com