blob: 638a92352e9b040be27c283e1da39fb9e85bc1eb [file] [log] [blame]
// 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.source_span;
import 'package:front_end/src/fasta/scanner.dart' show Token;
import '../tree/tree.dart' show Node;
import 'spannable.dart' show Spannable;
class SourceSpan implements Spannable {
final Uri uri;
final int begin;
final int end;
const SourceSpan(this.uri, this.begin, this.end);
factory SourceSpan.fromNode(Uri uri, Node node) {
return new SourceSpan.fromTokens(
uri, node.getBeginToken(), node.getPrefixEndToken());
factory SourceSpan.fromTokens(Uri uri, Token begin, Token end) {
final beginOffset = begin.charOffset;
final endOffset = end.charOffset + end.charCount;
// [begin] and [end] might be the same for the same empty token. This
// happens for instance when scanning '$$'.
assert(endOffset >= beginOffset);
return new SourceSpan(uri, beginOffset, endOffset);
int get hashCode {
return 13 * uri.hashCode + 17 * begin.hashCode + 19 * end.hashCode;
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! SourceSpan) return false;
return uri == other.uri && begin == other.begin && end == other.end;
String toString() => 'SourceSpan($uri, $begin, $end)';