diff --git a/CHANGELOG.md b/CHANGELOG.md
index a59cf30..366dce2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,24 +1,9 @@
+# 0.10.11-dev
+
 ## 0.10.10
 
 * Stable release for null safety.
 
-## 0.10.10-nullsafety.3
-
-* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
-  guidelines.
-
-## 0.10.10-nullsafety.2
-
-* Allow prerelease versions of the 2.12 sdk.
-
-## 0.10.10-nullsafety.1
-
-* Allow 2.10 stable and 2.11.0 dev SDK versions.
-
-## 0.10.10-nullsafety
-
-* Migrate to null safety
-
 ## 0.10.9
 
 * Fix a number of document comment issues.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 4f9dfb0..c09985a 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:pedantic/analysis_options.yaml
+include: package:lints/recommended.yaml
 
 linter:
   rules:
diff --git a/lib/parser.dart b/lib/parser.dart
index 99a3c81..e3c7179 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -313,7 +313,7 @@
     /// The file for each URL, indexed by [urls]' values.
     var files = <int, SourceFile>{};
 
-    var lineNum;
+    int? lineNum;
     late List<TargetEntry> targetEntries;
     for (var sourceEntry in sourceEntries) {
       if (lineNum == null || sourceEntry.target.line > lineNum) {
@@ -601,7 +601,10 @@
         }
         var sourceNameId = entry.sourceNameId;
         if (sourceNameId != null) {
-          buff..write(' (')..write(names[sourceNameId])..write(')');
+          buff
+            ..write(' (')
+            ..write(names[sourceNameId])
+            ..write(')');
         }
         buff.write('\n');
       }
@@ -660,11 +663,11 @@
   bool get hasTokens => index < _length - 1 && _length > 0;
 
   _TokenKind get nextKind {
-    if (!hasTokens) return _TokenKind.EOF;
+    if (!hasTokens) return _TokenKind.eof;
     var next = _internal[index + 1];
-    if (next == ';') return _TokenKind.LINE;
-    if (next == ',') return _TokenKind.SEGMENT;
-    return _TokenKind.VALUE;
+    if (next == ';') return _TokenKind.line;
+    if (next == ',') return _TokenKind.segment;
+    return _TokenKind.value;
   }
 
   int _consumeValue() => decodeVlq(this);
@@ -698,10 +701,10 @@
 }
 
 class _TokenKind {
-  static const _TokenKind LINE = _TokenKind(isNewLine: true);
-  static const _TokenKind SEGMENT = _TokenKind(isNewSegment: true);
-  static const _TokenKind EOF = _TokenKind(isEof: true);
-  static const _TokenKind VALUE = _TokenKind();
+  static const _TokenKind line = _TokenKind(isNewLine: true);
+  static const _TokenKind segment = _TokenKind(isNewSegment: true);
+  static const _TokenKind eof = _TokenKind(isEof: true);
+  static const _TokenKind value = _TokenKind();
   final bool isNewLine;
   final bool isNewSegment;
   final bool isEof;
diff --git a/lib/printer.dart b/lib/printer.dart
index 922c7fe..7d128f7 100644
--- a/lib/printer.dart
+++ b/lib/printer.dart
@@ -9,9 +9,7 @@
 
 import 'builder.dart';
 import 'src/source_map_span.dart';
-
-const int _LF = 10;
-const int _CR = 13;
+import 'src/utils.dart';
 
 /// A simple printer that keeps track of offset locations and records source
 /// maps locations.
@@ -43,7 +41,9 @@
     var length = chars.length;
     for (var i = 0; i < length; i++) {
       var c = chars[i];
-      if (c == _LF || (c == _CR && (i + 1 == length || chars[i + 1] != _LF))) {
+      if (c == lineFeed ||
+          (c == carriageReturn &&
+              (i + 1 == length || chars[i + 1] != lineFeed))) {
         // Return not followed by line-feed is treated as a new line.
         _line++;
         _column = 0;
@@ -130,7 +130,7 @@
 
   /// Item used to indicate that the following item is copied from the original
   /// source code, and hence we should preserve source-maps on every new line.
-  static final _ORIGINAL = Object();
+  static final _original = Object();
 
   NestedPrinter([this.indent = 0]);
 
@@ -156,7 +156,7 @@
       assert(location == null || span == null);
       if (location != null) _items.add(location);
       if (span != null) _items.add(span);
-      if (isOriginal) _items.add(_ORIGINAL);
+      if (isOriginal) _items.add(_original);
     }
 
     if (object is String) {
@@ -243,7 +243,7 @@
         propagate = false;
       } else if (item is SourceLocation || item is SourceSpan) {
         printer.mark(item);
-      } else if (item == _ORIGINAL) {
+      } else if (item == _original) {
         // we insert booleans when we are about to quote text that was copied
         // from the original source. In such case, we will propagate marks on
         // every new-line.
diff --git a/lib/refactor.dart b/lib/refactor.dart
index 64fd610..97bd2a7 100644
--- a/lib/refactor.dart
+++ b/lib/refactor.dart
@@ -11,6 +11,7 @@
 import 'package:source_span/source_span.dart';
 
 import 'printer.dart';
+import 'src/utils.dart';
 
 /// Editable text transaction.
 ///
@@ -65,7 +66,9 @@
           ..write(consumed)
           ..write(' input characters. List of edits:');
         for (var e in _edits) {
-          sb..write('\n    ')..write(e);
+          sb
+            ..write('\n    ')
+            ..write(e);
         }
         throw UnsupportedError(sb.toString());
       }
@@ -91,7 +94,7 @@
   final int end;
 
   /// The replacement used by the edit, can be a string or a [NestedPrinter].
-  final replace;
+  final Object replace;
 
   _TextEdit(this.begin, this.end, this.replace);
 
@@ -114,7 +117,7 @@
   var lineStart = 0;
   for (var i = charOffset - 1; i >= 0; i--) {
     var c = code.codeUnitAt(i);
-    if (c == _LF || c == _CR) {
+    if (c == lineFeed || c == carriageReturn) {
       lineStart = i + 1;
       break;
     }
@@ -124,7 +127,7 @@
   var whitespaceEnd = code.length;
   for (var i = lineStart; i < code.length; i++) {
     var c = code.codeUnitAt(i);
-    if (c != _SPACE && c != _TAB) {
+    if (c != _space && c != _tab) {
       whitespaceEnd = i;
       break;
     }
@@ -133,7 +136,5 @@
   return code.substring(lineStart, whitespaceEnd);
 }
 
-const int _CR = 13;
-const int _LF = 10;
-const int _TAB = 9;
-const int _SPACE = 32;
+const int _tab = 9;
+const int _space = 32;
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index f9870d2..eb23834 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -27,3 +27,6 @@
   }
   return max;
 }
+
+const int lineFeed = 10;
+const int carriageReturn = 13;
diff --git a/lib/src/vlq.dart b/lib/src/vlq.dart
index 951ea8b..6c41b6e 100644
--- a/lib/src/vlq.dart
+++ b/lib/src/vlq.dart
@@ -14,31 +14,31 @@
 
 import 'dart:math';
 
-const int VLQ_BASE_SHIFT = 5;
+const int vlqBaseShift = 5;
 
-const int VLQ_BASE_MASK = (1 << 5) - 1;
+const int vlqBaseMask = (1 << 5) - 1;
 
-const int VLQ_CONTINUATION_BIT = 1 << 5;
+const int vlqContinuationBit = 1 << 5;
 
-const int VLQ_CONTINUATION_MASK = 1 << 5;
+const int vlqContinuationMask = 1 << 5;
 
-const String BASE64_DIGITS =
+const String base64Digits =
     'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
 
 final Map<String, int> _digits = () {
   var map = <String, int>{};
   for (var i = 0; i < 64; i++) {
-    map[BASE64_DIGITS[i]] = i;
+    map[base64Digits[i]] = i;
   }
   return map;
 }();
 
-final int MAX_INT32 = (pow(2, 31) as int) - 1;
-final int MIN_INT32 = -(pow(2, 31) as int);
+final int maxInt32 = (pow(2, 31) as int) - 1;
+final int minInt32 = -(pow(2, 31) as int);
 
 /// Creates the VLQ encoding of [value] as a sequence of characters
 Iterable<String> encodeVlq(int value) {
-  if (value < MIN_INT32 || value > MAX_INT32) {
+  if (value < minInt32 || value > maxInt32) {
     throw ArgumentError('expected 32 bit int, got: $value');
   }
   var res = <String>[];
@@ -49,12 +49,12 @@
   }
   value = (value << 1) | signBit;
   do {
-    var digit = value & VLQ_BASE_MASK;
-    value >>= VLQ_BASE_SHIFT;
+    var digit = value & vlqBaseMask;
+    value >>= vlqBaseShift;
     if (value > 0) {
-      digit |= VLQ_CONTINUATION_BIT;
+      digit |= vlqContinuationBit;
     }
-    res.add(BASE64_DIGITS[digit]);
+    res.add(base64Digits[digit]);
   } while (value > 0);
   return res;
 }
@@ -62,7 +62,7 @@
 /// Decodes a value written as a sequence of VLQ characters. The first input
 /// character will be `chars.current` after calling `chars.moveNext` once. The
 /// iterator is advanced until a stop character is found (a character without
-/// the [VLQ_CONTINUATION_BIT]).
+/// the [vlqContinuationBit]).
 int decodeVlq(Iterator<String> chars) {
   var result = 0;
   var stop = false;
@@ -74,10 +74,10 @@
     if (digit == null) {
       throw FormatException('invalid character in VLQ encoding: $char');
     }
-    stop = (digit & VLQ_CONTINUATION_BIT) == 0;
-    digit &= VLQ_BASE_MASK;
+    stop = (digit & vlqContinuationBit) == 0;
+    digit &= vlqBaseMask;
     result += (digit << shift);
-    shift += VLQ_BASE_SHIFT;
+    shift += vlqBaseShift;
   }
 
   // Result uses the least significant bit as a sign bit. We convert it into a
@@ -93,7 +93,7 @@
   result = negate ? -result : result;
 
   // TODO(sigmund): can we detect this earlier?
-  if (result < MIN_INT32 || result > MAX_INT32) {
+  if (result < minInt32 || result > maxInt32) {
     throw FormatException(
         'expected an encoded 32 bit int, but we got: $result');
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index 648010a..23e53a5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,15 +1,16 @@
 name: source_maps
-version: 0.10.10
+version: 0.10.11-dev
 
 description: Library to programmatically manipulate source map files.
 homepage: https://github.com/dart-lang/source_maps
 
 environment:
-  sdk: ">=2.12.0-0 <3.0.0"
+  sdk: ">=2.12.0 <3.0.0"
 
 dependencies:
   source_span: ^1.8.0
 
 dev_dependencies:
-  test: ^1.16.0-nullsafety
-  term_glyph: ^1.2.0-nullsafety
+  lints: ^1.0.0
+  test: ^1.16.0
+  term_glyph: ^1.2.0
diff --git a/test/builder_test.dart b/test/builder_test.dart
index fddf46c..b9bb9c7 100644
--- a/test/builder_test.dart
+++ b/test/builder_test.dart
@@ -5,8 +5,10 @@
 library test.source_maps_test;
 
 import 'dart:convert';
-import 'package:test/test.dart';
+
 import 'package:source_maps/source_maps.dart';
+import 'package:test/test.dart';
+
 import 'common.dart';
 
 void main() {
@@ -17,7 +19,7 @@
           ..addSpan(inputVar2, outputVar2)
           ..addSpan(inputExpr, outputExpr))
         .build(output.url.toString());
-    expect(map, equals(EXPECTED_MAP));
+    expect(map, equals(expectedMap));
   });
 
   test('builder - with location', () {
@@ -27,6 +29,6 @@
           ..addLocation(inputVar2.start, outputVar2.start, 'longVar2')
           ..addLocation(inputExpr.start, outputExpr.start, null))
         .toJson(output.url.toString());
-    expect(str, jsonEncode(EXPECTED_MAP));
+    expect(str, jsonEncode(expectedMap));
   });
 }
diff --git a/test/common.dart b/test/common.dart
index 6ba1c67..f6139de 100644
--- a/test/common.dart
+++ b/test/common.dart
@@ -10,7 +10,7 @@
 import 'package:test/test.dart';
 
 /// Content of the source file
-const String INPUT = '''
+const String inputContent = '''
 /** this is a comment. */
 int longVar1 = 3;
 
@@ -19,7 +19,7 @@
   return longVar1 + longVar2;
 }
 ''';
-var input = SourceFile.fromString(INPUT, url: 'input.dart');
+final input = SourceFile.fromString(inputContent, url: 'input.dart');
 
 /// A span in the input file
 SourceMapSpan ispan(int start, int end, [bool isIdentifier = false]) =>
@@ -36,11 +36,11 @@
 SourceMapSpan inputExpr = ispan(108, 127);
 
 /// Content of the target file
-const String OUTPUT = '''
+const String outputContent = '''
 var x = 3;
 f(y) => x + y;
 ''';
-var output = SourceFile.fromString(OUTPUT, url: 'output.dart');
+final output = SourceFile.fromString(outputContent, url: 'output.dart');
 
 /// A span in the output file
 SourceMapSpan ospan(int start, int end, [bool isIdentifier = false]) =>
@@ -62,7 +62,7 @@
 ///
 /// This mapping is stored in the tests so we can independently test the builder
 /// and parser algorithms without relying entirely on end2end tests.
-const Map<String, dynamic> EXPECTED_MAP = {
+const Map<String, dynamic> expectedMap = {
   'version': 3,
   'sourceRoot': '',
   'sources': ['input.dart'],
diff --git a/test/end2end_test.dart b/test/end2end_test.dart
index 954339f..153fcc2 100644
--- a/test/end2end_test.dart
+++ b/test/end2end_test.dart
@@ -4,9 +4,10 @@
 
 library test.end2end_test;
 
-import 'package:test/test.dart';
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
+import 'package:test/test.dart';
+
 import 'common.dart';
 
 void main() {
@@ -106,12 +107,12 @@
   });
 
   test('printer projecting marks + parse', () {
-    var out = INPUT.replaceAll('long', '_s');
+    var out = inputContent.replaceAll('long', '_s');
     var file = SourceFile.fromString(out, url: 'output2.dart');
     var printer = Printer('output2.dart');
     printer.mark(ispan(0, 0));
 
-    var segments = INPUT.split('long');
+    var segments = inputContent.split('long');
     expect(segments.length, 6);
     printer.add(segments[0], projectMarks: true);
     printer.mark(inputVar1);
@@ -153,7 +154,7 @@
 
     // Start of the last line
     var oOffset = out.length - 2;
-    var iOffset = INPUT.length - 2;
+    var iOffset = inputContent.length - 2;
     check(file.span(oOffset, oOffset), mapping, ispan(iOffset, iOffset), true);
     check(file.span(oOffset + 1, oOffset + 1), mapping, ispan(iOffset, iOffset),
         true);
diff --git a/test/parser_test.dart b/test/parser_test.dart
index 1b3ae6f..7c7b142 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -2,15 +2,15 @@
 // 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 test.parser_test;
-
 import 'dart:convert';
-import 'package:test/test.dart';
+
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
+import 'package:test/test.dart';
+
 import 'common.dart';
 
-const Map<String, dynamic> MAP_WITH_NO_SOURCE_LOCATION = {
+const Map<String, dynamic> _mapWithNoSourceLocation = {
   'version': 3,
   'sourceRoot': '',
   'sources': ['input.dart'],
@@ -19,7 +19,7 @@
   'file': 'output.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION = {
+const Map<String, dynamic> _mapWithSourceLocation = {
   'version': 3,
   'sourceRoot': '',
   'sources': ['input.dart'],
@@ -28,7 +28,7 @@
   'file': 'output.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_MISSING_NAMES = {
+const Map<String, dynamic> _mapWithSourceLocationAndMissingNames = {
   'version': 3,
   'sourceRoot': '',
   'sources': ['input.dart'],
@@ -36,7 +36,7 @@
   'file': 'output.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME = {
+const Map<String, dynamic> _mapWithSourceLocationAndName = {
   'version': 3,
   'sourceRoot': '',
   'sources': ['input.dart'],
@@ -45,7 +45,7 @@
   'file': 'output.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_1 = {
+const Map<String, dynamic> _mapWithSourceLocationAndName1 = {
   'version': 3,
   'sourceRoot': 'pkg/',
   'sources': ['input1.dart'],
@@ -54,7 +54,7 @@
   'file': 'output.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_2 = {
+const Map<String, dynamic> _mapWithSourceLocationAndName2 = {
   'version': 3,
   'sourceRoot': 'pkg/',
   'sources': ['input2.dart'],
@@ -63,7 +63,7 @@
   'file': 'output2.dart'
 };
 
-const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_3 = {
+const Map<String, dynamic> _mapWithSourceLocationAndName3 = {
   'version': 3,
   'sourceRoot': 'pkg/',
   'sources': ['input3.dart'],
@@ -72,15 +72,15 @@
   'file': '3/output.dart'
 };
 
-const List SOURCE_MAP_BUNDLE = [
-  MAP_WITH_SOURCE_LOCATION_AND_NAME_1,
-  MAP_WITH_SOURCE_LOCATION_AND_NAME_2,
-  MAP_WITH_SOURCE_LOCATION_AND_NAME_3,
+const _sourceMapBundle = [
+  _mapWithSourceLocationAndName1,
+  _mapWithSourceLocationAndName2,
+  _mapWithSourceLocationAndName3,
 ];
 
 void main() {
   test('parse', () {
-    var mapping = parseJson(EXPECTED_MAP);
+    var mapping = parseJson(expectedMap);
     check(outputVar1, mapping, inputVar1, false);
     check(outputVar2, mapping, inputVar2, false);
     check(outputFunction, mapping, inputFunction, false);
@@ -88,7 +88,7 @@
   });
 
   test('parse + json', () {
-    var mapping = parse(jsonEncode(EXPECTED_MAP));
+    var mapping = parse(jsonEncode(expectedMap));
     check(outputVar1, mapping, inputVar1, false);
     check(outputVar2, mapping, inputVar2, false);
     check(outputFunction, mapping, inputFunction, false);
@@ -96,7 +96,7 @@
   });
 
   test('parse with file', () {
-    var mapping = parseJson(EXPECTED_MAP);
+    var mapping = parseJson(expectedMap);
     check(outputVar1, mapping, inputVar1, true);
     check(outputVar2, mapping, inputVar2, true);
     check(outputFunction, mapping, inputFunction, true);
@@ -104,7 +104,7 @@
   });
 
   test('parse with no source location', () {
-    var map = parse(jsonEncode(MAP_WITH_NO_SOURCE_LOCATION)) as SingleMapping;
+    var map = parse(jsonEncode(_mapWithNoSourceLocation)) as SingleMapping;
     expect(map.lines.length, 1);
     expect(map.lines.first.entries.length, 1);
     var entry = map.lines.first.entries.first;
@@ -117,7 +117,7 @@
   });
 
   test('parse with source location and no name', () {
-    var map = parse(jsonEncode(MAP_WITH_SOURCE_LOCATION)) as SingleMapping;
+    var map = parse(jsonEncode(_mapWithSourceLocation)) as SingleMapping;
     expect(map.lines.length, 1);
     expect(map.lines.first.entries.length, 1);
     var entry = map.lines.first.entries.first;
@@ -130,7 +130,7 @@
   });
 
   test('parse with source location and missing names entry', () {
-    var map = parse(jsonEncode(MAP_WITH_SOURCE_LOCATION_AND_MISSING_NAMES))
+    var map = parse(jsonEncode(_mapWithSourceLocationAndMissingNames))
         as SingleMapping;
     expect(map.lines.length, 1);
     expect(map.lines.first.entries.length, 1);
@@ -144,8 +144,7 @@
   });
 
   test('parse with source location and name', () {
-    var map =
-        parse(jsonEncode(MAP_WITH_SOURCE_LOCATION_AND_NAME)) as SingleMapping;
+    var map = parse(jsonEncode(_mapWithSourceLocationAndName)) as SingleMapping;
     expect(map.lines.length, 1);
     expect(map.lines.first.entries.length, 1);
     var entry = map.lines.first.entries.first;
@@ -158,7 +157,7 @@
   });
 
   test('parse with source root', () {
-    var inputMap = Map.from(MAP_WITH_SOURCE_LOCATION);
+    var inputMap = Map.from(_mapWithSourceLocation);
     inputMap['sourceRoot'] = '/pkg/';
     var mapping = parseJson(inputMap) as SingleMapping;
     expect(mapping.spanFor(0, 0)?.sourceUrl, Uri.parse('/pkg/input.dart'));
@@ -178,7 +177,7 @@
   });
 
   test('parse with map URL', () {
-    var inputMap = Map.from(MAP_WITH_SOURCE_LOCATION);
+    var inputMap = Map.from(_mapWithSourceLocation);
     inputMap['sourceRoot'] = 'pkg/';
     var mapping = parseJson(inputMap, mapUrl: 'file:///path/to/map');
     expect(mapping.spanFor(0, 0)?.sourceUrl,
@@ -187,7 +186,7 @@
 
   group('parse with bundle', () {
     var mapping =
-        parseJsonExtended(SOURCE_MAP_BUNDLE, mapUrl: 'file:///path/to/map');
+        parseJsonExtended(_sourceMapBundle, mapUrl: 'file:///path/to/map');
 
     test('simple', () {
       expect(
@@ -276,7 +275,7 @@
     });
 
     test('parseExtended', () {
-      var mapping = parseExtended(jsonEncode(SOURCE_MAP_BUNDLE),
+      var mapping = parseExtended(jsonEncode(_sourceMapBundle),
           mapUrl: 'file:///path/to/map');
 
       expect(mapping.spanFor(0, 0, uri: 'output.dart')?.sourceUrl,
@@ -290,20 +289,20 @@
     test('build bundle incrementally', () {
       var mapping = MappingBundle();
 
-      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_1,
+      mapping.addMapping(parseJson(_mapWithSourceLocationAndName1,
           mapUrl: 'file:///path/to/map') as SingleMapping);
       expect(mapping.spanFor(0, 0, uri: 'output.dart')?.sourceUrl,
           Uri.parse('file:///path/to/pkg/input1.dart'));
 
       expect(mapping.containsMapping('output2.dart'), isFalse);
-      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_2,
+      mapping.addMapping(parseJson(_mapWithSourceLocationAndName2,
           mapUrl: 'file:///path/to/map') as SingleMapping);
       expect(mapping.containsMapping('output2.dart'), isTrue);
       expect(mapping.spanFor(0, 0, uri: 'output2.dart')?.sourceUrl,
           Uri.parse('file:///path/to/pkg/input2.dart'));
 
       expect(mapping.containsMapping('3/output.dart'), isFalse);
-      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_3,
+      mapping.addMapping(parseJson(_mapWithSourceLocationAndName3,
           mapUrl: 'file:///path/to/map') as SingleMapping);
       expect(mapping.containsMapping('3/output.dart'), isTrue);
       expect(mapping.spanFor(0, 0, uri: '3/output.dart')?.sourceUrl,
@@ -351,10 +350,10 @@
 
   test('parse and re-emit', () {
     for (var expected in [
-      EXPECTED_MAP,
-      MAP_WITH_NO_SOURCE_LOCATION,
-      MAP_WITH_SOURCE_LOCATION,
-      MAP_WITH_SOURCE_LOCATION_AND_NAME
+      expectedMap,
+      _mapWithNoSourceLocation,
+      _mapWithSourceLocation,
+      _mapWithSourceLocationAndName
     ]) {
       var mapping = parseJson(expected) as SingleMapping;
       expect(mapping.toJson(), equals(expected));
@@ -363,12 +362,12 @@
       expect(mapping.toJson(), equals(expected));
     }
 
-    var mapping = parseJsonExtended(SOURCE_MAP_BUNDLE) as MappingBundle;
-    expect(mapping.toJson(), equals(SOURCE_MAP_BUNDLE));
+    var mapping = parseJsonExtended(_sourceMapBundle) as MappingBundle;
+    expect(mapping.toJson(), equals(_sourceMapBundle));
   });
 
   test('parse extensions', () {
-    var map = Map.from(EXPECTED_MAP);
+    var map = Map.from(expectedMap);
     map['x_foo'] = 'a';
     map['x_bar'] = [3];
     var mapping = parseJson(map) as SingleMapping;
@@ -396,19 +395,19 @@
     group('from parse()', () {
       group('are null', () {
         test('with no sourcesContent field', () {
-          var mapping = parseJson(EXPECTED_MAP) as SingleMapping;
+          var mapping = parseJson(expectedMap) as SingleMapping;
           expect(mapping.files, equals([null]));
         });
 
         test('with null sourcesContent values', () {
-          var map = Map.from(EXPECTED_MAP);
+          var map = Map.from(expectedMap);
           map['sourcesContent'] = [null];
           var mapping = parseJson(map) as SingleMapping;
           expect(mapping.files, equals([null]));
         });
 
         test('with a too-short sourcesContent', () {
-          var map = Map.from(EXPECTED_MAP);
+          var map = Map.from(expectedMap);
           map['sourcesContent'] = [];
           var mapping = parseJson(map) as SingleMapping;
           expect(mapping.files, equals([null]));
@@ -416,7 +415,7 @@
       });
 
       test('are parsed from sourcesContent', () {
-        var map = Map.from(EXPECTED_MAP);
+        var map = Map.from(expectedMap);
         map['sourcesContent'] = ['hello, world!'];
         var mapping = parseJson(map) as SingleMapping;
 
diff --git a/test/printer_test.dart b/test/printer_test.dart
index fc79913..3db321d 100644
--- a/test/printer_test.dart
+++ b/test/printer_test.dart
@@ -5,9 +5,11 @@
 library test.printer_test;
 
 import 'dart:convert';
-import 'package:test/test.dart';
+
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
+import 'package:test/test.dart';
+
 import 'common.dart';
 
 void main() {
@@ -23,15 +25,15 @@
       ..add('y) => ')
       ..mark(inputExpr)
       ..add('x + y;\n');
-    expect(printer.text, OUTPUT);
-    expect(printer.map, jsonEncode(EXPECTED_MAP));
+    expect(printer.text, outputContent);
+    expect(printer.map, jsonEncode(expectedMap));
   });
 
   test('printer projecting marks', () {
-    var out = INPUT.replaceAll('long', '_s');
+    var out = inputContent.replaceAll('long', '_s');
     var printer = Printer('output2.dart');
 
-    var segments = INPUT.split('long');
+    var segments = inputContent.split('long');
     expect(segments.length, 6);
     printer
       ..mark(ispan(0, 0))
@@ -92,8 +94,8 @@
         ..add('y) => ', span: inputVar2)
         ..add('x + y;\n', span: inputExpr)
         ..build('output.dart');
-      expect(printer.text, OUTPUT);
-      expect(printer.map, jsonEncode(EXPECTED_MAP));
+      expect(printer.text, outputContent);
+      expect(printer.map, jsonEncode(expectedMap));
     });
 
     test('nested use', () {
@@ -105,13 +107,13 @@
         ..add(NestedPrinter()..add('y) => ', span: inputVar2))
         ..add('x + y;\n', span: inputExpr)
         ..build('output.dart');
-      expect(printer.text, OUTPUT);
-      expect(printer.map, jsonEncode(EXPECTED_MAP));
+      expect(printer.text, outputContent);
+      expect(printer.map, jsonEncode(expectedMap));
     });
 
     test('add indentation', () {
-      var out = INPUT.replaceAll('long', '_s');
-      var lines = INPUT.trim().split('\n');
+      var out = inputContent.replaceAll('long', '_s');
+      var lines = inputContent.trim().split('\n');
       expect(lines.length, 7);
       var printer = NestedPrinter();
       for (var i = 0; i < lines.length; i++) {
diff --git a/test/vlq_test.dart b/test/vlq_test.dart
index 92a8f4a..5a4f02a 100644
--- a/test/vlq_test.dart
+++ b/test/vlq_test.dart
@@ -27,20 +27,20 @@
   });
 
   test('only 32-bit ints allowed', () {
-    var max_int = (pow(2, 31) as int) - 1;
-    var min_int = -(pow(2, 31) as int);
-    _checkEncodeDecode(max_int - 1);
-    _checkEncodeDecode(min_int + 1);
-    _checkEncodeDecode(max_int);
-    _checkEncodeDecode(min_int);
+    var maxInt = (pow(2, 31) as int) - 1;
+    var minInt = -(pow(2, 31) as int);
+    _checkEncodeDecode(maxInt - 1);
+    _checkEncodeDecode(minInt + 1);
+    _checkEncodeDecode(maxInt);
+    _checkEncodeDecode(minInt);
 
-    expect(encodeVlq(min_int).join(''), 'hgggggE');
-    expect(decodeVlq('hgggggE'.split('').iterator), min_int);
+    expect(encodeVlq(minInt).join(''), 'hgggggE');
+    expect(decodeVlq('hgggggE'.split('').iterator), minInt);
 
-    expect(() => encodeVlq(max_int + 1), throwsA(anything));
-    expect(() => encodeVlq(max_int + 2), throwsA(anything));
-    expect(() => encodeVlq(min_int - 1), throwsA(anything));
-    expect(() => encodeVlq(min_int - 2), throwsA(anything));
+    expect(() => encodeVlq(maxInt + 1), throwsA(anything));
+    expect(() => encodeVlq(maxInt + 2), throwsA(anything));
+    expect(() => encodeVlq(minInt - 1), throwsA(anything));
+    expect(() => encodeVlq(minInt - 2), throwsA(anything));
 
     // if we allowed more than 32 bits, these would be the expected encodings
     // for the large numbers above.
