| Index: pkg/front_end/lib/src/incremental/file_state.dart
|
| diff --git a/pkg/front_end/lib/src/incremental/file_state.dart b/pkg/front_end/lib/src/incremental/file_state.dart
|
| deleted file mode 100644
|
| index fec7c17940977ef7b681a9df3f08231f8a15ab41..0000000000000000000000000000000000000000
|
| --- a/pkg/front_end/lib/src/incremental/file_state.dart
|
| +++ /dev/null
|
| @@ -1,225 +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 'dart:convert';
|
| -import 'dart:typed_data';
|
| -
|
| -import 'package:front_end/file_system.dart';
|
| -import 'package:front_end/src/fasta/parser/top_level_parser.dart';
|
| -import 'package:front_end/src/fasta/scanner.dart';
|
| -import 'package:front_end/src/fasta/source/directive_listener.dart';
|
| -import 'package:front_end/src/fasta/translate_uri.dart';
|
| -
|
| -/// Information about a file being compiled, explicitly or implicitly.
|
| -///
|
| -/// It provides a consistent view on its properties.
|
| -///
|
| -/// The properties are not guaranteed to represent the most recent state
|
| -/// of the file system. To update the file to the most recent state, [refresh]
|
| -/// should be called.
|
| -class FileState {
|
| - final FileSystemState _fsState;
|
| -
|
| - /// The resolved URI of the file in the file system.
|
| - final Uri fileUri;
|
| -
|
| - bool _exists;
|
| - List<int> _contentBytes;
|
| - String _content;
|
| -
|
| - List<FileState> _importedFiles;
|
| - List<FileState> _exportedFiles;
|
| - List<FileState> _partFiles;
|
| -
|
| - Set<FileState> _directReferencedFiles = new Set<FileState>();
|
| -
|
| - FileState._(this._fsState, this.fileUri);
|
| -
|
| - /// The content of the file.
|
| - String get content => _content;
|
| -
|
| - /// The content bytes of the file.
|
| - List<int> get contentBytes => _contentBytes;
|
| -
|
| - /// Whether the file exists.
|
| - bool get exists => _exists;
|
| -
|
| - @override
|
| - int get hashCode => fileUri.hashCode;
|
| -
|
| - /// Return the set of transitive files - the file itself and all of the
|
| - /// directly or indirectly referenced files.
|
| - Set<FileState> get transitiveFiles {
|
| - // TODO(scheglov) add caching.
|
| - var transitiveFiles = new Set<FileState>();
|
| -
|
| - void appendReferenced(FileState file) {
|
| - if (transitiveFiles.add(file)) {
|
| - file._directReferencedFiles.forEach(appendReferenced);
|
| - }
|
| - }
|
| -
|
| - appendReferenced(this);
|
| - return transitiveFiles;
|
| - }
|
| -
|
| - @override
|
| - bool operator ==(Object other) {
|
| - return other is FileState && other.fileUri == fileUri;
|
| - }
|
| -
|
| - /// Read the file content and ensure that all of the file properties are
|
| - /// consistent with the read content, including all its dependencies.
|
| - Future<Null> refresh() async {
|
| - // Read the content.
|
| - try {
|
| - FileSystemEntity entry = _fsState.fileSystem.entityForUri(fileUri);
|
| - _contentBytes = await entry.readAsBytes();
|
| - _content = UTF8.decode(_contentBytes);
|
| - _exists = true;
|
| - } catch (_) {
|
| - _contentBytes = new Uint8List(0);
|
| - _content = '';
|
| - _exists = false;
|
| - }
|
| -
|
| - // Parse directives.
|
| - ScannerResult scannerResults = scanString(_content);
|
| - var listener = new DirectiveListener();
|
| - new TopLevelParser(listener).parseUnit(scannerResults.tokens);
|
| -
|
| - // Build the graph.
|
| - _importedFiles = <FileState>[];
|
| - _exportedFiles = <FileState>[];
|
| - _partFiles = <FileState>[];
|
| - await _addFileForRelativeUri(_importedFiles, 'dart:core');
|
| - for (String uri in listener.imports) {
|
| - await _addFileForRelativeUri(_importedFiles, uri);
|
| - }
|
| - for (String uri in listener.exports) {
|
| - await _addFileForRelativeUri(_exportedFiles, uri);
|
| - }
|
| - for (String uri in listener.parts) {
|
| - await _addFileForRelativeUri(_partFiles, uri);
|
| - }
|
| -
|
| - // Compute referenced files.
|
| - _directReferencedFiles = new Set<FileState>()
|
| - ..addAll(_importedFiles)
|
| - ..addAll(_exportedFiles)
|
| - ..addAll(_partFiles);
|
| - }
|
| -
|
| - /// Add the [FileState] for the given [relativeUri] to the [files].
|
| - /// Do nothing if the URI cannot be parsed, cannot correspond any file, etc.
|
| - Future<Null> _addFileForRelativeUri(
|
| - List<FileState> files, String relativeUri) async {
|
| - if (relativeUri.isEmpty) return;
|
| -
|
| - // Resolve the relative URI into absolute.
|
| - // The result is either:
|
| - // 1) The absolute file URI.
|
| - // 2) The absolute non-file URI, e.g. `package:foo/foo.dart`.
|
| - Uri absoluteUri;
|
| - try {
|
| - absoluteUri = fileUri.resolve(relativeUri);
|
| - } on FormatException {
|
| - return;
|
| - }
|
| -
|
| - // Resolve the absolute URI into the absolute file URI.
|
| - Uri resolvedUri = _fsState.uriTranslator.translate(absoluteUri);
|
| - if (resolvedUri == null) return;
|
| -
|
| - FileState file = await _fsState.getFile(resolvedUri);
|
| - files.add(file);
|
| - }
|
| -}
|
| -
|
| -/// Information about known file system state.
|
| -class FileSystemState {
|
| - final FileSystem fileSystem;
|
| - final TranslateUri uriTranslator;
|
| -
|
| - _FileSystemView _fileSystemView;
|
| -
|
| - /// Mapping from file URIs to corresponding [FileState]s.
|
| - final Map<Uri, FileState> _fileUriToFile = {};
|
| -
|
| - FileSystemState(this.fileSystem, this.uriTranslator);
|
| -
|
| - /// Return the [FileSystem] that is backed by this [FileSystemState]. The
|
| - /// files in this [FileSystem] always have the same content as the
|
| - /// corresponding [FileState]s, thus avoiding race conditions when a file
|
| - /// is updated on the actual file system.
|
| - FileSystem get fileSystemView {
|
| - return _fileSystemView ??= new _FileSystemView(this);
|
| - }
|
| -
|
| - /// Return the [FileState] for the given resolved file [fileUri].
|
| - /// The returned file has the last known state since it was last refreshed.
|
| - Future<FileState> getFile(Uri fileUri) async {
|
| - FileState file = _fileUriToFile[fileUri];
|
| - if (file == null) {
|
| - file = new FileState._(this, fileUri);
|
| - _fileUriToFile[fileUri] = file;
|
| -
|
| - // Build the sub-graph of the file.
|
| - await file.refresh();
|
| - }
|
| - return file;
|
| - }
|
| -}
|
| -
|
| -/// [FileSystemState] based implementation of [FileSystem].
|
| -/// It provides a consistent view on the known file system state.
|
| -class _FileSystemView implements FileSystem {
|
| - final FileSystemState fsState;
|
| -
|
| - _FileSystemView(this.fsState);
|
| -
|
| - @override
|
| - FileSystemEntity entityForUri(Uri uri) {
|
| - FileState file = fsState._fileUriToFile[uri];
|
| - return new _FileSystemViewEntry(uri, file);
|
| - }
|
| -}
|
| -
|
| -/// [FileSystemState] based implementation of [FileSystemEntity].
|
| -class _FileSystemViewEntry implements FileSystemEntity {
|
| - @override
|
| - final Uri uri;
|
| -
|
| - final FileState file;
|
| -
|
| - _FileSystemViewEntry(this.uri, this.file);
|
| -
|
| - @override
|
| - Future<bool> exists() async => file?.exists ?? false;
|
| -
|
| - @override
|
| - Future<DateTime> lastModified() async {
|
| - throw new StateError(
|
| - 'FileSystemViewEntry modification stamp should not be queried');
|
| - }
|
| -
|
| - @override
|
| - Future<List<int>> readAsBytes() async {
|
| - _throwIfDoesNotExist();
|
| - return file.contentBytes;
|
| - }
|
| -
|
| - @override
|
| - Future<String> readAsString() async {
|
| - _throwIfDoesNotExist();
|
| - return file.content;
|
| - }
|
| -
|
| - void _throwIfDoesNotExist() {
|
| - if (file == null) {
|
| - throw new FileSystemException(uri, 'File $uri does not exist.');
|
| - }
|
| - }
|
| -}
|
|
|