Dart分析仪源需要处理

时间:2018-11-02 00:05:45

标签: dart

我目前正在使用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个文件中,则会获得所需的所有信息,因此我特别了解如何获取这些文件并将它们处理到上下文中。

2 个答案:

答案 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;
}