我目前正在使用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个文件中,则会获得所需的所有信息,因此我特别了解如何获取这些文件并将它们处理到上下文中。
答案 0 :(得分:3)
我不确定您没有尝试分析的代码,但我怀疑问题是您没有为package:
URI包括URI解析器。不必将所有需要的文件添加到分析上下文中,您只需要告诉它如何查找从添加的文件中引用的任何文件即可。
不幸的是,为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
时可以传递所有文件路径,这样可能会更有效率。
答案 1 :(得分:1)
我这样添加了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;
}