Chromium Code Reviews| Index: lib/src/location_mixin.dart |
| diff --git a/lib/src/location_mixin.dart b/lib/src/location_mixin.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1bb2556ecddd61f041ce73f71dda9dde767a08ce |
| --- /dev/null |
| +++ b/lib/src/location_mixin.dart |
| @@ -0,0 +1,50 @@ |
| +// Copyright (c) 2015, 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 source_span.location_mixin; |
| + |
| +import 'location.dart'; |
| +import 'span.dart'; |
| + |
| +// Note: this class duplicates a lot of functionality of [SourceLocation]. This |
| +// is because in order for SourceLocation to use SourceLocationMixin, |
| +// SourceLocationMixin couldn't implement SourceLocation. In SourceSpan we |
| +// handle this by making the class itself non-extensible, but that would be a |
| +// breaking change for SourceLocation. So until we want to endure the pain of |
| +// cutting a release with breaking changes, we duplicate the code here. |
| + |
| +/// A mixin for easily implementing [SourceLocation]. |
| +abstract class SourceLocationMixin implements SourceLocation { |
| + String get toolString { |
| + var source = sourceUrl == null ? 'unknown source' : sourceUrl; |
| + return '$source:${line + 1}:${column + 1}'; |
| + } |
| + |
| + int distance(SourceLocation other) { |
| + if (sourceUrl != other.sourceUrl) { |
| + throw new ArgumentError("Source URLs \"${sourceUrl}\" and " |
| + "\"${other.sourceUrl}\" don't match."); |
| + } |
| + return (offset - other.offset).abs(); |
| + } |
| + |
| + SourceSpan pointSpan() => new SourceSpan(this, this, ""); |
| + |
| + int compareTo(SourceLocation other) { |
| + if (sourceUrl != other.sourceUrl) { |
| + throw new ArgumentError("Source URLs \"${sourceUrl}\" and " |
| + "\"${other.sourceUrl}\" don't match."); |
| + } |
| + return offset - other.offset; |
| + } |
| + |
| + bool operator ==(other) => |
| + other is SourceLocation && sourceUrl == other.sourceUrl && |
|
Bob Nystrom
2015/09/02 19:39:50
Split after the first "&&" too.
nweiz
2015/09/02 20:33:05
Done.
|
| + offset == other.offset; |
| + |
| + int get hashCode => sourceUrl.hashCode + offset; |
| + |
| + String toString() => '<$runtimeType: $offset $toolString>'; |
| +} |
| + |