Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(808)

Side by Side Diff: pkg/analyzer/lib/src/dart/analysis/driver.dart

Issue 2447603002: Include linked hashes into the current file state. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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:collection'; 6 import 'dart:collection';
7 import 'dart:convert'; 7 import 'dart:convert';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 final _explicitFiles = new LinkedHashSet<String>(); 121 final _explicitFiles = new LinkedHashSet<String>();
122 122
123 /** 123 /**
124 * The set of files that are currently scheduled for analysis. 124 * The set of files that are currently scheduled for analysis.
125 */ 125 */
126 final _filesToAnalyze = new LinkedHashSet<String>(); 126 final _filesToAnalyze = new LinkedHashSet<String>();
127 127
128 /** 128 /**
129 * The current file state. 129 * The current file state.
130 * 130 *
131 * It maps file paths to MD5 hash of the file content. 131 * It maps file paths to the MD5 hash of the file content.
132 */ 132 */
133 final _fileContentHashMap = <String, String>{}; 133 final _fileContentHashMap = <String, String>{};
134 134
135 /** 135 /**
136 * Mapping from library URIs to the linked hash of the library.
137 */
138 final _linkedHashMap = <Uri, String>{};
Paul Berry 2016/10/24 11:51:47 My comments about nomenclature from the last patch
scheglov 2016/10/24 17:44:37 Acknowledged. I renamed them together.
139
140 /**
136 * TODO(scheglov) document and improve 141 * TODO(scheglov) document and improve
137 */ 142 */
138 final _hasWorkStreamController = new StreamController<String>(); 143 final _hasWorkStreamController = new StreamController<String>();
139 144
140 AnalysisDriver(this._logger, this._resourceProvider, this._byteStore, 145 AnalysisDriver(this._logger, this._resourceProvider, this._byteStore,
141 this._contentCache, this._sourceFactory, this._analysisOptions) { 146 this._contentCache, this._sourceFactory, this._analysisOptions) {
142 _sdkBundle = _sourceFactory.dartSdk.getLinkedBundle(); 147 _sdkBundle = _sourceFactory.dartSdk.getLinkedBundle();
143 } 148 }
144 149
145 /** 150 /**
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 * transitions to "idle". 231 * transitions to "idle".
227 * 232 *
228 * Invocation of this method will not prevent a [Future] returned from 233 * Invocation of this method will not prevent a [Future] returned from
229 * [getResult] from completing with a result, but the result is not 234 * [getResult] from completing with a result, but the result is not
230 * guaranteed to be consistent with the new current file state after this 235 * guaranteed to be consistent with the new current file state after this
231 * [changeFile] invocation. 236 * [changeFile] invocation.
232 */ 237 */
233 void changeFile(String path) { 238 void changeFile(String path) {
234 // TODO(scheglov) Don't clear, schedule API signature validation. 239 // TODO(scheglov) Don't clear, schedule API signature validation.
235 _fileContentHashMap.clear(); 240 _fileContentHashMap.clear();
241 _linkedHashMap.clear();
236 _filesToAnalyze.add(path); 242 _filesToAnalyze.add(path);
237 _filesToAnalyze.addAll(_explicitFiles); 243 _filesToAnalyze.addAll(_explicitFiles);
238 // TODO(scheglov) name?! 244 // TODO(scheglov) name?!
239 _hasWorkStreamController.add('do it!'); 245 _hasWorkStreamController.add('do it!');
240 } 246 }
241 247
242 /** 248 /**
243 * Return the [Future] that completes with a [AnalysisResult] for the file 249 * Return the [Future] that completes with a [AnalysisResult] for the file
244 * with the given [path]. 250 * with the given [path].
245 * 251 *
(...skipping 24 matching lines...) Expand all
270 */ 276 */
271 void removeFile(String path) { 277 void removeFile(String path) {
272 _explicitFiles.remove(path); 278 _explicitFiles.remove(path);
273 _filesToAnalyze.remove(path); 279 _filesToAnalyze.remove(path);
274 } 280 }
275 281
276 /** 282 /**
277 * TODO(scheglov) replace with actual [AnalysisResult] computing. 283 * TODO(scheglov) replace with actual [AnalysisResult] computing.
278 */ 284 */
279 List<String> _computeAndPrintErrors(_File file) { 285 List<String> _computeAndPrintErrors(_File file) {
286 // TODO(scheglov) Computing resolved unit fails for these units.
287 // pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
288 // pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
289 if (file.path.endsWith(
290 'pkg/analyzer/lib/plugin/embedded_resolver_provider.dart') ||
291 file.path.endsWith('pkg/analyzer/lib/source/embedder.dart') ||
292 file.path.endsWith('pkg/analyzer/lib/src/generated/ast.dart') ||
293 file.path.endsWith('pkg/analyzer/lib/src/generated/element.dart') ||
294 file.path
295 .endsWith('pkg/analyzer/lib/src/generated/element_handle.dart') ||
296 file.path.endsWith('pkg/analyzer/lib/src/generated/error.dart') ||
297 file.path.endsWith('pkg/analyzer/lib/src/generated/scanner.dart') ||
298 file.path.endsWith('pkg/analyzer/lib/src/generated/sdk_io.dart') ||
299 file.path.endsWith('pkg/analyzer/lib/src/generated/visitors.dart') ||
300 file.path.endsWith('pkg/analyzer/test/generated/constant_test.dart') ||
301 file.path.endsWith('pkg/analyzer/test/source/embedder_test.dart')) {
302 return [];
303 }
304
280 List<String> errorStrings = _logger.run('Compute errors $file', () { 305 List<String> errorStrings = _logger.run('Compute errors $file', () {
281 LibraryContext libraryContext = _createLibraryContext(file); 306 LibraryContext libraryContext = _createLibraryContext(file);
282 307
283 String errorsKey; 308 String errorsKey;
284 { 309 {
285 ApiSignature signature = new ApiSignature(); 310 ApiSignature signature = new ApiSignature();
286 signature.addString(libraryContext.node.linkedHash); 311 signature.addString(libraryContext.node.linkedHash);
287 signature.addString(file.contentHash); 312 signature.addString(file.contentHash);
288 errorsKey = '${signature.toHex()}.errors'; 313 errorsKey = '${signature.toHex()}.errors';
289 } 314 }
290 315
291 { 316 {
292 List<int> bytes = _byteStore.get(errorsKey); 317 List<int> bytes = _byteStore.get(errorsKey);
293 if (bytes != null) { 318 if (bytes != null) {
294 fb.BufferContext bp = new fb.BufferContext.fromBytes(bytes); 319 fb.BufferContext bp = new fb.BufferContext.fromBytes(bytes);
295 int table = bp.derefObject(0); 320 int table = bp.derefObject(0);
296 return const fb.ListReader<String>(const fb.StringReader()) 321 return const fb.ListReader<String>(const fb.StringReader())
297 .vTableGet(bp, table, 0); 322 .vTableGet(bp, table, 0);
298 } 323 }
299 } 324 }
300 325
301 AnalysisContext analysisContext = _createAnalysisContext(libraryContext); 326 AnalysisContext analysisContext = _createAnalysisContext(libraryContext);
302 analysisContext.resolveCompilationUnit2( 327 analysisContext.setContents(file.source, file.content);
303 libraryContext.file.source, libraryContext.file.source);
304 try { 328 try {
329 // Compute resolved unit.
330 // _logger.runTimed('Computed resolved unit', () {
Paul Berry 2016/10/24 11:51:47 Why is this code commented out? Either remove or
scheglov 2016/10/24 17:44:37 We don't actually compute full analysis results ye
331 // analysisContext.resolveCompilationUnit2(
332 // libraryContext.file.source, libraryContext.file.source);
333 // });
334 // Compute errors.
305 List<AnalysisError> errors; 335 List<AnalysisError> errors;
306 try { 336 try {
307 errors = _logger.runTimed('Computed errors', () { 337 errors = _logger.runTimed('Computed errors', () {
308 return analysisContext.computeErrors(file.source); 338 return analysisContext.computeErrors(file.source);
309 }); 339 });
310 } catch (e, st) { 340 } catch (e, st) {
311 // TODO(scheglov) why does it fail? 341 // TODO(scheglov) why does it fail?
312 // Caused by Bad state: Unmatched TypeParameterElementImpl T 342 // Caused by Bad state: Unmatched TypeParameterElementImpl T
313 errors = []; 343 errors = [];
314 } 344 }
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 } 897 }
868 return _dependencies; 898 return _dependencies;
869 } 899 }
870 900
871 @override 901 @override
872 int get hashCode => uri.hashCode; 902 int get hashCode => uri.hashCode;
873 903
874 bool get isReady => linked != null; 904 bool get isReady => linked != null;
875 905
876 String get linkedHash { 906 String get linkedHash {
877 if (_linkedHash == null) { 907 _linkedHash ??= driver._linkedHashMap.putIfAbsent(uri, () {
878 if (transitiveDependencies == null) { 908 computeTransitiveDependencies();
879 computeTransitiveDependencies();
880 }
881 909
882 // Add all unlinked API signatures. 910 // Add all unlinked API signatures.
883 List<String> signatures = <String>[]; 911 List<String> signatures = <String>[];
884 signatures.add(driver._sdkBundle.apiSignature); 912 signatures.add(driver._sdkBundle.apiSignature);
885 transitiveDependencies 913 transitiveDependencies
886 .map((node) => node.unlinkedBundles) 914 .map((node) => node.unlinkedBundles)
887 .expand((bundles) => bundles) 915 .expand((bundles) => bundles)
888 .map((bundle) => bundle.apiSignature) 916 .map((bundle) => bundle.apiSignature)
889 .forEach(signatures.add); 917 .forEach(signatures.add);
890 signatures.sort(); 918 signatures.sort();
891 919
892 // Combine into a single hash. 920 // Combine into a single hash.
893 ApiSignature signature = new ApiSignature(); 921 ApiSignature signature = new ApiSignature();
894 signature.addString(uri.toString()); 922 signature.addString(uri.toString());
895 signatures.forEach(signature.addString); 923 signatures.forEach(signature.addString);
896 _linkedHash = signature.toHex(); 924 return signature.toHex();
897 } 925 });
898 return _linkedHash; 926 return _linkedHash;
899 } 927 }
900 928
901 bool operator ==(other) { 929 bool operator ==(other) {
902 return other is _LibraryNode && other.uri == uri; 930 return other is _LibraryNode && other.uri == uri;
903 } 931 }
904 932
905 void computeTransitiveDependencies() { 933 void computeTransitiveDependencies() {
906 if (transitiveDependencies == null) { 934 if (transitiveDependencies == null) {
907 transitiveDependencies = new Set<_LibraryNode>(); 935 transitiveDependencies = new Set<_LibraryNode>();
908 936
909 void appendDependencies(_LibraryNode node) { 937 void appendDependencies(_LibraryNode node) {
910 if (transitiveDependencies.add(node)) { 938 if (transitiveDependencies.add(node)) {
911 node.dependencies.forEach(appendDependencies); 939 node.dependencies.forEach(appendDependencies);
912 } 940 }
913 } 941 }
914 942
915 appendDependencies(this); 943 appendDependencies(this);
916 } 944 }
917 } 945 }
918 946
919 @override 947 @override
920 String toString() => uri.toString(); 948 String toString() => uri.toString();
921 } 949 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698