| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:typed_data'; | 6 import 'dart:typed_data'; |
| 7 | 7 |
| 8 import 'package:convert/convert.dart'; | 8 import 'package:convert/convert.dart'; |
| 9 import 'package:crypto/crypto.dart'; | 9 import 'package:crypto/crypto.dart'; |
| 10 import 'package:front_end/file_system.dart'; | 10 import 'package:front_end/file_system.dart'; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 bool _hasMixinApplication; | 42 bool _hasMixinApplication; |
| 43 List<int> _apiSignature; | 43 List<int> _apiSignature; |
| 44 | 44 |
| 45 List<NamespaceExport> _exports; | 45 List<NamespaceExport> _exports; |
| 46 List<FileState> _importedLibraries; | 46 List<FileState> _importedLibraries; |
| 47 List<FileState> _exportedLibraries; | 47 List<FileState> _exportedLibraries; |
| 48 List<FileState> _partFiles; | 48 List<FileState> _partFiles; |
| 49 | 49 |
| 50 Set<FileState> _directReferencedFiles = new Set<FileState>(); | 50 Set<FileState> _directReferencedFiles = new Set<FileState>(); |
| 51 List<FileState> _directReferencedLibraries = <FileState>[]; | 51 List<FileState> _directReferencedLibraries = <FileState>[]; |
| 52 Set<FileState> _transitiveFiles; |
| 52 | 53 |
| 53 /// This flag is set to `true` during the mark phase of garbage collection | 54 /// This flag is set to `true` during the mark phase of garbage collection |
| 54 /// and set back to `false` for survived instances. | 55 /// and set back to `false` for survived instances. |
| 55 bool _gcMarked = false; | 56 bool _gcMarked = false; |
| 56 | 57 |
| 57 FileState._(this._fsState, this.uri, this.fileUri); | 58 FileState._(this._fsState, this.uri, this.fileUri); |
| 58 | 59 |
| 59 /// The MD5 signature of the file API as a byte array. | 60 /// The MD5 signature of the file API as a byte array. |
| 60 /// It depends on all non-comment tokens outside the block bodies. | 61 /// It depends on all non-comment tokens outside the block bodies. |
| 61 List<int> get apiSignature => _apiSignature; | 62 List<int> get apiSignature => _apiSignature; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 /// Return topologically sorted cycles of dependencies for this library. | 100 /// Return topologically sorted cycles of dependencies for this library. |
| 100 List<LibraryCycle> get topologicalOrder { | 101 List<LibraryCycle> get topologicalOrder { |
| 101 var libraryWalker = new _LibraryWalker(); | 102 var libraryWalker = new _LibraryWalker(); |
| 102 libraryWalker.walk(libraryWalker.getNode(this)); | 103 libraryWalker.walk(libraryWalker.getNode(this)); |
| 103 return libraryWalker.topologicallySortedCycles; | 104 return libraryWalker.topologicallySortedCycles; |
| 104 } | 105 } |
| 105 | 106 |
| 106 /// Return the set of transitive files - the file itself and all of the | 107 /// Return the set of transitive files - the file itself and all of the |
| 107 /// directly or indirectly referenced files. | 108 /// directly or indirectly referenced files. |
| 108 Set<FileState> get transitiveFiles { | 109 Set<FileState> get transitiveFiles { |
| 109 // TODO(scheglov) add caching. | 110 if (_transitiveFiles == null) { |
| 110 var transitiveFiles = new Set<FileState>(); | 111 _transitiveFiles = new Set<FileState>(); |
| 111 | 112 |
| 112 void appendReferenced(FileState file) { | 113 void appendReferenced(FileState file) { |
| 113 if (transitiveFiles.add(file)) { | 114 if (_transitiveFiles.add(file)) { |
| 114 file._directReferencedFiles.forEach(appendReferenced); | 115 file._directReferencedFiles.forEach(appendReferenced); |
| 116 } |
| 115 } | 117 } |
| 118 |
| 119 appendReferenced(this); |
| 116 } | 120 } |
| 117 | 121 return _transitiveFiles; |
| 118 appendReferenced(this); | |
| 119 return transitiveFiles; | |
| 120 } | 122 } |
| 121 | 123 |
| 122 @override | 124 @override |
| 123 bool operator ==(Object other) { | 125 bool operator ==(Object other) { |
| 124 return other is FileState && other.uri == uri; | 126 return other is FileState && other.uri == uri; |
| 125 } | 127 } |
| 126 | 128 |
| 127 /// Read the file content and ensure that all of the file properties are | 129 /// Read the file content and ensure that all of the file properties are |
| 128 /// consistent with the read content, including all its dependencies. | 130 /// consistent with the read content, including all its dependencies. |
| 129 Future<Null> refresh() async { | 131 Future<Null> refresh() async { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 } | 186 } |
| 185 } | 187 } |
| 186 for (var part_ in unlinkedUnit.parts) { | 188 for (var part_ in unlinkedUnit.parts) { |
| 187 FileState file = await _getFileForRelativeUri(part_); | 189 FileState file = await _getFileForRelativeUri(part_); |
| 188 if (file != null) { | 190 if (file != null) { |
| 189 _partFiles.add(file); | 191 _partFiles.add(file); |
| 190 } | 192 } |
| 191 } | 193 } |
| 192 | 194 |
| 193 // Compute referenced files. | 195 // Compute referenced files. |
| 196 var oldDirectReferencedFiles = _directReferencedFiles; |
| 194 _directReferencedFiles = new Set<FileState>() | 197 _directReferencedFiles = new Set<FileState>() |
| 195 ..addAll(_importedLibraries) | 198 ..addAll(_importedLibraries) |
| 196 ..addAll(_exportedLibraries) | 199 ..addAll(_exportedLibraries) |
| 197 ..addAll(_partFiles); | 200 ..addAll(_partFiles); |
| 198 _directReferencedLibraries = (new Set<FileState>() | 201 _directReferencedLibraries = (new Set<FileState>() |
| 199 ..addAll(_importedLibraries) | 202 ..addAll(_importedLibraries) |
| 200 ..addAll(_exportedLibraries)) | 203 ..addAll(_exportedLibraries)) |
| 201 .toList(); | 204 .toList(); |
| 205 |
| 206 // If the set of directly referenced files of this file is changed, |
| 207 // then the transitive sets of files that include this file are also |
| 208 // changed. Reset these transitive sets. |
| 209 if (_directReferencedFiles.length != oldDirectReferencedFiles.length || |
| 210 !_directReferencedFiles.containsAll(oldDirectReferencedFiles)) { |
| 211 for (var file in _fsState._uriToFile.values) { |
| 212 if (file._transitiveFiles != null && |
| 213 file._transitiveFiles.contains(this)) { |
| 214 file._transitiveFiles = null; |
| 215 } |
| 216 } |
| 217 } |
| 202 } | 218 } |
| 203 | 219 |
| 204 @override | 220 @override |
| 205 String toString() { | 221 String toString() { |
| 206 if (uri.scheme == 'file') return uri.path; | 222 if (uri.scheme == 'file') return uri.path; |
| 207 return uri.toString(); | 223 return uri.toString(); |
| 208 } | 224 } |
| 209 | 225 |
| 210 /// Fasta unconditionally loads all VM libraries. In order to be able to | 226 /// Fasta unconditionally loads all VM libraries. In order to be able to |
| 211 /// serve them using the file system view, pretend that all of them were | 227 /// serve them using the file system view, pretend that all of them were |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 cycle.libraries.add(node.file); | 509 cycle.libraries.add(node.file); |
| 494 fileToCycleMap[node.file] = cycle; | 510 fileToCycleMap[node.file] = cycle; |
| 495 } | 511 } |
| 496 topologicallySortedCycles.add(cycle); | 512 topologicallySortedCycles.add(cycle); |
| 497 } | 513 } |
| 498 | 514 |
| 499 _LibraryNode getNode(FileState file) { | 515 _LibraryNode getNode(FileState file) { |
| 500 return nodesOfFiles.putIfAbsent(file, () => new _LibraryNode(this, file)); | 516 return nodesOfFiles.putIfAbsent(file, () => new _LibraryNode(this, file)); |
| 501 } | 517 } |
| 502 } | 518 } |
| OLD | NEW |