| Index: pkg/front_end/lib/src/incremental_resolved_ast_generator_impl.dart
|
| diff --git a/pkg/front_end/lib/src/incremental_resolved_ast_generator_impl.dart b/pkg/front_end/lib/src/incremental_resolved_ast_generator_impl.dart
|
| deleted file mode 100644
|
| index 095c30871289a2e61b23a92e32ae31430e2981c6..0000000000000000000000000000000000000000
|
| --- a/pkg/front_end/lib/src/incremental_resolved_ast_generator_impl.dart
|
| +++ /dev/null
|
| @@ -1,303 +0,0 @@
|
| -// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -import 'dart:async';
|
| -
|
| -import 'package:analyzer/dart/ast/ast.dart';
|
| -import 'package:analyzer/file_system/file_system.dart';
|
| -import 'package:analyzer/src/context/context.dart';
|
| -import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
|
| -import 'package:analyzer/src/dart/analysis/file_state.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| -import 'package:analyzer/src/generated/sdk.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -import 'package:analyzer/src/summary/idl.dart';
|
| -import 'package:analyzer/src/util/absolute_path.dart';
|
| -import 'package:front_end/incremental_resolved_ast_generator.dart';
|
| -import 'package:front_end/src/base/file_repository.dart';
|
| -import 'package:front_end/src/base/performace_logger.dart';
|
| -import 'package:front_end/src/base/processed_options.dart';
|
| -import 'package:front_end/src/base/resolve_relative_uri.dart';
|
| -import 'package:front_end/src/base/source.dart';
|
| -import 'package:front_end/src/dependency_grapher_impl.dart';
|
| -import 'package:front_end/src/incremental/byte_store.dart';
|
| -import 'package:path/src/context.dart';
|
| -
|
| -dynamic unimplemented() {
|
| - // TODO(paulberry): get rid of this.
|
| - throw new UnimplementedError();
|
| -}
|
| -
|
| -/// Implementation of [IncrementalKernelGenerator].
|
| -///
|
| -/// Theory of operation: this class is a thin wrapper around
|
| -/// [driver.AnalysisDriver]. When the client requests a new delta, we forward
|
| -/// the request to the analysis driver. When the client calls an invalidate
|
| -/// method, we ensure that the proper files will be re-read next time a delta is
|
| -/// requested.
|
| -///
|
| -/// Note that the analysis driver expects to be able to read file contents
|
| -/// synchronously based on filesystem path rather than asynchronously based on
|
| -/// URI, so the file contents are first read into memory using the asynchronous
|
| -/// FileSystem API, and then these are fed into the analysis driver using a
|
| -/// proxy implementation of [ResourceProvider]. TODO(paulberry): make this (and
|
| -/// other proxies in this file) unnecessary.
|
| -class IncrementalResolvedAstGeneratorImpl
|
| - implements IncrementalResolvedAstGenerator {
|
| - driver.AnalysisDriverScheduler _scheduler;
|
| - final _fileRepository = new FileRepository();
|
| - _ResourceProviderProxy _resourceProvider;
|
| - driver.AnalysisDriver _driver;
|
| - bool _isInitialized = false;
|
| - final ProcessedOptions _options;
|
| - final Uri _source;
|
| - bool _schedulerStarted = false;
|
| - final _fileState = <Uri, String>{};
|
| -
|
| - IncrementalResolvedAstGeneratorImpl(this._source, this._options);
|
| -
|
| - @override
|
| - Future<DeltaLibraries> computeDelta() async {
|
| - if (!_isInitialized) {
|
| - await init();
|
| - }
|
| - // The analysis driver doesn't currently support an asynchronous file API,
|
| - // so we have to find all the files first to read their contents.
|
| - // TODO(paulberry): this is an unnecessary source of duplicate work and
|
| - // should be eliminated ASAP.
|
| - var graph =
|
| - await graphForProgram([_source], _options, fileReader: _fileReader);
|
| - // TODO(paulberry): collect no-longer-referenced files from _fileState and
|
| - // _fileRepository.
|
| - var libraries = <Uri, Map<Uri, CompilationUnit>>{};
|
| - if (!_schedulerStarted) {
|
| - _scheduler.start();
|
| - _schedulerStarted = true;
|
| - }
|
| - for (var libraryCycle in graph.topologicallySortedCycles) {
|
| - for (var libraryUri in libraryCycle.libraries.keys) {
|
| - var libraryNode = libraryCycle.libraries[libraryUri];
|
| - for (var partUri in libraryNode.parts) {
|
| - // TODO(paulberry): resolve the part URI.
|
| - _fileReader(partUri, partUri);
|
| - }
|
| - }
|
| - for (var libraryUri in libraryCycle.libraries.keys) {
|
| - var libraryNode = libraryCycle.libraries[libraryUri];
|
| - var result =
|
| - await _driver.getResult(_fileRepository.pathForUri(libraryUri));
|
| - // TODO(paulberry): handle errors.
|
| - var units = {libraryUri: result.unit};
|
| - for (var partUri in libraryNode.parts) {
|
| - // Really we ought to have a driver API that lets us request a
|
| - // specific part of a given library. Otherwise we will run into
|
| - // problems if a part is included in multiple libraries.
|
| - // TODO(paulberry): address this.
|
| - var partResult =
|
| - await _driver.getResult(_fileRepository.pathForUri(partUri));
|
| - // TODO(paulberry): handle errors.
|
| - units[partUri] = partResult.unit;
|
| - }
|
| - libraries[libraryUri] = units;
|
| - }
|
| - }
|
| - _driver.addFile(_fileRepository.pathForUri(_source));
|
| - // TODO(paulberry): stop the scheduler
|
| - return new DeltaLibraries(libraries);
|
| - }
|
| -
|
| - Future<Null> init() async {
|
| - // TODO(paulberry): can we just use null?
|
| - var performanceLog = new PerformanceLog(new _NullStringSink());
|
| - _scheduler = new driver.AnalysisDriverScheduler(performanceLog);
|
| - _resourceProvider = new _ResourceProviderProxy(_fileRepository);
|
| - // TODO(paulberry): MemoryByteStore leaks memory (it never discards data).
|
| - // Do something better here.
|
| - var byteStore = new MemoryByteStore();
|
| - // TODO(paulberry): can we just use null?
|
| - var fileContentOverlay = new FileContentOverlay();
|
| - var sdkContext = new AnalysisContextImpl();
|
| - var sdkBundle = await _options.getSdkSummary();
|
| - var dartSdk = new _DartSdkProxy(sdkBundle, sdkContext, _fileRepository);
|
| - sdkContext.sourceFactory =
|
| - new SourceFactory([new DartUriResolver(dartSdk)]);
|
| -
|
| - var sourceFactory = new _SourceFactoryProxy(dartSdk, _fileRepository);
|
| - var analysisOptions = new AnalysisOptionsImpl();
|
| - _driver = new driver.AnalysisDriver(
|
| - _scheduler,
|
| - performanceLog,
|
| - _resourceProvider,
|
| - byteStore,
|
| - fileContentOverlay,
|
| - null,
|
| - sourceFactory,
|
| - analysisOptions,
|
| - sdkBundle: sdkBundle);
|
| - _isInitialized = true;
|
| - }
|
| -
|
| - @override
|
| - void invalidate(String path) {
|
| - throw new UnimplementedError();
|
| - }
|
| -
|
| - @override
|
| - void invalidateAll() {
|
| - _fileState.clear();
|
| - _fileRepository.clearContents();
|
| - // TODO(paulberry): verify that this has an effect (requires a multi-file
|
| - // test).
|
| - if (_isInitialized) {
|
| - _driver.knownFiles.forEach(_driver.changeFile);
|
| - }
|
| - }
|
| -
|
| - Future<String> _fileReader(Uri originalUri, Uri resolvedUri) async {
|
| - String contents = _fileState[resolvedUri] ??=
|
| - await _options.fileSystem.entityForUri(resolvedUri).readAsString();
|
| - _fileRepository.store(originalUri, contents);
|
| - return contents;
|
| - }
|
| -}
|
| -
|
| -class _DartSdkProxy implements DartSdk {
|
| - final PackageBundle summary;
|
| -
|
| - final AnalysisContext context;
|
| -
|
| - final FileRepository _fileRepository;
|
| -
|
| - _DartSdkProxy(this.summary, this.context, this._fileRepository);
|
| -
|
| - @override
|
| - PackageBundle getLinkedBundle() => summary;
|
| -
|
| - @override
|
| - Source mapDartUri(String uriString) {
|
| - var uri = Uri.parse(uriString);
|
| - return new _SourceProxy(
|
| - uri, _fileRepository.pathForUri(uri, allocate: true));
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => unimplemented();
|
| -}
|
| -
|
| -class _FileProxy implements File {
|
| - final _SourceProxy _source;
|
| -
|
| - final _ResourceProviderProxy _resourceProvider;
|
| -
|
| - _FileProxy(this._source, this._resourceProvider);
|
| -
|
| - @override
|
| - String get path => _source.fullName;
|
| -
|
| - @override
|
| - String get shortName => path;
|
| -
|
| - @override
|
| - Source createSource([Uri uri]) {
|
| - assert(uri == null);
|
| - return _source;
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => unimplemented();
|
| -
|
| - @override
|
| - String readAsStringSync() {
|
| - return _resourceProvider._fileRepository.contentsForPath(path);
|
| - }
|
| -}
|
| -
|
| -/// A string sink that ignores everything written to it.
|
| -class _NullStringSink implements StringSink {
|
| - void write(Object obj) {}
|
| - void writeAll(Iterable objects, [String separator = ""]) {}
|
| - void writeCharCode(int charCode) {}
|
| - void writeln([Object obj = ""]) {}
|
| -}
|
| -
|
| -class _ResourceProviderProxy implements ResourceProvider {
|
| - final FileRepository _fileRepository;
|
| -
|
| - _ResourceProviderProxy(this._fileRepository);
|
| -
|
| - @override
|
| - AbsolutePathContext get absolutePathContext => throw new UnimplementedError();
|
| -
|
| - @override
|
| - Context get pathContext => throw new UnimplementedError();
|
| -
|
| - @override
|
| - File getFile(String path) {
|
| - return new _FileProxy(
|
| - new _SourceProxy(_fileRepository.uriForPath(path), path), this);
|
| - }
|
| -
|
| - @override
|
| - Folder getFolder(String path) => throw new UnimplementedError();
|
| -
|
| - @override
|
| - Future<List<int>> getModificationTimes(List<Source> sources) =>
|
| - throw new UnimplementedError();
|
| -
|
| - @override
|
| - Resource getResource(String path) => throw new UnimplementedError();
|
| -
|
| - @override
|
| - Folder getStateLocation(String pluginId) => throw new UnimplementedError();
|
| -}
|
| -
|
| -class _SourceFactoryProxy implements SourceFactory {
|
| - @override
|
| - final DartSdk dartSdk;
|
| -
|
| - final FileRepository _fileRepository;
|
| -
|
| - @override
|
| - AnalysisContext context;
|
| -
|
| - _SourceFactoryProxy(this.dartSdk, this._fileRepository);
|
| -
|
| - @override
|
| - SourceFactory clone() => new _SourceFactoryProxy(dartSdk, _fileRepository);
|
| -
|
| - @override
|
| - Source forUri(String absoluteUri) {
|
| - Uri uri = Uri.parse(absoluteUri);
|
| - return forUri2(uri);
|
| - }
|
| -
|
| - @override
|
| - Source forUri2(Uri absoluteUri) {
|
| - return new _SourceProxy(
|
| - absoluteUri, _fileRepository.pathForUri(absoluteUri, allocate: true));
|
| - }
|
| -
|
| - noSuchMethod(Invocation invocation) => unimplemented();
|
| -
|
| - Source resolveUri(Source containingSource, String containedUri) {
|
| - // TODO(paulberry): re-use code from dependency_grapher_impl, and support
|
| - // SDK URI resolution logic.
|
| - String absoluteUri =
|
| - resolveRelativeUri(containingSource?.uri, Uri.parse(containedUri))
|
| - .toString();
|
| - return forUri(absoluteUri);
|
| - }
|
| -
|
| - @override
|
| - Uri restoreUri(Source source) => source.uri;
|
| -}
|
| -
|
| -class _SourceProxy extends BasicSource {
|
| - @override
|
| - final String fullName;
|
| -
|
| - _SourceProxy(Uri uri, this.fullName) : super(uri);
|
| -
|
| - int get modificationStamp => 0;
|
| -
|
| - noSuchMethod(Invocation invocation) => unimplemented();
|
| -}
|
|
|