Index: pkg/compiler/lib/src/io/source_information.dart |
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart |
index a84d8bfe55077ba296029051e1fa237ade3d80b2..2b01ba12b585de0ad27c5f8b65d432c5b816c4ab 100644 |
--- a/pkg/compiler/lib/src/io/source_information.dart |
+++ b/pkg/compiler/lib/src/io/source_information.dart |
@@ -154,35 +154,25 @@ class SourceInformationBuilder { |
/// A location in a source file. |
abstract class SourceLocation { |
- final SourceFile _sourceFile; |
- int _line; |
- |
- SourceLocation(this._sourceFile) { |
- assert(invariant(new SourceSpan(sourceUri, 0, 0), isValid, |
- message: "Invalid source location in ${sourceUri}: " |
- "offset=$offset, length=${_sourceFile.length}.")); |
- } |
+ const SourceLocation(); |
/// The absolute URI of the source file of this source location. |
- Uri get sourceUri => _sourceFile.uri; |
+ Uri get sourceUri; |
/// The character offset of the this source location into the source file. |
int get offset; |
/// The 0-based line number of the [offset]. |
- int get line { |
- if (_line == null) _line = _sourceFile.getLine(offset); |
- return _line; |
- } |
+ int get line; |
/// The 0-base column number of the [offset] with its line. |
- int get column => _sourceFile.getColumn(line, offset); |
+ int get column; |
/// The name associated with this source location, if any. |
String get sourceName; |
/// `true` if the offset within the length of the source file. |
- bool get isValid => offset < _sourceFile.length; |
+ bool get isValid; |
int get hashCode { |
return sourceUri.hashCode * 17 + |
@@ -209,7 +199,50 @@ abstract class SourceLocation { |
} |
} |
-class OffsetSourceLocation extends SourceLocation { |
+/// A location in a source file. |
+abstract class AbstractSourceLocation extends SourceLocation { |
+ final SourceFile _sourceFile; |
+ int _line; |
+ |
+ AbstractSourceLocation(this._sourceFile) { |
+ assert(invariant(new SourceSpan(sourceUri, 0, 0), isValid, |
+ message: "Invalid source location in ${sourceUri}: " |
+ "offset=$offset, length=${_sourceFile.length}.")); |
+ } |
+ |
+ /// The absolute URI of the source file of this source location. |
+ Uri get sourceUri => _sourceFile.uri; |
+ |
+ /// The character offset of the this source location into the source file. |
+ int get offset; |
+ |
+ /// The 0-based line number of the [offset]. |
+ int get line { |
+ if (_line == null) _line = _sourceFile.getLine(offset); |
+ return _line; |
+ } |
+ |
+ /// The 0-base column number of the [offset] with its line. |
+ int get column => _sourceFile.getColumn(line, offset); |
+ |
+ /// The name associated with this source location, if any. |
+ String get sourceName; |
+ |
+ /// `true` if the offset within the length of the source file. |
+ bool get isValid => offset < _sourceFile.length; |
+ |
+ String get shortText { |
+ // Use 1-based line/column info to match usual dart tool output. |
+ return '${sourceUri.pathSegments.last}:[${line + 1},${column + 1}]'; |
+ } |
+ |
+ String toString() { |
+ // Use 1-based line/column info to match usual dart tool output. |
+ return '${sourceUri}:[${line + 1},${column + 1}]'; |
+ } |
+} |
+ |
+class OffsetSourceLocation extends AbstractSourceLocation { |
final int offset; |
final String sourceName; |
@@ -282,3 +315,29 @@ SourceFile computeSourceFile(ResolvedAst resolvedAst) { |
} |
return sourceFile; |
} |
+ |
+class NoSourceLocationMarker extends SourceLocation { |
+ const NoSourceLocationMarker(); |
+ |
+ @override |
+ Uri get sourceUri => null; |
+ |
+ @override |
+ bool get isValid => true; |
+ |
+ @override |
+ String get sourceName => null; |
+ |
+ @override |
+ int get column => null; |
+ |
+ @override |
+ int get line => null; |
+ |
+ @override |
+ int get offset => null; |
+ |
+ String get shortName => '<no-location>'; |
+ |
+ String toString() => '<no-location>'; |
+} |