| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library analyzer.src.generated.sdk; | 5 library analyzer.src.generated.sdk; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 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'; | |
| 11 import 'package:analyzer/dart/ast/visitor.dart'; | 10 import 'package:analyzer/dart/ast/visitor.dart'; |
| 12 import 'package:analyzer/src/generated/engine.dart' | 11 import 'package:analyzer/src/generated/engine.dart' |
| 13 show AnalysisContext, AnalysisOptions, AnalysisOptionsImpl; | 12 show AnalysisContext, AnalysisOptions, AnalysisOptionsImpl; |
| 14 import 'package:analyzer/src/generated/source.dart' show Source; | 13 import 'package:analyzer/src/generated/source.dart' show Source; |
| 15 import 'package:analyzer/src/generated/utilities_general.dart'; | 14 import 'package:analyzer/src/generated/utilities_general.dart'; |
| 16 import 'package:analyzer/src/summary/idl.dart' show PackageBundle; | 15 import 'package:analyzer/src/summary/idl.dart' show PackageBundle; |
| 17 | 16 |
| 18 /** | 17 /** |
| 19 * A Dart SDK installed in a specified location. | 18 * A Dart SDK installed in a specified location. |
| 20 */ | 19 */ |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 */ | 283 */ |
| 285 static String _IMPLEMENTATION = "implementation"; | 284 static String _IMPLEMENTATION = "implementation"; |
| 286 | 285 |
| 287 /** | 286 /** |
| 288 * The name of the optional parameter used to specify the path used when | 287 * The name of the optional parameter used to specify the path used when |
| 289 * compiling for dart2js. | 288 * compiling for dart2js. |
| 290 */ | 289 */ |
| 291 static String _DART2JS_PATH = "dart2jsPath"; | 290 static String _DART2JS_PATH = "dart2jsPath"; |
| 292 | 291 |
| 293 /** | 292 /** |
| 294 * The name of the `dart2js` platform. | |
| 295 */ | |
| 296 static String _DART2JS_PLATFORM = 'DART2JS_PLATFORM'; | |
| 297 | |
| 298 /** | |
| 299 * The name of the optional parameter used to indicate whether the library is | 293 * The name of the optional parameter used to indicate whether the library is |
| 300 * documented. | 294 * documented. |
| 301 */ | 295 */ |
| 302 static String _DOCUMENTED = "documented"; | 296 static String _DOCUMENTED = "documented"; |
| 303 | 297 |
| 304 /** | 298 /** |
| 305 * The name of the optional parameter used to specify the category of the | 299 * The name of the optional parameter used to specify the category of the |
| 306 * library. | 300 * library. |
| 307 */ | 301 */ |
| 308 static String _CATEGORIES = "categories"; | 302 static String _CATEGORIES = "categories"; |
| 309 | 303 |
| 310 /** | 304 /** |
| 311 * The name of the optional parameter used to specify the patches for | |
| 312 * the library. | |
| 313 */ | |
| 314 static String _PATCHES = "patches"; | |
| 315 | |
| 316 /** | |
| 317 * The name of the optional parameter used to specify the platforms on which | 305 * The name of the optional parameter used to specify the platforms on which |
| 318 * the library can be used. | 306 * the library can be used. |
| 319 */ | 307 */ |
| 320 static String _PLATFORMS = "platforms"; | 308 static String _PLATFORMS = "platforms"; |
| 321 | 309 |
| 322 /** | 310 /** |
| 323 * The value of the [PLATFORMS] parameter used to specify that the library can | 311 * The value of the [PLATFORMS] parameter used to specify that the library can |
| 324 * be used on the VM. | 312 * be used on the VM. |
| 325 */ | 313 */ |
| 326 static String _VM_PLATFORM = "VM_PLATFORM"; | 314 static String _VM_PLATFORM = "VM_PLATFORM"; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 } else if (argument is NamedExpression) { | 372 } else if (argument is NamedExpression) { |
| 385 String name = argument.name.label.name; | 373 String name = argument.name.label.name; |
| 386 Expression expression = argument.expression; | 374 Expression expression = argument.expression; |
| 387 if (name == _CATEGORIES) { | 375 if (name == _CATEGORIES) { |
| 388 library.category = | 376 library.category = |
| 389 convertCategories((expression as StringLiteral).stringValue); | 377 convertCategories((expression as StringLiteral).stringValue); |
| 390 } else if (name == _IMPLEMENTATION) { | 378 } else if (name == _IMPLEMENTATION) { |
| 391 library._implementation = (expression as BooleanLiteral).value; | 379 library._implementation = (expression as BooleanLiteral).value; |
| 392 } else if (name == _DOCUMENTED) { | 380 } else if (name == _DOCUMENTED) { |
| 393 library.documented = (expression as BooleanLiteral).value; | 381 library.documented = (expression as BooleanLiteral).value; |
| 394 } else if (name == _PATCHES) { | |
| 395 if (expression is MapLiteral) { | |
| 396 expression.entries.forEach((MapLiteralEntry entry) { | |
| 397 int platforms = _convertPlatforms(entry.key); | |
| 398 Expression pathsListLiteral = entry.value; | |
| 399 if (pathsListLiteral is ListLiteral) { | |
| 400 List<String> paths = <String>[]; | |
| 401 pathsListLiteral.elements.forEach((Expression pathExpr) { | |
| 402 if (pathExpr is SimpleStringLiteral) { | |
| 403 String path = pathExpr.value; | |
| 404 _validatePatchPath(path); | |
| 405 paths.add(path); | |
| 406 } else { | |
| 407 throw new ArgumentError( | |
| 408 'The "patch" argument items must be simple strings.'); | |
| 409 } | |
| 410 }); | |
| 411 library.setPatchPaths(platforms, paths); | |
| 412 } else { | |
| 413 throw new ArgumentError( | |
| 414 'The "patch" argument values must be list literals.'); | |
| 415 } | |
| 416 }); | |
| 417 } | |
| 418 } else if (name == _PLATFORMS) { | 382 } else if (name == _PLATFORMS) { |
| 419 if (expression is SimpleIdentifier) { | 383 if (expression is SimpleIdentifier) { |
| 420 String identifier = expression.name; | 384 String identifier = expression.name; |
| 421 if (identifier == _VM_PLATFORM) { | 385 if (identifier == _VM_PLATFORM) { |
| 422 library.setVmLibrary(); | 386 library.setVmLibrary(); |
| 423 } else { | 387 } else { |
| 424 library.setDart2JsLibrary(); | 388 library.setDart2JsLibrary(); |
| 425 } | 389 } |
| 426 } | 390 } |
| 427 } else if (_useDart2jsPaths && name == _DART2JS_PATH) { | 391 } else if (_useDart2jsPaths && name == _DART2JS_PATH) { |
| 428 if (expression is SimpleStringLiteral) { | 392 if (expression is SimpleStringLiteral) { |
| 429 library.path = expression.value; | 393 library.path = expression.value; |
| 430 } | 394 } |
| 431 } | 395 } |
| 432 } | 396 } |
| 433 } | 397 } |
| 434 _librariesMap.setLibrary(libraryName, library); | 398 _librariesMap.setLibrary(libraryName, library); |
| 435 } | 399 } |
| 436 return null; | 400 return null; |
| 437 } | 401 } |
| 438 | |
| 439 /** | |
| 440 * Validate the given [path] to a patch file. Throw [ArgumentError] if not a | |
| 441 * valid path: is absolute, or contains `..`. | |
| 442 */ | |
| 443 void _validatePatchPath(String path) { | |
| 444 if (path.contains(r'\')) { | |
| 445 throw new ArgumentError('The path to a patch file must be posix: $path'); | |
| 446 } | |
| 447 if (path.contains('..')) { | |
| 448 throw new ArgumentError( | |
| 449 'The path to a patch file cannot contain "..": $path'); | |
| 450 } | |
| 451 if (path.startsWith('/')) { | |
| 452 throw new ArgumentError( | |
| 453 'The path to a patch file cannot be absolute: $path'); | |
| 454 } | |
| 455 } | |
| 456 | |
| 457 /** | |
| 458 * Return the platform constant value for the given [expr]. | |
| 459 * Throw [ArgumentError] if not a valid platform name given. | |
| 460 */ | |
| 461 static int _convertPlatform(Expression expr) { | |
| 462 if (expr is SimpleIdentifier) { | |
| 463 String name = expr.name; | |
| 464 if (name == _DART2JS_PLATFORM) { | |
| 465 return SdkLibraryImpl.DART2JS_PLATFORM; | |
| 466 } | |
| 467 if (name == _VM_PLATFORM) { | |
| 468 return SdkLibraryImpl.VM_PLATFORM; | |
| 469 } | |
| 470 throw new ArgumentError('Invalid platform name: $name'); | |
| 471 } | |
| 472 throw new ArgumentError('Invalid platform type: ${expr.runtimeType}'); | |
| 473 } | |
| 474 | |
| 475 /** | |
| 476 * Return the platforms combination value for the [expr], which should be | |
| 477 * either `name1 | name2` or `name`. Throw [ArgumentError] if any of the | |
| 478 * names is not a valid platform name. | |
| 479 */ | |
| 480 static int _convertPlatforms(Expression expr) { | |
| 481 if (expr is BinaryExpression) { | |
| 482 TokenType operator = expr.operator?.type; | |
| 483 if (operator == TokenType.BAR) { | |
| 484 return _convertPlatforms(expr.leftOperand) | | |
| 485 _convertPlatforms(expr.rightOperand); | |
| 486 } else { | |
| 487 throw new ArgumentError('Invalid platforms combination: $operator'); | |
| 488 } | |
| 489 } else { | |
| 490 return _convertPlatform(expr); | |
| 491 } | |
| 492 } | |
| 493 } | 402 } |
| 494 | 403 |
| 495 /** | 404 /** |
| 496 * Represents a single library in the SDK | 405 * Represents a single library in the SDK |
| 497 */ | 406 */ |
| 498 abstract class SdkLibrary { | 407 abstract class SdkLibrary { |
| 499 /** | 408 /** |
| 500 * Return the name of the category containing the library. | 409 * Return the name of the category containing the library. |
| 501 */ | 410 */ |
| 502 String get category; | 411 String get category; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 * Return the path to the file defining the library. The path is relative to | 444 * Return the path to the file defining the library. The path is relative to |
| 536 * the `lib` directory within the SDK. | 445 * the `lib` directory within the SDK. |
| 537 */ | 446 */ |
| 538 String get path; | 447 String get path; |
| 539 | 448 |
| 540 /** | 449 /** |
| 541 * Return the short name of the library. This is the URI of the library, | 450 * Return the short name of the library. This is the URI of the library, |
| 542 * including `dart:`. | 451 * including `dart:`. |
| 543 */ | 452 */ |
| 544 String get shortName; | 453 String get shortName; |
| 545 | |
| 546 /** | |
| 547 * Return the list of paths to the patch files that should be applied | |
| 548 * to this library for the given [platform], not `null`. | |
| 549 */ | |
| 550 List<String> getPatches(int platform); | |
| 551 } | 454 } |
| 552 | 455 |
| 553 /** | 456 /** |
| 554 * The information known about a single library within the SDK. | 457 * The information known about a single library within the SDK. |
| 555 */ | 458 */ |
| 556 class SdkLibraryImpl implements SdkLibrary { | 459 class SdkLibraryImpl implements SdkLibrary { |
| 557 /** | 460 /** |
| 558 * The bit mask used to access the bit representing the flag indicating | 461 * The bit mask used to access the bit representing the flag indicating |
| 559 * whether a library is intended to work on the dart2js platform. | 462 * whether a library is intended to work on the dart2js platform. |
| 560 */ | 463 */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 * A flag indicating whether the library is an implementation library. | 496 * A flag indicating whether the library is an implementation library. |
| 594 */ | 497 */ |
| 595 bool _implementation = false; | 498 bool _implementation = false; |
| 596 | 499 |
| 597 /** | 500 /** |
| 598 * An encoding of which platforms this library is intended to work on. | 501 * An encoding of which platforms this library is intended to work on. |
| 599 */ | 502 */ |
| 600 int _platforms = 0; | 503 int _platforms = 0; |
| 601 | 504 |
| 602 /** | 505 /** |
| 603 * The mapping from the platform combination to the list of paths (relative | |
| 604 * to the `sdk/lib` folder) of patches that should be applied to this library | |
| 605 * on every platform in the combination. | |
| 606 */ | |
| 607 final Map<int, List<String>> _platformsToPatchPaths = | |
| 608 new HashMap<int, List<String>>(); | |
| 609 | |
| 610 /** | |
| 611 * Initialize a newly created library to represent the library with the given | 506 * Initialize a newly created library to represent the library with the given |
| 612 * [name]. | 507 * [name]. |
| 613 */ | 508 */ |
| 614 SdkLibraryImpl(this.shortName); | 509 SdkLibraryImpl(this.shortName); |
| 615 | 510 |
| 616 /** | 511 /** |
| 617 * Set whether the library is documented. | 512 * Set whether the library is documented. |
| 618 */ | 513 */ |
| 619 void set documented(bool documented) { | 514 void set documented(bool documented) { |
| 620 this._documented = documented; | 515 this._documented = documented; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 631 | 526 |
| 632 @override | 527 @override |
| 633 bool get isInternal => category == "Internal"; | 528 bool get isInternal => category == "Internal"; |
| 634 | 529 |
| 635 @override | 530 @override |
| 636 bool get isShared => category == "Shared"; | 531 bool get isShared => category == "Shared"; |
| 637 | 532 |
| 638 @override | 533 @override |
| 639 bool get isVmLibrary => (_platforms & VM_PLATFORM) != 0; | 534 bool get isVmLibrary => (_platforms & VM_PLATFORM) != 0; |
| 640 | 535 |
| 641 @override | |
| 642 List<String> getPatches(int platform) { | |
| 643 List<String> paths = <String>[]; | |
| 644 _platformsToPatchPaths.forEach((int platforms, List<String> value) { | |
| 645 if ((platforms & platform) != 0) { | |
| 646 paths.addAll(value); | |
| 647 } | |
| 648 }); | |
| 649 return paths; | |
| 650 } | |
| 651 | |
| 652 /** | 536 /** |
| 653 * Record that this library can be compiled to JavaScript by dart2js. | 537 * Record that this library can be compiled to JavaScript by dart2js. |
| 654 */ | 538 */ |
| 655 void setDart2JsLibrary() { | 539 void setDart2JsLibrary() { |
| 656 _platforms |= DART2JS_PLATFORM; | 540 _platforms |= DART2JS_PLATFORM; |
| 657 } | 541 } |
| 658 | 542 |
| 659 /** | 543 /** |
| 660 * Add a new patch with the given [path] that should be applied for the | |
| 661 * given [platforms]. | |
| 662 */ | |
| 663 void setPatchPaths(int platforms, List<String> paths) { | |
| 664 _platformsToPatchPaths[platforms] = paths; | |
| 665 } | |
| 666 | |
| 667 /** | |
| 668 * Record that this library can be run on the VM. | 544 * Record that this library can be run on the VM. |
| 669 */ | 545 */ |
| 670 void setVmLibrary() { | 546 void setVmLibrary() { |
| 671 _platforms |= VM_PLATFORM; | 547 _platforms |= VM_PLATFORM; |
| 672 } | 548 } |
| 673 } | 549 } |
| OLD | NEW |