簡體   English   中英

Dart分析儀源需要處理

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM