| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library dart2js.diagnostics.code_location; |
| |
| import '../util/uri_extras.dart' as uri_extras show relativize; |
| |
| /// [CodeLocation] divides uris into different classes. |
| /// |
| /// These are used to group uris from user code, platform libraries and |
| /// packages. |
| abstract class CodeLocation { |
| /// Returns `true` if [uri] is in this code location. |
| bool inSameLocation(Uri uri); |
| |
| /// Returns the uri of this location relative to [baseUri]. |
| String relativize(Uri baseUri); |
| |
| factory CodeLocation(Uri uri) { |
| if (uri.scheme == 'package') { |
| int slashPos = uri.path.indexOf('/'); |
| if (slashPos != -1) { |
| String packageName = uri.path.substring(0, slashPos); |
| return new PackageLocation(packageName); |
| } else { |
| return new UriLocation(uri); |
| } |
| } else { |
| return new SchemeLocation(uri); |
| } |
| } |
| } |
| |
| /// A code location defined by the scheme of the uri. |
| /// |
| /// Used for non-package uris, such as 'dart', 'file', and 'http'. |
| class SchemeLocation implements CodeLocation { |
| final Uri uri; |
| |
| SchemeLocation(this.uri); |
| |
| bool inSameLocation(Uri uri) { |
| return this.uri.scheme == uri.scheme; |
| } |
| |
| String relativize(Uri baseUri) { |
| return uri_extras.relativize(baseUri, uri, false); |
| } |
| } |
| |
| /// A code location defined by the package name. |
| /// |
| /// Used for package uris, separated by their `package names`, that is, the |
| /// 'foo' of 'package:foo/bar.dart'. |
| class PackageLocation implements CodeLocation { |
| final String packageName; |
| |
| PackageLocation(this.packageName); |
| |
| bool inSameLocation(Uri uri) { |
| return uri.scheme == 'package' && uri.path.startsWith('$packageName/'); |
| } |
| |
| String relativize(Uri baseUri) => 'package:$packageName'; |
| } |
| |
| /// A code location defined by the whole uri. |
| /// |
| /// Used for package uris with no package name. For instance 'package:foo.dart'. |
| class UriLocation implements CodeLocation { |
| final Uri uri; |
| |
| UriLocation(this.uri); |
| |
| bool inSameLocation(Uri uri) => this.uri == uri; |
| |
| String relativize(Uri baseUri) { |
| return uri_extras.relativize(baseUri, uri, false); |
| } |
| } |
| |
| /// A code location that contains any uri. |
| class AnyLocation implements CodeLocation { |
| const AnyLocation(); |
| |
| bool inSameLocation(Uri uri) => true; |
| |
| String relativize(Uri baseUri) => '$baseUri'; |
| } |