| OLD | NEW |
| 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:convert' show ChunkedConversionSink, UTF8; | 5 import 'dart:convert'; |
| 6 import 'dart:core' hide Resource; | 6 import 'dart:core' hide Resource; |
| 7 | 7 |
| 8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/file_system/file_system.dart'; | 9 import 'package:analyzer/file_system/file_system.dart'; |
| 10 import 'package:analyzer/src/generated/engine.dart'; | 10 import 'package:analyzer/src/generated/engine.dart'; |
| 11 import 'package:analyzer/src/generated/source.dart'; | 11 import 'package:analyzer/src/generated/source.dart'; |
| 12 import 'package:analyzer/src/summary/format.dart'; | 12 import 'package:analyzer/src/summary/format.dart'; |
| 13 import 'package:analyzer/src/summary/idl.dart'; | 13 import 'package:analyzer/src/summary/idl.dart'; |
| 14 import 'package:analyzer/src/summary/summarize_elements.dart'; | 14 import 'package:analyzer/src/summary/summarize_elements.dart'; |
| 15 import 'package:convert/convert.dart'; | 15 import 'package:convert/convert.dart'; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 if (refSource == null) { | 213 if (refSource == null) { |
| 214 throw new StateError('Unable to resolve $refUri in $librarySource'); | 214 throw new StateError('Unable to resolve $refUri in $librarySource'); |
| 215 } | 215 } |
| 216 _appendLibraryClosure(closure, refSource); | 216 _appendLibraryClosure(closure, refSource); |
| 217 } | 217 } |
| 218 contentSource.importedUris.forEach(appendLibrarySources); | 218 contentSource.importedUris.forEach(appendLibrarySources); |
| 219 contentSource.exportedUris.forEach(appendLibrarySources); | 219 contentSource.exportedUris.forEach(appendLibrarySources); |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 | 222 |
| 223 List<int> _computeSaltedMD5OfBytes(addData(ByteConversionSink byteSink)) { |
| 224 Digest digest; |
| 225 ChunkedConversionSink<Digest> digestSink = |
| 226 new ChunkedConversionSink<Digest>.withCallback((List<Digest> digests) { |
| 227 digest = digests.single; |
| 228 }); |
| 229 ByteConversionSink byteSink = md5.startChunkedConversion(digestSink); |
| 230 // Add data. |
| 231 addData(byteSink); |
| 232 byteSink.add(configSalt); |
| 233 // Done. |
| 234 byteSink.close(); |
| 235 return digest.bytes; |
| 236 } |
| 237 |
| 223 /** | 238 /** |
| 224 * Get the content based information about the given [source], maybe `null` | 239 * Get the content based information about the given [source], maybe `null` |
| 225 * if the information is not in the cache. | 240 * if the information is not in the cache. |
| 226 */ | 241 */ |
| 227 CacheSourceContent _getCacheSourceContent(Source source) { | 242 CacheSourceContent _getCacheSourceContent(Source source) { |
| 228 CacheSourceContent content = _sourceContentMap[source]; | 243 CacheSourceContent content = _sourceContentMap[source]; |
| 229 if (content == null) { | 244 if (content == null) { |
| 230 String key = _getCacheSourceContentKey(source); | 245 String key = _getCacheSourceContentKey(source); |
| 231 List<int> bytes = storage.get(key); | 246 List<int> bytes = storage.get(key); |
| 232 if (bytes == null) { | 247 if (bytes == null) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 }); | 300 }); |
| 286 } | 301 } |
| 287 | 302 |
| 288 /** | 303 /** |
| 289 * Return the [context]-specific hash of the closure of the library with | 304 * Return the [context]-specific hash of the closure of the library with |
| 290 * the given [librarySource]. | 305 * the given [librarySource]. |
| 291 */ | 306 */ |
| 292 List<int> _getLibraryClosureHash(Source librarySource) { | 307 List<int> _getLibraryClosureHash(Source librarySource) { |
| 293 return _libraryClosureHashMap.putIfAbsent(librarySource, () { | 308 return _libraryClosureHashMap.putIfAbsent(librarySource, () { |
| 294 List<Source> closure = _getLibraryClosure(librarySource); | 309 List<Source> closure = _getLibraryClosure(librarySource); |
| 295 | 310 return _computeSaltedMD5OfBytes((ByteConversionSink byteSink) { |
| 296 Digest digest; | 311 for (Source source in closure) { |
| 297 | 312 List<int> sourceHash = _getSourceContentHash(source); |
| 298 var digestSink = new ChunkedConversionSink<Digest>.withCallback( | 313 byteSink.add(sourceHash); |
| 299 (List<Digest> digests) { | 314 } |
| 300 digest = digests.single; | |
| 301 }); | 315 }); |
| 302 | |
| 303 var byteSink = md5.startChunkedConversion(digestSink); | |
| 304 | |
| 305 for (Source source in closure) { | |
| 306 List<int> sourceHash = _getSourceContentHash(source); | |
| 307 byteSink.add(sourceHash); | |
| 308 } | |
| 309 byteSink.add(configSalt); | |
| 310 | |
| 311 byteSink.close(); | |
| 312 // TODO(paulberry): this call to `close` should not be needed. | |
| 313 // Can be removed once | |
| 314 // https://github.com/dart-lang/crypto/issues/33 | |
| 315 // is fixed – ensure the min version constraint on crypto is updated, tho. | |
| 316 // Does not cause any problems in the mean time. | |
| 317 digestSink.close(); | |
| 318 | |
| 319 return digest.bytes; | |
| 320 }); | 316 }); |
| 321 } | 317 } |
| 322 | 318 |
| 323 /** | 319 /** |
| 324 * Compute a hash of the given [source] contents. | 320 * Compute a hash of the given [source] contents. |
| 325 */ | 321 */ |
| 326 List<int> _getSourceContentHash(Source source) { | 322 List<int> _getSourceContentHash(Source source) { |
| 327 return _sourceContentHashMap.putIfAbsent(source, () { | 323 return _sourceContentHashMap.putIfAbsent(source, () { |
| 328 String sourceText = source.contents.data; | 324 String sourceText = source.contents.data; |
| 329 List<int> sourceBytes = UTF8.encode(sourceText); | 325 List<int> sourceBytes = UTF8.encode(sourceText); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 */ | 426 */ |
| 431 final String id; | 427 final String id; |
| 432 | 428 |
| 433 /** | 429 /** |
| 434 * The payload bundle. | 430 * The payload bundle. |
| 435 */ | 431 */ |
| 436 final PackageBundle bundle; | 432 final PackageBundle bundle; |
| 437 | 433 |
| 438 LibraryBundleWithId(this.source, this.id, this.bundle); | 434 LibraryBundleWithId(this.source, this.id, this.bundle); |
| 439 } | 435 } |
| OLD | NEW |