[英]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.