Switch to using AnalysisContext.getLineInfo
diff --git a/lib/src/transformer/error_listener.dart b/lib/src/transformer/error_listener.dart
index 89dbdc5..cfa3ef6 100644
--- a/lib/src/transformer/error_listener.dart
+++ b/lib/src/transformer/error_listener.dart
@@ -4,12 +4,10 @@
 
 library dev_compiler.src.transformer.error_listener;
 
-import 'dart:math';
-
 import 'package:analyzer/analyzer.dart'
     show AnalysisError, ErrorSeverity, AnalysisErrorListener;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:barback/barback.dart' show TransformLogger, AssetId;
-import 'package:collection/collection.dart';
 import 'package:source_span/source_span.dart' show SourceSpan, SourceLocation;
 
 import 'uri_resolver.dart';
@@ -18,28 +16,18 @@
 
 class TransformAnalysisErrorListener extends AnalysisErrorListener {
   final TransformLogger _logger;
-  LocationHelper _lastLocationHelper;
-  TransformAnalysisErrorListener(this._logger);
-
-  /// Get a location helper for the provided [content] with [uri].
-  /// Multiple subsequent calls with the same [uri] will return the same cached
-  /// instance, to accommodate the use-case of a file having many messages.
-  LocationHelper _getLocationHelper(String content, String uri) {
-    if (_lastLocationHelper?.uri != uri) {
-      _lastLocationHelper = new LocationHelper(content, uri);
-    }
-    return _lastLocationHelper;
-  }
+  final AnalysisContext _context;
+  TransformAnalysisErrorListener(this._logger, this._context);
 
   @override
   void onError(AnalysisError error) {
     var content = error.source.contents.data;
     var sourceUrl = error.source.uri.toString();
-    var locationHelper = _getLocationHelper(content, sourceUrl);
+    var lineInfo = _context.getLineInfo(error.source);
     SourceLocation makeLocation(int offset) {
-      var location = locationHelper.getLocation(offset);
+      var location = lineInfo.getLocation(offset);
       return new SourceLocation(offset,
-          sourceUrl: sourceUrl, line: location.line, column: location.column);
+          sourceUrl: sourceUrl, line: location.lineNumber, column: location.columnNumber);
     }
     int start = error.offset;
     int end = error.offset + error.length;
@@ -66,49 +54,3 @@
     }
   }
 }
-
-/// A simple source location.
-class Location {
-  final int line;
-  final int column;
-  Location(this.line, this.column);
-
-  operator==(other) =>
-      other is Location && line == other.line && column == other.column;
-  get hashCode => line.hashCode ^ column.hashCode;
-}
-
-// TODO(ochafik): Drop when https://github.com/dart-lang/sdk/issues/25717 fixed.
-/// Helper that computes line & column from an offset in log time.
-class LocationHelper {
-  final String _content;
-  final String uri;
-  final _lineOffsets = <int>[];
-
-  LocationHelper(String content, this.uri) : _content = content {
-    _lineOffsets.add(0);
-    for (int i = 0, length = content.length; i < length; i++) {
-      switch (content[i]) {
-        case '\n':
-          // Consume any trailing carriage return.
-          while (i < length - 1 && content[i + 1] == '\r') {
-            i++;
-          }
-          _lineOffsets.add(i + 1);
-          break;
-      }
-    }
-  }
-
-  /// Gets the location that corresponds to the [offset] in this helper's
-  /// [_content] string.
-  Location getLocation(int offset) {
-    var lineIndex = lowerBound(_lineOffsets, offset);
-    lineIndex = min(lineIndex, _lineOffsets.length - 1);
-    if (_lineOffsets[lineIndex] > offset) lineIndex--;
-
-    int line = lineIndex + 1;
-    int column = offset - _lineOffsets[lineIndex] + 1;
-    return new Location(line, column);
-  }
-}
diff --git a/lib/src/transformer/transformer.dart b/lib/src/transformer/transformer.dart
index 44a198f..08a0c2a 100644
--- a/lib/src/transformer/transformer.dart
+++ b/lib/src/transformer/transformer.dart
@@ -70,7 +70,7 @@
             '--runtime-dir',
             _fakeRuntimeDir
           ])),
-        reporter: new TransformAnalysisErrorListener(transform.logger),
+        reporter: new TransformAnalysisErrorListener(transform.logger, context),
         fileSystem: fileSystem);
 
     for (var asset in inputs) {
diff --git a/test/transformer_test.dart b/test/transformer_test.dart
index 328496f..07c19e7 100644
--- a/test/transformer_test.dart
+++ b/test/transformer_test.dart
@@ -3,7 +3,6 @@
 import 'package:barback/barback.dart' show BarbackMode, BarbackSettings;
 import 'package:dev_compiler/transformer.dart';
 import 'package:dev_compiler/src/compiler.dart' show defaultRuntimeFiles;
-import 'package:dev_compiler/src/transformer/error_listener.dart';
 import 'package:test/test.dart';
 import 'package:transformer_test/utils.dart';
 
@@ -94,23 +93,4 @@
           "error: Type check failed: '2' (String) is not of type int (package:foo/Foo.dart 3 19)"
         ]);
   });
-
-  group('$LocationHelper', () {
-    getLocation(String content, int offset) =>
-        new LocationHelper(content, '').getLocation(offset);
-
-    test('finds lines and columns', () {
-      expect(getLocation('', 0), new Location(1, 1));
-      expect(getLocation(' ', 1), new Location(1, 2));
-      expect(getLocation('\n', 0), new Location(1, 1));
-      expect(getLocation(' \n', 1), new Location(1, 2));
-      expect(getLocation('\n', 1), new Location(2, 1));
-      expect(getLocation(' \n', 2), new Location(2, 1));
-      expect(getLocation('\n\n', 1), new Location(2, 1));
-      expect(getLocation(' \n\n', 2), new Location(2, 1));
-      expect(getLocation(' \n \n', 2), new Location(2, 1));
-      expect(getLocation(' \n \n', 3), new Location(2, 2));
-      expect(getLocation(' \n \n', 4), new Location(3, 1));
-    });
-  });
 }