| 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.source; | 8 library engine.source; |
| 9 | 9 |
| 10 import 'dart:collection'; | 10 import 'dart:collection'; |
| 11 import 'java_core.dart'; | 11 import 'java_core.dart'; |
| 12 import 'sdk.dart' show DartSdk; | 12 import 'sdk.dart' show DartSdk; |
| 13 import 'engine.dart' show AnalysisContext, TimestampedData; | 13 import 'engine.dart'; |
| 14 import 'java_engine.dart'; |
| 14 | 15 |
| 15 /** | 16 /** |
| 16 * Instances of class `ContentCache` hold content used to override the default c
ontent of a | 17 * Instances of class `ContentCache` hold content used to override the default c
ontent of a |
| 17 * [Source]. | 18 * [Source]. |
| 18 */ | 19 */ |
| 19 class ContentCache { | 20 class ContentCache { |
| 20 /** | 21 /** |
| 21 * A table mapping sources to the contents of those sources. This is used to o
verride the default | 22 * A table mapping sources to the contents of those sources. This is used to o
verride the default |
| 22 * contents of a source. | 23 * contents of a source. |
| 23 */ | 24 */ |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 static bool isDartExtUri(String uriContent) => uriContent != null && uriConten
t.startsWith(_DART_EXT_SCHEME); | 93 static bool isDartExtUri(String uriContent) => uriContent != null && uriConten
t.startsWith(_DART_EXT_SCHEME); |
| 93 | 94 |
| 94 /** | 95 /** |
| 95 * The Dart SDK against which URI's are to be resolved. | 96 * The Dart SDK against which URI's are to be resolved. |
| 96 */ | 97 */ |
| 97 final DartSdk _sdk; | 98 final DartSdk _sdk; |
| 98 | 99 |
| 99 /** | 100 /** |
| 100 * The name of the `dart` scheme. | 101 * The name of the `dart` scheme. |
| 101 */ | 102 */ |
| 102 static String _DART_SCHEME = "dart"; | 103 static String DART_SCHEME = "dart"; |
| 103 | 104 |
| 104 /** | 105 /** |
| 105 * The prefix of a URI using the dart-ext scheme to reference a native code li
brary. | 106 * The prefix of a URI using the dart-ext scheme to reference a native code li
brary. |
| 106 */ | 107 */ |
| 107 static String _DART_EXT_SCHEME = "dart-ext:"; | 108 static String _DART_EXT_SCHEME = "dart-ext:"; |
| 108 | 109 |
| 109 /** | 110 /** |
| 110 * Return `true` if the given URI is a `dart:` URI. | 111 * Return `true` if the given URI is a `dart:` URI. |
| 111 * | 112 * |
| 112 * @param uri the URI being tested | 113 * @param uri the URI being tested |
| 113 * @return `true` if the given URI is a `dart:` URI | 114 * @return `true` if the given URI is a `dart:` URI |
| 114 */ | 115 */ |
| 115 static bool isDartUri(Uri uri) => _DART_SCHEME == uri.scheme; | 116 static bool isDartUri(Uri uri) => DART_SCHEME == uri.scheme; |
| 116 | 117 |
| 117 /** | 118 /** |
| 118 * Initialize a newly created resolver to resolve Dart URI's against the given
platform within the | 119 * Initialize a newly created resolver to resolve Dart URI's against the given
platform within the |
| 119 * given Dart SDK. | 120 * given Dart SDK. |
| 120 * | 121 * |
| 121 * @param sdk the Dart SDK against which URI's are to be resolved | 122 * @param sdk the Dart SDK against which URI's are to be resolved |
| 122 */ | 123 */ |
| 123 DartUriResolver(this._sdk); | 124 DartUriResolver(this._sdk); |
| 124 | 125 |
| 125 @override | |
| 126 Source fromEncoding(UriKind kind, Uri uri) { | |
| 127 if (kind == UriKind.DART_URI) { | |
| 128 return _sdk.fromEncoding(kind, uri); | |
| 129 } | |
| 130 return null; | |
| 131 } | |
| 132 | |
| 133 /** | 126 /** |
| 134 * Return the [DartSdk] against which URIs are to be resolved. | 127 * Return the [DartSdk] against which URIs are to be resolved. |
| 135 * | 128 * |
| 136 * @return the [DartSdk] against which URIs are to be resolved. | 129 * @return the [DartSdk] against which URIs are to be resolved. |
| 137 */ | 130 */ |
| 138 DartSdk get dartSdk => _sdk; | 131 DartSdk get dartSdk => _sdk; |
| 139 | 132 |
| 140 @override | 133 @override |
| 141 Source resolveAbsolute(Uri uri) { | 134 Source resolveAbsolute(Uri uri) { |
| 142 if (!isDartUri(uri)) { | 135 if (!isDartUri(uri)) { |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 @override | 285 @override |
| 293 String get fullName => _name; | 286 String get fullName => _name; |
| 294 | 287 |
| 295 @override | 288 @override |
| 296 int get modificationStamp => 0; | 289 int get modificationStamp => 0; |
| 297 | 290 |
| 298 @override | 291 @override |
| 299 String get shortName => _name; | 292 String get shortName => _name; |
| 300 | 293 |
| 301 @override | 294 @override |
| 295 Uri get uri => null; |
| 296 |
| 297 @override |
| 302 int get hashCode => _name.hashCode; | 298 int get hashCode => _name.hashCode; |
| 303 | 299 |
| 304 @override | 300 @override |
| 305 bool get isInSystemLibrary => false; | 301 bool get isInSystemLibrary => false; |
| 306 | 302 |
| 307 @override | 303 @override |
| 308 Source resolveRelative(Uri relativeUri) { | 304 Uri resolveRelativeUri(Uri relativeUri) { |
| 309 throw new UnsupportedOperationException("${_name}does not exist."); | 305 throw new UnsupportedOperationException("${_name}does not exist."); |
| 310 } | 306 } |
| 311 } | 307 } |
| 312 | 308 |
| 313 /** | 309 /** |
| 314 * The interface `Source` defines the behavior of objects representing source co
de that can be | 310 * The interface `Source` defines the behavior of objects representing source co
de that can be |
| 315 * analyzed by the analysis engine. | 311 * analyzed by the analysis engine. |
| 316 * | 312 * |
| 317 * Implementations of this interface need to be aware of some assumptions made b
y the analysis | 313 * Implementations of this interface need to be aware of some assumptions made b
y the analysis |
| 318 * engine concerning sources: | 314 * engine concerning sources: |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 | 402 |
| 407 /** | 403 /** |
| 408 * Return a short version of the name that can be displayed to the user to den
ote this source. For | 404 * Return a short version of the name that can be displayed to the user to den
ote this source. For |
| 409 * example, for a source representing a file this would typically be the name
of the file. | 405 * example, for a source representing a file this would typically be the name
of the file. |
| 410 * | 406 * |
| 411 * @return a name that can be displayed to the user to denote this source | 407 * @return a name that can be displayed to the user to denote this source |
| 412 */ | 408 */ |
| 413 String get shortName; | 409 String get shortName; |
| 414 | 410 |
| 415 /** | 411 /** |
| 412 * Return the URI from which this source was originally derived. |
| 413 * |
| 414 * @return the URI from which this source was originally derived |
| 415 */ |
| 416 Uri get uri; |
| 417 |
| 418 /** |
| 416 * Return the kind of URI from which this source was originally derived. If th
is source was | 419 * Return the kind of URI from which this source was originally derived. If th
is source was |
| 417 * created from an absolute URI, then the returned kind will reflect the schem
e of the absolute | 420 * created from an absolute URI, then the returned kind will reflect the schem
e of the absolute |
| 418 * URI. If it was created from a relative URI, then the returned kind will be
the same as the kind | 421 * URI. If it was created from a relative URI, then the returned kind will be
the same as the kind |
| 419 * of the source against which the relative URI was resolved. | 422 * of the source against which the relative URI was resolved. |
| 420 * | 423 * |
| 421 * @return the kind of URI from which this source was originally derived | 424 * @return the kind of URI from which this source was originally derived |
| 422 */ | 425 */ |
| 423 UriKind get uriKind; | 426 UriKind get uriKind; |
| 424 | 427 |
| 425 /** | 428 /** |
| 426 * Return a hash code for this source. | 429 * Return a hash code for this source. |
| 427 * | 430 * |
| 428 * @return a hash code for this source | 431 * @return a hash code for this source |
| 429 * @see Object#hashCode() | 432 * @see Object#hashCode() |
| 430 */ | 433 */ |
| 431 @override | 434 @override |
| 432 int get hashCode; | 435 int get hashCode; |
| 433 | 436 |
| 434 /** | 437 /** |
| 435 * Return `true` if this source is in one of the system libraries. | 438 * Return `true` if this source is in one of the system libraries. |
| 436 * | 439 * |
| 437 * @return `true` if this is in a system library | 440 * @return `true` if this is in a system library |
| 438 */ | 441 */ |
| 439 bool get isInSystemLibrary; | 442 bool get isInSystemLibrary; |
| 440 | 443 |
| 441 /** | 444 /** |
| 442 * Resolve the relative URI against the URI associated with this source object
. Return a | 445 * Resolve the relative URI against the URI associated with this source object
. |
| 443 * [Source] representing the URI to which it was resolved, or `null` if it | |
| 444 * could not be resolved. | |
| 445 * | 446 * |
| 446 * Note: This method is not intended for public use, it is only visible out of
necessity. It is | 447 * Note: This method is not intended for public use, it is only visible out of
necessity. It is |
| 447 * only intended to be invoked by a [SourceFactory]. Source factories will | 448 * only intended to be invoked by a [SourceFactory]. Source factories will |
| 448 * only invoke this method if the URI is relative, so implementations of this
method are not | 449 * only invoke this method if the URI is relative, so implementations of this
method are not |
| 449 * required to, and generally do not, verify the argument. The result of invok
ing this method with | 450 * required to, and generally do not, verify the argument. The result of invok
ing this method with |
| 450 * an absolute URI is intentionally left unspecified. | 451 * an absolute URI is intentionally left unspecified. |
| 451 * | 452 * |
| 452 * @param relativeUri the relative URI to be resolved against the containing s
ource | 453 * @param relativeUri the relative URI to be resolved against this source |
| 453 * @return a [Source] representing the URI to which given URI was resolved | 454 * @return the URI to which given URI was resolved |
| 455 * @throws AnalysisException if the relative URI could not be resolved |
| 454 */ | 456 */ |
| 455 Source resolveRelative(Uri relativeUri); | 457 Uri resolveRelativeUri(Uri relativeUri); |
| 456 } | 458 } |
| 457 | 459 |
| 458 /** | 460 /** |
| 459 * The interface `SourceContainer` is used by clients to define a collection of
sources | 461 * The interface `SourceContainer` is used by clients to define a collection of
sources |
| 460 * | 462 * |
| 461 * Source containers are not used within analysis engine, but can be used by cli
ents to group | 463 * Source containers are not used within analysis engine, but can be used by cli
ents to group |
| 462 * sources for the purposes of accessing composite dependency information. For e
xample, the Eclipse | 464 * sources for the purposes of accessing composite dependency information. For e
xample, the Eclipse |
| 463 * client uses source containers to represent Eclipse projects, which allows it
to easily compute | 465 * client uses source containers to represent Eclipse projects, which allows it
to easily compute |
| 464 * project-level dependencies. | 466 * project-level dependencies. |
| 465 */ | 467 */ |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 * | 508 * |
| 507 * @param absoluteUri the absolute URI to be resolved | 509 * @param absoluteUri the absolute URI to be resolved |
| 508 * @return a source object representing the absolute URI | 510 * @return a source object representing the absolute URI |
| 509 */ | 511 */ |
| 510 Source forUri(String absoluteUri) { | 512 Source forUri(String absoluteUri) { |
| 511 try { | 513 try { |
| 512 Uri uri = parseUriWithException(absoluteUri); | 514 Uri uri = parseUriWithException(absoluteUri); |
| 513 if (uri.isAbsolute) { | 515 if (uri.isAbsolute) { |
| 514 return _internalResolveUri(null, uri); | 516 return _internalResolveUri(null, uri); |
| 515 } | 517 } |
| 516 } on URISyntaxException catch (exception) { | 518 } catch (exception) { |
| 519 AnalysisEngine.instance.logger.logError2("Could not resolve URI: ${absolut
eUri}", exception); |
| 517 } | 520 } |
| 518 return null; | 521 return null; |
| 519 } | 522 } |
| 523 |
| 524 /** |
| 525 * Return a source object representing the given absolute URI, or `null` if th
e URI is not |
| 526 * an absolute URI. |
| 527 * |
| 528 * @param absoluteUri the absolute URI to be resolved |
| 529 * @return a source object representing the absolute URI |
| 530 */ |
| 531 Source forUri2(Uri absoluteUri) { |
| 532 if (absoluteUri.isAbsolute) { |
| 533 try { |
| 534 return _internalResolveUri(null, absoluteUri); |
| 535 } on AnalysisException catch (exception, stackTrace) { |
| 536 AnalysisEngine.instance.logger.logError2("Could not resolve URI: ${absol
uteUri}", new CaughtException(exception, stackTrace)); |
| 537 } |
| 538 } |
| 539 return null; |
| 540 } |
| 520 | 541 |
| 521 /** | 542 /** |
| 522 * Return a source object that is equal to the source object used to obtain th
e given encoding. | 543 * Return a source object that is equal to the source object used to obtain th
e given encoding. |
| 523 * | 544 * |
| 524 * @param encoding the encoding of a source object | 545 * @param encoding the encoding of a source object |
| 525 * @return a source object that is described by the given encoding | 546 * @return a source object that is described by the given encoding |
| 526 * @throws IllegalArgumentException if the argument is not a valid encoding | 547 * @throws IllegalArgumentException if the argument is not a valid encoding |
| 527 * @see Source#getEncoding() | 548 * @see Source#getEncoding() |
| 528 */ | 549 */ |
| 529 Source fromEncoding(String encoding) { | 550 Source fromEncoding(String encoding) { |
| 530 if (encoding.length < 2) { | 551 Source source = forUri(encoding); |
| 531 throw new IllegalArgumentException("Invalid encoding length"); | 552 if (source == null) { |
| 553 throw new IllegalArgumentException("Invalid source encoding: ${encoding}")
; |
| 532 } | 554 } |
| 533 UriKind kind = UriKind.fromEncoding(encoding.codeUnitAt(0)); | 555 return source; |
| 534 if (kind == null) { | |
| 535 throw new IllegalArgumentException("Invalid source kind in encoding: ${kin
d}"); | |
| 536 } | |
| 537 try { | |
| 538 Uri uri = parseUriWithException(encoding.substring(1)); | |
| 539 for (UriResolver resolver in _resolvers) { | |
| 540 Source result = resolver.fromEncoding(kind, uri); | |
| 541 if (result != null) { | |
| 542 return result; | |
| 543 } | |
| 544 } | |
| 545 throw new IllegalArgumentException("No resolver for kind: ${kind}"); | |
| 546 } catch (exception) { | |
| 547 throw new IllegalArgumentException("Invalid URI in encoding"); | |
| 548 } | |
| 549 } | 556 } |
| 550 | 557 |
| 551 /** | 558 /** |
| 552 * Return the [DartSdk] associated with this [SourceFactory], or `null` if the
re | 559 * Return the [DartSdk] associated with this [SourceFactory], or `null` if the
re |
| 553 * is no such SDK. | 560 * is no such SDK. |
| 554 * | 561 * |
| 555 * @return the [DartSdk] associated with this [SourceFactory], or `null` if | 562 * @return the [DartSdk] associated with this [SourceFactory], or `null` if |
| 556 * there is no such SDK | 563 * there is no such SDK |
| 557 */ | 564 */ |
| 558 DartSdk get dartSdk { | 565 DartSdk get dartSdk { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 583 * @param containedUri the (possibly relative) URI to be resolved against the
containing source | 590 * @param containedUri the (possibly relative) URI to be resolved against the
containing source |
| 584 * @return the source representing the contained URI | 591 * @return the source representing the contained URI |
| 585 */ | 592 */ |
| 586 Source resolveUri(Source containingSource, String containedUri) { | 593 Source resolveUri(Source containingSource, String containedUri) { |
| 587 if (containedUri == null || containedUri.isEmpty) { | 594 if (containedUri == null || containedUri.isEmpty) { |
| 588 return null; | 595 return null; |
| 589 } | 596 } |
| 590 try { | 597 try { |
| 591 // Force the creation of an escaped URI to deal with spaces, etc. | 598 // Force the creation of an escaped URI to deal with spaces, etc. |
| 592 return _internalResolveUri(containingSource, parseUriWithException(contain
edUri)); | 599 return _internalResolveUri(containingSource, parseUriWithException(contain
edUri)); |
| 593 } on URISyntaxException catch (exception) { | 600 } catch (exception) { |
| 601 AnalysisEngine.instance.logger.logError2("Could not resolve URI (${contain
edUri}) relative to source (${containingSource.fullName})", exception); |
| 594 return null; | 602 return null; |
| 595 } | 603 } |
| 596 } | 604 } |
| 597 | 605 |
| 598 /** | 606 /** |
| 599 * Return an absolute URI that represents the given source, or `null` if a val
id URI cannot | 607 * Return an absolute URI that represents the given source, or `null` if a val
id URI cannot |
| 600 * be computed. | 608 * be computed. |
| 601 * | 609 * |
| 602 * @param source the source to get URI for | 610 * @param source the source to get URI for |
| 603 * @return the absolute URI representing the given source | 611 * @return the absolute URI representing the given source |
| (...skipping 13 matching lines...) Expand all Loading... |
| 617 * | 625 * |
| 618 * @param localSourcePredicate the predicate to determine is [Source] is local | 626 * @param localSourcePredicate the predicate to determine is [Source] is local |
| 619 */ | 627 */ |
| 620 void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) { | 628 void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) { |
| 621 this._localSourcePredicate = localSourcePredicate; | 629 this._localSourcePredicate = localSourcePredicate; |
| 622 } | 630 } |
| 623 | 631 |
| 624 /** | 632 /** |
| 625 * Return a source object representing the URI that results from resolving the
given (possibly | 633 * Return a source object representing the URI that results from resolving the
given (possibly |
| 626 * relative) contained URI against the URI associated with an existing source
object, or | 634 * relative) contained URI against the URI associated with an existing source
object, or |
| 627 * `null` if either the contained URI is invalid or if it cannot be resolved a
gainst the | 635 * `null` if the URI could not be resolved. |
| 628 * source object's URI. | |
| 629 * | 636 * |
| 630 * @param containingSource the source containing the given URI | 637 * @param containingSource the source containing the given URI |
| 631 * @param containedUri the (possibly relative) URI to be resolved against the
containing source | 638 * @param containedUri the (possibly relative) URI to be resolved against the
containing source |
| 632 * @return the source representing the contained URI | 639 * @return the source representing the contained URI |
| 640 * @throws AnalysisException if either the contained URI is invalid or if it c
annot be resolved |
| 641 * against the source object's URI |
| 633 */ | 642 */ |
| 634 Source _internalResolveUri(Source containingSource, Uri containedUri) { | 643 Source _internalResolveUri(Source containingSource, Uri containedUri) { |
| 635 if (containedUri.isAbsolute) { | 644 if (!containedUri.isAbsolute) { |
| 636 for (UriResolver resolver in _resolvers) { | 645 if (containingSource == null) { |
| 637 Source result = resolver.resolveAbsolute(containedUri); | 646 throw new AnalysisException("Cannot resolve a relative URI without a con
taining source: ${containedUri}"); |
| 638 if (result != null) { | |
| 639 return result; | |
| 640 } | |
| 641 } | 647 } |
| 642 return null; | 648 containedUri = containingSource.resolveRelativeUri(containedUri); |
| 643 } else { | |
| 644 return containingSource.resolveRelative(containedUri); | |
| 645 } | 649 } |
| 650 for (UriResolver resolver in _resolvers) { |
| 651 Source result = resolver.resolveAbsolute(containedUri); |
| 652 if (result != null) { |
| 653 return result; |
| 654 } |
| 655 } |
| 656 return null; |
| 646 } | 657 } |
| 647 } | 658 } |
| 648 | 659 |
| 649 /** | 660 /** |
| 650 * The enumeration `SourceKind` defines the different kinds of sources that are
known to the | 661 * The enumeration `SourceKind` defines the different kinds of sources that are
known to the |
| 651 * analysis engine. | 662 * analysis engine. |
| 652 */ | 663 */ |
| 653 class SourceKind extends Enum<SourceKind> { | 664 class SourceKind extends Enum<SourceKind> { |
| 654 /** | 665 /** |
| 655 * A source containing HTML. The HTML might or might not contain Dart scripts. | 666 * A source containing HTML. The HTML might or might not contain Dart scripts. |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal); | 892 const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal); |
| 882 } | 893 } |
| 883 | 894 |
| 884 /** | 895 /** |
| 885 * The abstract class `UriResolver` defines the behavior of objects that are use
d to resolve | 896 * The abstract class `UriResolver` defines the behavior of objects that are use
d to resolve |
| 886 * URI's for a source factory. Subclasses of this class are expected to resolve
a single scheme of | 897 * URI's for a source factory. Subclasses of this class are expected to resolve
a single scheme of |
| 887 * absolute URI. | 898 * absolute URI. |
| 888 */ | 899 */ |
| 889 abstract class UriResolver { | 900 abstract class UriResolver { |
| 890 /** | 901 /** |
| 891 * If this resolver should be used for URI's of the given kind, resolve the gi
ven absolute URI. | |
| 892 * The URI does not need to have the scheme handled by this resolver if the ki
nd matches. Return a | |
| 893 * [Source] representing the file to which it was resolved, whether or not the | |
| 894 * resulting source exists, or `null` if it could not be resolved because the
URI is | |
| 895 * invalid. | |
| 896 * | |
| 897 * @param kind the kind of URI that was originally resolved in order to produc
e an encoding with | |
| 898 * the given URI | |
| 899 * @param uri the URI to be resolved | |
| 900 * @return a [Source] representing the file to which given URI was resolved | |
| 901 */ | |
| 902 Source fromEncoding(UriKind kind, Uri uri); | |
| 903 | |
| 904 /** | |
| 905 * Resolve the given absolute URI. Return a [Source] representing the file to
which | 902 * Resolve the given absolute URI. Return a [Source] representing the file to
which |
| 906 * it was resolved, whether or not the resulting source exists, or `null` if i
t could not be | 903 * it was resolved, whether or not the resulting source exists, or `null` if i
t could not be |
| 907 * resolved because the URI is invalid. | 904 * resolved because the URI is invalid. |
| 908 * | 905 * |
| 909 * @param uri the URI to be resolved | 906 * @param uri the URI to be resolved |
| 910 * @return a [Source] representing the file to which given URI was resolved | 907 * @return a [Source] representing the file to which given URI was resolved |
| 911 */ | 908 */ |
| 912 Source resolveAbsolute(Uri uri); | 909 Source resolveAbsolute(Uri uri); |
| 913 | 910 |
| 914 /** | 911 /** |
| 915 * Return an absolute URI that represents the given source, or `null` if a val
id URI cannot | 912 * Return an absolute URI that represents the given source, or `null` if a val
id URI cannot |
| 916 * be computed. | 913 * be computed. |
| 917 * | 914 * |
| 918 * @param source the source to get URI for | 915 * @param source the source to get URI for |
| 919 * @return the absolute URI representing the given source | 916 * @return the absolute URI representing the given source |
| 920 */ | 917 */ |
| 921 Uri restoreAbsolute(Source source) => null; | 918 Uri restoreAbsolute(Source source) => null; |
| 922 } | 919 } |
| OLD | NEW |