[英]Dart Analyzer Sources Needing Processing
我目前正在使用Dart Analyzer包来解析和分析Dart文件。 当前,它主要使用以下代码。
PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
DartSdk sdk = new FolderBasedDartSdk(
resourceProvider, resourceProvider.getFolder('D:\\Dart\\dart-sdk'));
var resolvers = [
new DartUriResolver(sdk),
new ResourceUriResolver(resourceProvider)
];
AnalysisContextImpl context = AnalysisEngine.instance.createAnalysisContext()
..sourceFactory = new SourceFactory(resolvers);
Source source = new FileSource(resourceProvider.getFile(item.path));
ChangeSet changeSet = new ChangeSet()..addedSource(source);
context.applyChanges(changeSet);
LibraryElement libElement = context.computeLibraryElement(source);
CompilationUnit resolvedUnit =
context.resolveCompilationUnit(source, libElement);
var element = resolvedUnit.declaredElement;
但是,如果该元素实现或扩展了不同文件中的类,则该元素不会获取所有信息。 我终于找到了
context.sourcesNeedingProcessing
它显示了从dart文件引用的其他文件,但似乎需要处理。
如果将所有现有的类全部复制到1个文件中,则会获得所需的所有信息,因此我特别了解如何获取这些文件并将它们处理到上下文中。
没有看到您尝试分析的代码,我不确定,但是我怀疑问题是您没有为package:
包括URI解析器package:
URI。 不必将所有需要的文件添加到分析上下文中,您只需要告诉它如何查找从添加的文件中引用的任何文件即可。
不幸的是,为package:
构建一个解析器package:
URI是不平凡的。 您需要创建PackageMapUriResolver
的实例。 反过来,这需要使用package_config
包创建Packages
的实例,然后将其转换为映射(可以在ContextBuilder.convertPackagesToMap
找到这样做的示例)。
也就是说,如果您使用的软件包版本足够新,则可以使用我们正在设计的较新API。 我相信您要执行的操作将通过以下代码实现:
import 'package:analyzer/dart/analysis/analysis_context.dart';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
main() async {
ResolvedUnitResult result = await resolveFile(item.path);
CompilationUnit resolvedUnit = result.unit;
CompilationUnitElement element = resolvedUnit.declaredElement;
}
Future<ResolvedUnitResult> resolveFile(String path) async {
AnalysisContextCollection collection = new AnalysisContextCollection(
includedPaths: <String>[path],
resourceProvider: PhysicalResourceProvider.INSTANCE,
);
AnalysisContext context = collection.contextFor(path);
return await context.currentSession.getResolvedUnit(path);
}
该集合能够完成为您配置上下文的所有工作,从而简化了获取分析结果的过程。
需要注意的几件事。 首先, AnalysisContext
这里引用的是不一样的类作为AnalysisContext
在你的示例代码引用。
其次,如果您要解析多个文件,那么在创建AnalysisContextCollection
时可以传入所有文件路径,则可能会更有效。
我这样添加了PackageMapUriResolver
var resolvers = [
new DartUriResolver(sdk),
new ResourceUriResolver(resourceProvider),
packageResolver(resourceProvider, 'packageName', resourceProvider.getFolder('C:\\folderLocationOfPackage'))
];
然后,在一个单独的文件中,我创建了packageResolver方法。
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/source/package_map_resolver.dart';
PackageMapUriResolver packageResolver(
ResourceProvider provider, String packageName, Folder folder) {
Map<String, List<Folder>> packageMap = new Map<String, List<Folder>>();
packageMap.putIfAbsent(packageName, () => [folder]);
var resolver = new PackageMapUriResolver(provider, packageMap);
return resolver;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.