OLD | NEW |
1 import 'dart:io' as io; | 1 import 'dart:io' as io; |
| 2 import 'dart:math' show min; |
2 | 3 |
3 import 'package:analyzer/dart/element/element.dart'; | 4 import 'package:analyzer/dart/element/element.dart'; |
4 import 'package:analyzer/file_system/file_system.dart'; | 5 import 'package:analyzer/file_system/file_system.dart'; |
5 import 'package:analyzer/src/context/cache.dart'; | 6 import 'package:analyzer/src/context/cache.dart'; |
6 import 'package:analyzer/src/context/context.dart'; | 7 import 'package:analyzer/src/context/context.dart'; |
7 import 'package:analyzer/src/dart/element/element.dart'; | 8 import 'package:analyzer/src/dart/element/element.dart'; |
8 import 'package:analyzer/src/generated/engine.dart'; | 9 import 'package:analyzer/src/generated/engine.dart'; |
9 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; | 10 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; |
10 import 'package:analyzer/src/generated/source.dart'; | 11 import 'package:analyzer/src/generated/source.dart'; |
11 import 'package:analyzer/src/generated/source_io.dart'; | 12 import 'package:analyzer/src/generated/source_io.dart'; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 } | 300 } |
300 | 301 |
301 @override | 302 @override |
302 bool hasLibrarySummary(String uri) { | 303 bool hasLibrarySummary(String uri) { |
303 LinkedLibrary linkedLibrary = _dataStore.linkedMap[uri]; | 304 LinkedLibrary linkedLibrary = _dataStore.linkedMap[uri]; |
304 return linkedLibrary != null; | 305 return linkedLibrary != null; |
305 } | 306 } |
306 } | 307 } |
307 | 308 |
308 /** | 309 /** |
| 310 * A [ConflictingSummaryException] indicates that two different summaries |
| 311 * provided to a [SummaryDataStore] conflict. |
| 312 */ |
| 313 class ConflictingSummaryException implements Exception { |
| 314 final String duplicatedUri; |
| 315 final String summary1Uri; |
| 316 final String summary2Uri; |
| 317 String _message; |
| 318 |
| 319 ConflictingSummaryException(Iterable<String> summaryPaths, this.duplicatedUri, |
| 320 this.summary1Uri, this.summary2Uri) { |
| 321 // Paths are often quite long. Find and extract out a common prefix to |
| 322 // build a more readable error message. |
| 323 var prefix = _commonPrefix(summaryPaths.toList()); |
| 324 _message = ''' |
| 325 These summaries conflict because they overlap: |
| 326 - ${summary1Uri.substring(prefix)} |
| 327 - ${summary2Uri.substring(prefix)} |
| 328 Both contain the file: ${duplicatedUri}. |
| 329 This typically indicates an invalid build rule where two or more targets |
| 330 include the same source. |
| 331 '''; |
| 332 } |
| 333 |
| 334 /// Given a set of file paths, find a common prefix. |
| 335 int _commonPrefix(List<String> strings) { |
| 336 if (strings.isEmpty) return 0; |
| 337 var first = strings.first; |
| 338 int common = first.length; |
| 339 for (int i = 1; i < strings.length; ++i) { |
| 340 var current = strings[i]; |
| 341 common = min(common, current.length); |
| 342 for (int j = 0; j < common; ++j) { |
| 343 if (first[j] != current[j]) { |
| 344 common = j; |
| 345 if (common == 0) return 0; |
| 346 break; |
| 347 } |
| 348 } |
| 349 } |
| 350 // The prefix should end with a file separator. |
| 351 var last = |
| 352 first.substring(0, common).lastIndexOf(io.Platform.pathSeparator); |
| 353 return last < 0 ? 0 : last + 1; |
| 354 } |
| 355 |
| 356 String toString() => _message; |
| 357 } |
| 358 |
| 359 /** |
309 * A [SummaryDataStore] is a container for the data extracted from a set of | 360 * A [SummaryDataStore] is a container for the data extracted from a set of |
310 * summary package bundles. It contains maps which can be used to find linked | 361 * summary package bundles. It contains maps which can be used to find linked |
311 * and unlinked summaries by URI. | 362 * and unlinked summaries by URI. |
312 */ | 363 */ |
313 class SummaryDataStore { | 364 class SummaryDataStore { |
314 /** | 365 /** |
315 * List of all [PackageBundle]s. | 366 * List of all [PackageBundle]s. |
316 */ | 367 */ |
317 final List<PackageBundle> bundles = <PackageBundle>[]; | 368 final List<PackageBundle> bundles = <PackageBundle>[]; |
318 | 369 |
(...skipping 16 matching lines...) Expand all Loading... |
335 * Map from the URI of a library to the linked summary of that library. | 386 * Map from the URI of a library to the linked summary of that library. |
336 */ | 387 */ |
337 final Map<String, LinkedLibrary> linkedMap = <String, LinkedLibrary>{}; | 388 final Map<String, LinkedLibrary> linkedMap = <String, LinkedLibrary>{}; |
338 | 389 |
339 /** | 390 /** |
340 * Map from the URI of a library to the summary path that contained it. | 391 * Map from the URI of a library to the summary path that contained it. |
341 */ | 392 */ |
342 final Map<String, String> uriToSummaryPath = <String, String>{}; | 393 final Map<String, String> uriToSummaryPath = <String, String>{}; |
343 | 394 |
344 /** | 395 /** |
| 396 * List of summary paths. |
| 397 */ |
| 398 final Iterable<String> _summaryPaths; |
| 399 |
| 400 /** |
345 * Create a [SummaryDataStore] and populate it with the summaries in | 401 * Create a [SummaryDataStore] and populate it with the summaries in |
346 * [summaryPaths]. If [recordDependencyInfo] is `true`, record | 402 * [summaryPaths]. If [recordDependencyInfo] is `true`, record |
347 * [PackageDependencyInfo] for each summary, for later access via | 403 * [PackageDependencyInfo] for each summary, for later access via |
348 * [dependencies]. | 404 * [dependencies]. |
349 */ | 405 */ |
350 SummaryDataStore(Iterable<String> summaryPaths, | 406 SummaryDataStore(Iterable<String> summaryPaths, |
351 {bool recordDependencyInfo: false, ResourceProvider resourceProvider}) | 407 {bool recordDependencyInfo: false, ResourceProvider resourceProvider}) |
352 : dependencies = | 408 : _summaryPaths = summaryPaths, |
| 409 dependencies = |
353 recordDependencyInfo ? <PackageDependencyInfoBuilder>[] : null { | 410 recordDependencyInfo ? <PackageDependencyInfoBuilder>[] : null { |
354 summaryPaths.forEach((String path) => _fillMaps(path, resourceProvider)); | 411 summaryPaths.forEach((String path) => _fillMaps(path, resourceProvider)); |
355 } | 412 } |
356 | 413 |
357 /** | 414 /** |
358 * Add the given [bundle] loaded from the file with the given [path]. | 415 * Add the given [bundle] loaded from the file with the given [path]. |
359 */ | 416 */ |
360 void addBundle(String path, PackageBundle bundle) { | 417 void addBundle(String path, PackageBundle bundle) { |
361 bundles.add(bundle); | 418 bundles.add(bundle); |
362 if (dependencies != null) { | 419 if (dependencies != null) { |
(...skipping 14 matching lines...) Expand all Loading... |
377 } | 434 } |
378 dependencies.add(new PackageDependencyInfoBuilder( | 435 dependencies.add(new PackageDependencyInfoBuilder( |
379 includedPackageNames: includedPackageNames.toList()..sort(), | 436 includedPackageNames: includedPackageNames.toList()..sort(), |
380 includesDartUris: includesDartUris, | 437 includesDartUris: includesDartUris, |
381 includesFileUris: includesFileUris, | 438 includesFileUris: includesFileUris, |
382 apiSignature: bundle.apiSignature, | 439 apiSignature: bundle.apiSignature, |
383 summaryPath: path)); | 440 summaryPath: path)); |
384 } | 441 } |
385 for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) { | 442 for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) { |
386 String uri = bundle.unlinkedUnitUris[i]; | 443 String uri = bundle.unlinkedUnitUris[i]; |
| 444 if (uriToSummaryPath.containsKey(uri) && |
| 445 (uriToSummaryPath[uri] != path)) { |
| 446 throw new ConflictingSummaryException( |
| 447 _summaryPaths, uri, uriToSummaryPath[uri], path); |
| 448 } |
387 uriToSummaryPath[uri] = path; | 449 uriToSummaryPath[uri] = path; |
388 addUnlinkedUnit(uri, bundle.unlinkedUnits[i]); | 450 addUnlinkedUnit(uri, bundle.unlinkedUnits[i]); |
389 } | 451 } |
390 for (int i = 0; i < bundle.linkedLibraryUris.length; i++) { | 452 for (int i = 0; i < bundle.linkedLibraryUris.length; i++) { |
391 String uri = bundle.linkedLibraryUris[i]; | 453 String uri = bundle.linkedLibraryUris[i]; |
392 addLinkedLibrary(uri, bundle.linkedLibraries[i]); | 454 addLinkedLibrary(uri, bundle.linkedLibraries[i]); |
393 } | 455 } |
394 } | 456 } |
395 | 457 |
396 /** | 458 /** |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 var file = resourceProvider.getFile(path); | 500 var file = resourceProvider.getFile(path); |
439 buffer = file.readAsBytesSync(); | 501 buffer = file.readAsBytesSync(); |
440 } else { | 502 } else { |
441 io.File file = new io.File(path); | 503 io.File file = new io.File(path); |
442 buffer = file.readAsBytesSync(); | 504 buffer = file.readAsBytesSync(); |
443 } | 505 } |
444 PackageBundle bundle = new PackageBundle.fromBuffer(buffer); | 506 PackageBundle bundle = new PackageBundle.fromBuffer(buffer); |
445 addBundle(path, bundle); | 507 addBundle(path, bundle); |
446 } | 508 } |
447 } | 509 } |
OLD | NEW |