diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index e70c308..fe960e4 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -220,7 +220,7 @@
       "name": "dart2js_tools",
       "rootUri": "../pkg/dart2js_tools",
       "packageUri": "lib/",
-      "languageVersion": "2.3"
+      "languageVersion": "2.12"
     },
     {
       "name": "dart2native",
@@ -812,4 +812,4 @@
       "languageVersion": "2.12"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 8a8f918..cccab31 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -805,7 +805,6 @@
     );
 
     var generatedContent = generatedFile.readAsStringSync();
-    // TODO(scheglov) Improve macro to be more formatted.
     expect(generatedContent, r'''
 import 'macro_annotations.dart';
 
@@ -813,12 +812,12 @@
   @observable
   int _foo = 0;
 
-int get foo => _foo;
+  int get foo => _foo;
 
-set foo(int val) {
-  print('Setting foo to ${val}');
-  _foo = val;
-}
+  set foo(int val) {
+    print('Setting foo to ${val}');
+    _foo = val;
+  }
 }
 
 void f(A a) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index d8b80ca..80e7594 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 169;
+  static const int DATA_VERSION = 170;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/macro/builders/data_class.dart b/pkg/analyzer/lib/src/macro/builders/data_class.dart
index 664f5d8..a4a0393 100644
--- a/pkg/analyzer/lib/src/macro/builders/data_class.dart
+++ b/pkg/analyzer/lib/src/macro/builders/data_class.dart
@@ -39,6 +39,20 @@
   }
 }
 
+class DataClassMacro implements ClassDeclarationMacro {
+  const DataClassMacro();
+
+  @override
+  void visitClassDeclaration(
+    ast.ClassDeclaration declaration,
+    ClassDeclarationBuilder builder,
+  ) {
+    const AutoConstructorMacro().visitClassDeclaration(declaration, builder);
+    const HashCodeMacro().visitClassDeclaration(declaration, builder);
+    const ToStringMacro().visitClassDeclaration(declaration, builder);
+  }
+}
+
 class HashCodeMacro implements ClassDeclarationMacro {
   const HashCodeMacro();
 
@@ -52,8 +66,9 @@
         .join(' ^ ');
     builder.addToClass(
       Declaration('''
-@override
-int get hashCode => $expression;'''),
+  @override
+  int get hashCode => $expression;
+'''),
     );
   }
 }
@@ -73,8 +88,9 @@
     }).join(', ');
     builder.addToClass(
       Declaration('''
-@override
-String toString() => '${classElement.name}($fieldsCode)';'''),
+  @override
+  String toString() => '${classElement.name}($fieldsCode)';
+'''),
     );
   }
 }
diff --git a/pkg/analyzer/lib/src/macro/builders/observable.dart b/pkg/analyzer/lib/src/macro/builders/observable.dart
index 6857d34..dac5565 100644
--- a/pkg/analyzer/lib/src/macro/builders/observable.dart
+++ b/pkg/analyzer/lib/src/macro/builders/observable.dart
@@ -33,15 +33,16 @@
       var publicName = name.substring(1);
 
       var getter = Declaration(
-        '$typeCode get $publicName => $name;',
+        '  $typeCode get $publicName => $name;',
       );
       builder.addToClass(getter);
 
       var setter = Declaration('''
-set $publicName($typeCode val) {
-  print('Setting $publicName to \${val}');
-  $name = val;
-}''');
+  set $publicName($typeCode val) {
+    print('Setting $publicName to \${val}');
+    $name = val;
+  }
+''');
       builder.addToClass(setter);
     }
   }
diff --git a/pkg/analyzer/lib/src/macro/impl/macro.dart b/pkg/analyzer/lib/src/macro/impl/macro.dart
index 989bdb4..5974840 100644
--- a/pkg/analyzer/lib/src/macro/impl/macro.dart
+++ b/pkg/analyzer/lib/src/macro/impl/macro.dart
@@ -114,7 +114,7 @@
       return a.data.id - b.data.id;
     });
 
-    const classMemberCodePrefix = '\n';
+    const classMemberCodePrefix = '\n  ';
     const classMemberCodeSuffix = '\n';
     // TODO(scheglov) make it required?
     var generatedContent = linkingUnit.input.sourceContent!;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index f513e75..0136b19 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -669,7 +669,7 @@
   ) {
     var macroGenerationDataList = unitElement.macroGenerationDataList;
     if (macroGenerationDataList != null) {
-      const classMemberCodePrefix = '\n';
+      const classMemberCodePrefix = '\n  ';
       const classMemberCodeSuffix = '\n';
       var generatedContent = unitInfoData.content;
       var shift = 0;
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 661ba7d..8cadf5b 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -248,6 +248,12 @@
               classBuilder,
             );
           }
+          if (hasMacroAnnotation(declaration, 'dataClass')) {
+            macro.DataClassMacro().visitClassDeclaration(
+              declaration,
+              classBuilder,
+            );
+          }
           if (hasMacroAnnotation(declaration, 'hashCode')) {
             macro.HashCodeMacro().visitClassDeclaration(
               declaration,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 74fe439..e434353 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -21282,11 +21282,11 @@
           final b @88
             type: int?
         constructors
-          @92
+          @94
             parameters
-              requiredName final this.a @109
+              requiredName final this.a @111
                 type: int
-              optionalNamed final this.b @117
+              optionalNamed final this.b @119
                 type: int?
         accessors
           synthetic get a @-1
@@ -21300,7 +21300,93 @@
   final int a;
   final int? b;
 
-A({required this.a, this.b});
+  A({required this.a, this.b});
+}
+''');
+  }
+
+  test_macro_dataClass() async {
+    addLibrarySource('/macro_annotations.dart', r'''
+library analyzer.macro.annotations;
+const dataClass = 0;
+''');
+    var library = await checkLibrary(r'''
+import 'macro_annotations.dart';
+@dataClass
+class A {
+  final int a;
+  final int b;
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    macro_annotations.dart
+  definingUnit
+    classes
+      class A @50
+        metadata
+          Annotation
+            atSign: @ @33
+            element: macro_annotations.dart::@getter::dataClass
+            name: SimpleIdentifier
+              staticElement: macro_annotations.dart::@getter::dataClass
+              staticType: null
+              token: dataClass @34
+        fields
+          final a @66
+            type: int
+          final b @81
+            type: int
+          synthetic hashCode @-1
+            type: int
+        constructors
+          @87
+            parameters
+              requiredName final this.a @104
+                type: int
+              requiredName final this.b @121
+                type: int
+        accessors
+          synthetic get a @-1
+            returnType: int
+          synthetic get b @-1
+            returnType: int
+          get hashCode @149
+            metadata
+              Annotation
+                atSign: @ @129
+                element: dart:core::@getter::override
+                name: SimpleIdentifier
+                  staticElement: dart:core::@getter::override
+                  staticType: null
+                  token: override @130
+            returnType: int
+        methods
+          toString @208
+            metadata
+              Annotation
+                atSign: @ @189
+                element: dart:core::@getter::override
+                name: SimpleIdentifier
+                  staticElement: dart:core::@getter::override
+                  staticType: null
+                  token: override @190
+            returnType: String
+    macroGeneratedContent
+import 'macro_annotations.dart';
+@dataClass
+class A {
+  final int a;
+  final int b;
+
+  A({required this.a, required this.b});
+
+  @override
+  int get hashCode => a.hashCode ^ b.hashCode;
+
+  @override
+  String toString() => 'A(a: $a, b: $b)';
 }
 ''');
   }
@@ -21335,7 +21421,7 @@
             returnType: int
           synthetic get b @-1
             returnType: int
-          get hashCode @102
+          get hashCode @106
             metadata
               Annotation
                 atSign: @ @0
@@ -21352,8 +21438,8 @@
   final int a;
   final int b;
 
-@override
-int get hashCode => a.hashCode ^ b.hashCode;
+  @override
+  int get hashCode => a.hashCode ^ b.hashCode;
 }
 ''');
   }
@@ -21410,15 +21496,15 @@
         accessors
           synthetic get b @-1
             returnType: int
-          get hashCode @126
+          get hashCode @130
             metadata
               Annotation
-                atSign: @ @108
+                atSign: @ @110
                 element: dart:core::@getter::override
                 name: SimpleIdentifier
                   staticElement: dart:core::@getter::override
                   staticType: null
-                  token: override @109
+                  token: override @111
             returnType: int
     macroGeneratedContent
 import 'macro_annotations.dart';
@@ -21431,8 +21517,8 @@
 class B extends A {
   final int b;
 
-@override
-int get hashCode => b.hashCode ^ a.hashCode;
+  @override
+  int get hashCode => b.hashCode ^ a.hashCode;
 }
 ''');
   }
@@ -21479,11 +21565,11 @@
               requiredPositional __f @-1
                 type: int
             returnType: void
-          get f @80
+          get f @82
             returnType: int
-          set f @94
+          set f @98
             parameters
-              requiredPositional val @100
+              requiredPositional val @104
                 type: int
             returnType: void
     macroGeneratedContent
@@ -21492,12 +21578,12 @@
   @observable
   int _f = 0;
 
-int get f => _f;
+  int get f => _f;
 
-set f(int val) {
-  print('Setting f to ${val}');
-  _f = val;
-}
+  set f(int val) {
+    print('Setting f to ${val}');
+    _f = val;
+  }
 }
 ''');
   }
@@ -21547,11 +21633,11 @@
               requiredPositional __f @-1
                 type: T
             returnType: void
-          get f @75
+          get f @77
             returnType: T
-          set f @89
+          set f @93
             parameters
-              requiredPositional val @93
+              requiredPositional val @97
                 type: T
             returnType: void
     macroGeneratedContent
@@ -21560,12 +21646,12 @@
   @observable
   T _f;
 
-T get f => _f;
+  T get f => _f;
 
-set f(T val) {
-  print('Setting f to ${val}');
-  _f = val;
-}
+  set f(T val) {
+    print('Setting f to ${val}');
+    _f = val;
+  }
 }
 ''');
   }
@@ -21611,15 +21697,15 @@
           synthetic get b @-1
             returnType: int
         methods
-          toString @101
+          toString @105
             metadata
               Annotation
-                atSign: @ @84
+                atSign: @ @86
                 element: dart:core::@getter::override
                 name: SimpleIdentifier
                   staticElement: dart:core::@getter::override
                   staticType: null
-                  token: override @85
+                  token: override @87
             returnType: String
     macroGeneratedContent
 import 'macro_annotations.dart';
@@ -21628,8 +21714,8 @@
   final int a;
   final int b;
 
-@override
-String toString() => 'A(a: $a, b: $b)';
+  @override
+  String toString() => 'A(a: $a, b: $b)';
 }
 ''');
   }
diff --git a/pkg/dart2js_tools/bin/deobfuscate.dart b/pkg/dart2js_tools/bin/deobfuscate.dart
index d6ba837..adecc1b 100644
--- a/pkg/dart2js_tools/bin/deobfuscate.dart
+++ b/pkg/dart2js_tools/bin/deobfuscate.dart
@@ -47,24 +47,24 @@
   var sb = new StringBuffer();
   try {
     String obfuscatedTrace = new File(args[0]).readAsStringSync();
-    String error = extractErrorMessage(obfuscatedTrace);
+    String? error = extractErrorMessage(obfuscatedTrace);
     var provider = new CachingFileProvider(logger: Logger());
     StackDeobfuscationResult result =
         deobfuscateStack(obfuscatedTrace, provider);
     Frame firstFrame = result.original.frames.first;
-    String translatedError =
+    String? translatedError =
         translate(error, provider.mappingFor(firstFrame.uri));
     if (translatedError == null) translatedError = '<no error message found>';
     printPadded(translatedError, error, sb);
     int longest =
-        result.deobfuscated.frames.fold(0, (m, f) => max(f.member.length, m));
+        result.deobfuscated.frames.fold(0, (m, f) => max(f.member!.length, m));
     for (var originalFrame in result.original.frames) {
       var deobfuscatedFrames = result.frameMap[originalFrame];
       if (deobfuscatedFrames == null) {
         printPadded('no mapping', '${originalFrame.location}', sb);
       } else {
         for (var frame in deobfuscatedFrames) {
-          printPadded('${frame.member.padRight(longest)} ${frame.location}',
+          printPadded('${frame.member!.padRight(longest)} ${frame.location}',
               '${originalFrame.location}', sb);
         }
       }
@@ -77,7 +77,7 @@
 final green = stdout.hasTerminal ? '\x1b[32m' : '';
 final none = stdout.hasTerminal ? '\x1b[0m' : '';
 
-printPadded(String mapping, String original, sb) {
+printPadded(String mapping, String? original, sb) {
   var len = mapping.length;
   var s = mapping.indexOf('\n');
   if (s >= 0) len -= s + 1;
diff --git a/pkg/dart2js_tools/bin/lookup_name.dart b/pkg/dart2js_tools/bin/lookup_name.dart
index f2d5c1b..b0fbfe9 100644
--- a/pkg/dart2js_tools/bin/lookup_name.dart
+++ b/pkg/dart2js_tools/bin/lookup_name.dart
@@ -2,6 +2,7 @@
 import 'dart:convert';
 import 'package:source_maps/source_maps.dart';
 import 'package:dart2js_tools/src/dart2js_mapping.dart';
+import 'package:dart2js_tools/src/util.dart';
 
 main(List<String> args) {
   if (args.length < 2) {
@@ -16,7 +17,7 @@
     exit(1);
   }
   var json = jsonDecode(sourcemapFile.readAsStringSync());
-  Dart2jsMapping mapping = Dart2jsMapping(parseJson(json), json);
+  Dart2jsMapping mapping = Dart2jsMapping(parseSingleMapping(json), json);
   var global = mapping.globalNames[name];
   if (global != null) print('$name => $global (a global name)');
   var instance = mapping.instanceNames[name];
diff --git a/pkg/dart2js_tools/bin/show_inline_data.dart b/pkg/dart2js_tools/bin/show_inline_data.dart
index cc3d5f0..a83531f 100644
--- a/pkg/dart2js_tools/bin/show_inline_data.dart
+++ b/pkg/dart2js_tools/bin/show_inline_data.dart
@@ -26,7 +26,7 @@
   var offsets = frames.keys.toList()..sort();
   var sb = new StringBuffer();
   int depth = 0;
-  int lastFunctionStart = null;
+  int? lastFunctionStart = null;
   for (var offset in offsets) {
     int functionStart = nextFunctionStart(starts, offset, lastFunctionStart);
     if (lastFunctionStart == null || functionStart > lastFunctionStart) {
@@ -43,7 +43,7 @@
     var pad = ' ' * offsetPrefix.length;
     sb.write(offsetPrefix);
     bool first = true;
-    for (var frame in frames[offset]) {
+    for (var frame in frames[offset]!) {
       if (!first) sb.write('$pad');
       sb.write(' $frame\n');
       first = false;
@@ -75,7 +75,7 @@
   return result;
 }
 
-int nextFunctionStart(List<int> starts, int offset, int last) {
+int nextFunctionStart(List<int> starts, int offset, int? last) {
   int j = last ?? 0;
   for (; j < starts.length && starts[j] <= offset; j++);
   return j - 1;
diff --git a/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart b/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
index 29a209e..f93d751 100644
--- a/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
+++ b/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
@@ -27,7 +27,7 @@
 ///  `//# sourceMappingURL=` line at the end, and load the corresponding
 /// source-map file.
 String deobfuscateStackTrace(String obfuscatedTrace) {
-  String error = extractErrorMessage(obfuscatedTrace);
+  String? error = extractErrorMessage(obfuscatedTrace);
   var provider = CachingFileProvider();
   StackDeobfuscationResult result = deobfuscateStack(obfuscatedTrace, provider);
   Frame firstFrame = result.original.frames.first;
@@ -38,13 +38,13 @@
 
   var sb = StringBuffer();
   sb.writeln(translatedError);
-  maxMemberLengthHelper(int m, Frame f) => max(f.member.length, m);
+  maxMemberLengthHelper(int m, Frame f) => max(f.member!.length, m);
   int longest = result.deobfuscated.frames.fold(0, maxMemberLengthHelper);
   longest = result.original.frames.fold(longest, maxMemberLengthHelper);
   for (var originalFrame in result.original.frames) {
     var deobfuscatedFrames = result.frameMap[originalFrame];
     if (deobfuscatedFrames == null) {
-      var name = originalFrame.member;
+      var name = originalFrame.member!;
       sb.writeln('    at ${name.padRight(longest)} ${originalFrame.location}');
     } else {
       for (var frame in deobfuscatedFrames) {
@@ -53,7 +53,7 @@
         // client, we can start encoding the function name and remove this
         // workaround.
         if (name == '<unknown>') name = originalFrame.member;
-        sb.writeln('    at ${name.padRight(longest)} ${frame.location}');
+        sb.writeln('    at ${name!.padRight(longest)} ${frame.location}');
       }
     }
   }
diff --git a/pkg/dart2js_tools/lib/src/dart2js_mapping.dart b/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
index ac6b9d7..8f67882 100644
--- a/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
+++ b/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
@@ -23,15 +23,9 @@
   final Map<String, String> globalNames = {};
   final Map<String, String> instanceNames = {};
   final Map<int, List<FrameEntry>> frames = {};
-  List<int> _frameIndex;
-  List<int> get frameIndex {
-    if (_frameIndex == null) {
-      _frameIndex = frames.keys.toList()..sort();
-    }
-    return _frameIndex;
-  }
+  late final List<int>? frameIndex = frames.keys.toList()..sort();
 
-  Dart2jsMapping(this.sourceMap, Map json, {Logger logger}) {
+  Dart2jsMapping(this.sourceMap, Map json, {Logger? logger}) {
     var extensions = json['x_org_dartlang_dart2js'];
     if (extensions == null) return;
     var minifiedNames = extensions['minified_names'];
@@ -41,20 +35,20 @@
       _extractMinifedNames(
           minifiedNames['instance'], sourceMap, instanceNames, logger);
     }
-    String jsonFrames = extensions['frames'];
+    String? jsonFrames = extensions['frames'];
     if (jsonFrames != null) {
       new _FrameDecoder(jsonFrames).parseFrames(frames, sourceMap);
     }
   }
 
-  Dart2jsMapping.json(Map json) : this(parseJson(json), json);
+  Dart2jsMapping.json(Map json) : this(parseSingleMapping(json), json);
 }
 
 class FrameEntry {
-  final String callUri;
-  final int callLine;
-  final int callColumn;
-  final String inlinedMethodName;
+  final String? callUri;
+  final int? callLine;
+  final int? callColumn;
+  final String? inlinedMethodName;
   final bool isEmpty;
   FrameEntry.push(
       this.callUri, this.callLine, this.callColumn, this.inlinedMethodName)
@@ -76,7 +70,7 @@
 }
 
 const _marker = "\n//# sourceMappingURL=";
-Dart2jsMapping parseMappingFor(Uri uri, {Logger logger}) {
+Dart2jsMapping? parseMappingFor(Uri uri, {Logger? logger}) {
   var file = new File.fromUri(uri);
   if (!file.existsSync()) {
     logger?.log('Error: no such file: $uri');
@@ -100,7 +94,7 @@
     return null;
   }
   var json = jsonDecode(sourcemapFile.readAsStringSync());
-  return new Dart2jsMapping(parseJson(json), json, logger: logger);
+  return new Dart2jsMapping(parseSingleMapping(json), json, logger: logger);
 }
 
 class _FrameDecoder implements Iterator<String> {
@@ -112,8 +106,9 @@
   // Iterator API is used by decodeVlq to consume VLQ entries.
   bool moveNext() => ++index < _length;
 
-  String get current =>
-      (index >= 0 && index < _length) ? _internal[index] : null;
+  String get current => (index >= 0 && index < _length)
+      ? _internal[index]
+      : throw StateError('No current value available.');
 
   bool get hasTokens => index < _length - 1 && _length > 0;
 
@@ -151,7 +146,7 @@
 }
 
 _extractMinifedNames(String encodedInput, SingleMapping sourceMap,
-    Map<String, String> minifiedNames, Logger logger) {
+    Map<String, String> minifiedNames, Logger? logger) {
   if (encodedInput.isEmpty) return;
   List<String> input = encodedInput.split(',');
   if (input.length % 2 != 0) {
@@ -159,7 +154,7 @@
   }
   for (int i = 0; i < input.length; i += 2) {
     String minifiedName = input[i];
-    int id = int.tryParse(input[i + 1]);
+    int id = int.tryParse(input[i + 1])!;
     minifiedNames[minifiedName] = sourceMap.names[id];
   }
 }
diff --git a/pkg/dart2js_tools/lib/src/name_decoder.dart b/pkg/dart2js_tools/lib/src/name_decoder.dart
index 306bead..458fd60 100644
--- a/pkg/dart2js_tools/lib/src/name_decoder.dart
+++ b/pkg/dart2js_tools/lib/src/name_decoder.dart
@@ -9,8 +9,8 @@
 import 'dart2js_mapping.dart';
 import 'trace.dart';
 
-String translate(String error, Dart2jsMapping mapping,
-    [StackTraceLine line, TargetEntry entry]) {
+String? translate(String? error, Dart2jsMapping mapping,
+    [StackTraceLine? line, TargetEntry? entry]) {
   for (var decoder in _errorMapDecoders) {
     var result = decoder.decode(error, mapping, line, entry);
     // More than one decoder might be applied on a single error message. This
@@ -30,10 +30,10 @@
   /// Decode [error] that was reported in [line] and has a corresponding [entry]
   /// in the source-map file. The provided [mapping] includes additional
   /// minification data that may be used to decode the error message.
-  String decode(String error, Dart2jsMapping mapping, StackTraceLine line,
-      TargetEntry entry) {
+  String? decode(String? error, Dart2jsMapping mapping, StackTraceLine? line,
+      TargetEntry? entry) {
     if (error == null) return null;
-    Match lastMatch = null;
+    Match? lastMatch = null;
     var result = new StringBuffer();
     for (var match in _matcher.allMatches(error)) {
       var decodedMatch = _decodeInternal(match, mapping, line, entry);
@@ -49,8 +49,8 @@
     return '$result';
   }
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry);
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry);
 }
 
 typedef String ErrorDecoder(Match match, Dart2jsMapping mapping,
@@ -59,28 +59,28 @@
 class MinifiedNameDecoder extends ErrorMapDecoder {
   final RegExp _matcher = new RegExp("minified:([a-zA-Z0-9_\$]*)");
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry) {
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry) {
     var minifiedName = match.group(1);
-    return mapping.globalNames[minifiedName];
+    return mapping.globalNames[minifiedName!];
   }
 }
 
 class CannotReadPropertyDecoder extends ErrorMapDecoder {
   final RegExp _matcher = new RegExp("Cannot read property '([^']*)' of");
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry) {
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry) {
     var minifiedName = match.group(1);
-    var name = mapping.instanceNames[minifiedName];
+    var name = mapping.instanceNames[minifiedName!];
     if (name == null) return null;
     return "Cannot read property '$name' of";
   }
 }
 
 abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
-  String _translateMinifiedName(Dart2jsMapping mapping, String minifiedName) {
-    var name = mapping.instanceNames[minifiedName];
+  String? _translateMinifiedName(Dart2jsMapping mapping, String? minifiedName) {
+    var name = mapping.instanceNames[minifiedName!];
     if (name != null) return "'$name'";
     if (minifiedName.startsWith(new RegExp(r'(call)?\$[0-9]'))) {
       int first$ = minifiedName.indexOf(r'$');
@@ -89,15 +89,15 @@
     return null;
   }
 
-  String _expandCallSignature(String callSignature) {
+  String? _expandCallSignature(String callSignature) {
     // Minified names are one of these forms:
     //   $0         // positional arguments only
     //   $1$2       // type parameters and positional arguments
     //   $3$name    // positional and named arguments
     //   $1$3$name  // type parameters and positional and named args
     var signature = callSignature.split(r'$');
-    var typeArgs = null;
-    var totalArgs = null;
+    int? typeArgs = null;
+    int? totalArgs = null;
     var namedArgs = <String>[];
     for (var arg in signature) {
       if (arg == "") continue;
@@ -115,6 +115,7 @@
         namedArgs.add(arg);
       }
     }
+    if (totalArgs == null) return null;
     var sb = new StringBuffer();
     sb.write("'call'");
     sb.write(" (with ");
@@ -136,8 +137,8 @@
   final RegExp _matcher = new RegExp(
       "NoSuchMethodError: method not found: '([^']*)'( on [^\\(]*)? \\(.*\\)");
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry) {
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry) {
     var minifiedName = match.group(1);
     var suffix = match.group(2) ?? '';
     var name = _translateMinifiedName(mapping, minifiedName);
@@ -150,8 +151,8 @@
   final RegExp _matcher =
       new RegExp("NoSuchMethodError: method not found: '([^']*)'");
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry) {
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry) {
     var minifiedName = match.group(1);
     var name = _translateMinifiedName(mapping, minifiedName);
     if (name == null) return null;
@@ -162,10 +163,10 @@
 class UnhandledNotAFunctionError extends ErrorMapDecoder {
   final RegExp _matcher = new RegExp("Error: ([^']*) is not a function");
 
-  String _decodeInternal(Match match, Dart2jsMapping mapping,
-      StackTraceLine line, TargetEntry entry) {
+  String? _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine? line, TargetEntry? entry) {
     var minifiedName = match.group(1);
-    var name = mapping.instanceNames[minifiedName];
+    var name = mapping.instanceNames[minifiedName!];
     if (name == null) return null;
     return "Error: $name is not a function";
   }
diff --git a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
index 68ffd94..87b0c40 100644
--- a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
+++ b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
@@ -10,7 +10,7 @@
 
 /// Search backwards in [sources] for a function declaration that includes the
 /// [start] offset.
-TargetEntry findEnclosingFunction(FileProvider provider, Uri uri, int start) {
+TargetEntry? findEnclosingFunction(FileProvider provider, Uri uri, int start) {
   String sources = provider.sourcesFor(uri);
   if (sources == null) return null;
   SourceFile file = provider.fileFor(uri);
@@ -22,7 +22,7 @@
     var line = file.getLine(index);
     var lineEntry = findLine(mapping, line);
     var column = file.getColumn(index);
-    TargetEntry result = findColumn(line, column, lineEntry);
+    TargetEntry? result = findColumn(line, column, lineEntry);
     // If the name entry doesn't start exactly at the column corresponding to
     // `index`, we must be in the middle of a string or code that uses the word
     // "function", but that doesn't have a corresponding mapping. In those
@@ -61,7 +61,7 @@
 /// number is lower or equal to [line].
 ///
 /// Copied from [SingleMapping._findLine].
-TargetLineEntry findLine(SingleMapping sourceMap, int line) {
+TargetLineEntry? findLine(SingleMapping sourceMap, int line) {
   int index = binarySearch(sourceMap.lines, (e) => e.line > line);
   return (index <= 0) ? null : sourceMap.lines[index - 1];
 }
@@ -73,7 +73,7 @@
 /// the very last entry on that line.
 ///
 /// Copied from [SingleMapping._findColumn].
-TargetEntry findColumn(int line, int column, TargetLineEntry lineEntry) {
+TargetEntry? findColumn(int line, int column, TargetLineEntry? lineEntry) {
   if (lineEntry == null || lineEntry.entries.length == 0) return null;
   if (lineEntry.line != line) return lineEntry.entries.last;
   var entries = lineEntry.entries;
diff --git a/pkg/dart2js_tools/lib/src/trace.dart b/pkg/dart2js_tools/lib/src/trace.dart
index 846af16..07bdb1e 100644
--- a/pkg/dart2js_tools/lib/src/trace.dart
+++ b/pkg/dart2js_tools/lib/src/trace.dart
@@ -14,10 +14,10 @@
 
 /// Represents a stack trace line.
 class StackTraceLine {
-  String methodName;
-  String fileName;
-  int lineNo;
-  int columnNo;
+  final String? methodName;
+  final String fileName;
+  final int? lineNo;
+  final int columnNo;
 
   StackTraceLine(this.methodName, this.fileName, this.lineNo, this.columnNo);
 
@@ -31,11 +31,11 @@
   ///     at <fileName>:<lineNo>
   ///     at <fileName>
   ///
-  factory StackTraceLine.fromText(String text, {Logger logger}) {
+  factory StackTraceLine.fromText(String text, {Logger? logger}) {
     text = text.trim();
     assert(text.startsWith('at '));
     text = text.substring('at '.length);
-    String methodName;
+    String? methodName;
     int endParen = text.indexOf(')');
     if (endParen > 0) {
       int nameEnd = text.indexOf('(');
@@ -46,16 +46,16 @@
         logger?.log('Missing left-paren in: $text');
       }
     }
-    int lineNo;
-    int columnNo;
+    int? lineNo;
+    int? columnNo;
     String fileName;
     int lastColon = text.lastIndexOf(':');
     if (lastColon != -1) {
-      int lastValue = int.tryParse(text.substring(lastColon + 1));
+      int? lastValue = int.tryParse(text.substring(lastColon + 1));
       if (lastValue != null) {
         int secondToLastColon = text.lastIndexOf(':', lastColon - 1);
         if (secondToLastColon != -1) {
-          int secondToLastValue =
+          int? secondToLastValue =
               int.tryParse(text.substring(secondToLastColon + 1, lastColon));
           if (secondToLastValue != null) {
             lineNo = secondToLastValue;
@@ -84,14 +84,14 @@
     if (methodName != null) {
       sb.write(methodName);
       sb.write(' (');
-      sb.write(fileName ?? '?');
+      sb.write(fileName);
       sb.write(':');
       sb.write(lineNo);
       sb.write(':');
       sb.write(columnNo);
       sb.write(')');
     } else {
-      sb.write(fileName ?? '?');
+      sb.write(fileName);
       sb.write(':');
       sb.write(lineNo);
       sb.write(':');
@@ -103,27 +103,27 @@
   String get inlineString {
     StringBuffer sb = new StringBuffer();
     var padding = 20;
-    if (methodName != null) {
-      sb.write(methodName);
-      padding -= (methodName.length);
+    var lineMethodName = methodName;
+    if (lineMethodName != null) {
+      sb.write(lineMethodName);
+      padding -= (lineMethodName.length);
       if (padding <= 0) {
         sb.write('\n');
         padding = 20;
       }
     }
     sb.write(' ' * padding);
-    if (fileName != null) {
-      sb.write(p.url.basename(fileName));
-      sb.write(' ');
-      sb.write(lineNo);
-      sb.write(':');
-      sb.write(columnNo);
-    }
+    sb.write(p.url.basename(fileName));
+    sb.write(' ');
+    sb.write(lineNo);
+    sb.write(':');
+    sb.write(columnNo);
+
     return sb.toString();
   }
 }
 
-List<StackTraceLine> parseStackTrace(String trace, {Logger logger}) {
+List<StackTraceLine> parseStackTrace(String trace, {Logger? logger}) {
   List<String> lines = trace.split(new RegExp(r'(\r|\n|\r\n)'));
   List<StackTraceLine> jsStackTrace = <StackTraceLine>[];
   for (String line in lines) {
@@ -138,7 +138,7 @@
 /// Returns the portion of the output that corresponds to the error message.
 ///
 /// Note: some errors can span multiple lines.
-String extractErrorMessage(String trace) {
+String? extractErrorMessage(String trace) {
   var firstStackFrame = trace.indexOf(new RegExp('\n +at'));
   if (firstStackFrame == -1) return null;
   var errorMarker = trace.indexOf('^') + 1;
diff --git a/pkg/dart2js_tools/lib/src/trace_decoder.dart b/pkg/dart2js_tools/lib/src/trace_decoder.dart
index 7ac12aa..5699423 100644
--- a/pkg/dart2js_tools/lib/src/trace_decoder.dart
+++ b/pkg/dart2js_tools/lib/src/trace_decoder.dart
@@ -49,8 +49,8 @@
 
     // Subtract 1 because stack traces use 1-indexed lines and columns and
     // source maps uses 0-indexed.
-    SourceSpan span = mapping.sourceMap
-        .spanFor(frame.line - 1, column - 1, uri: frame.uri?.toString());
+    SourceSpan? span = mapping.sourceMap
+        .spanFor(frame.line! - 1, column - 1, uri: frame.uri.toString());
 
     // If we can't find a source span, ignore the frame. It's probably something
     // internal that the user doesn't care about.
@@ -59,11 +59,11 @@
     List<Frame> mappedFrames = frameMap[frame] = [];
 
     SourceFile jsFile = provider.fileFor(frame.uri);
-    int offset = jsFile.getOffset(frame.line - 1, column - 1);
+    int offset = jsFile.getOffset(frame.line! - 1, column - 1);
     String nameOf(id) =>
         _normalizeName(id >= 0 ? mapping.sourceMap.names[id] : null);
 
-    Uri fileName = span.sourceUrl;
+    Uri? fileName = span.sourceUrl;
     int targetLine = span.start.line + 1;
     int targetColumn = span.start.column + 1;
 
@@ -73,18 +73,18 @@
     // of the caller frame until we reach the actual function that dart2js
     // inlined all the code into.
     Map<int, List<FrameEntry>> frames = mapping.frames;
-    List<int> index = mapping.frameIndex;
+    List<int> index = mapping.frameIndex!;
     int key = binarySearch(index, (i) => i > offset) - 1;
     int depth = 0;
     outer:
     while (key >= 0) {
-      for (var frame in frames[index[key]].reversed) {
+      for (var frame in frames[index[key]]!.reversed) {
         if (frame.isEmpty) break outer;
         if (frame.isPush) {
           if (depth <= 0) {
-            mappedFrames.add(new Frame(fileName, targetLine, targetColumn,
+            mappedFrames.add(new Frame(fileName!, targetLine, targetColumn,
                 _normalizeName(frame.inlinedMethodName) + "(inlined)"));
-            fileName = Uri.parse(frame.callUri);
+            fileName = Uri.parse(frame.callUri!);
             targetLine = (frame.callLine ?? 0) + 1;
             targetColumn = (frame.callColumn ?? 0) + 1;
           } else {
@@ -100,7 +100,8 @@
 
     var functionEntry = findEnclosingFunction(provider, frame.uri, offset);
     String methodName = nameOf(functionEntry?.sourceNameId ?? -1);
-    mappedFrames.add(new Frame(fileName, targetLine, targetColumn, methodName));
+    mappedFrames
+        .add(new Frame(fileName!, targetLine, targetColumn, methodName));
     deobfuscatedFrames.addAll(mappedFrames);
   }
   return new StackDeobfuscationResult(
@@ -109,6 +110,6 @@
 
 /// Ensure we don't use spaces in method names. At this time, they are only
 /// introduced by `<anonymous function>`.
-_normalizeName(String methodName) =>
+_normalizeName(String? methodName) =>
     methodName?.replaceAll("<anonymous function>", "<anonymous>") ??
     '<unknown>';
diff --git a/pkg/dart2js_tools/lib/src/util.dart b/pkg/dart2js_tools/lib/src/util.dart
index 433ac5a..3bd0ab9 100644
--- a/pkg/dart2js_tools/lib/src/util.dart
+++ b/pkg/dart2js_tools/lib/src/util.dart
@@ -1,4 +1,5 @@
 import 'dart:io';
+import 'package:source_maps/parser.dart';
 import 'package:source_span/source_span.dart';
 import 'dart2js_mapping.dart';
 
@@ -12,7 +13,7 @@
   final Map<Uri, String> _sources = {};
   final Map<Uri, SourceFile> _files = {};
   final Map<Uri, Dart2jsMapping> _mappings = {};
-  final Logger logger;
+  final Logger? logger;
 
   CachingFileProvider({this.logger});
 
@@ -23,7 +24,7 @@
       _files[uri] ??= new SourceFile.fromString(sourcesFor(uri));
 
   Dart2jsMapping mappingFor(Uri uri) =>
-      _mappings[uri] ??= parseMappingFor(uri, logger: logger);
+      _mappings[uri] ??= parseMappingFor(uri, logger: logger)!;
 }
 
 /// A provider that converts `http:` URLs to a `file:` URI assuming that all
@@ -57,3 +58,5 @@
 }
 
 var logger = Logger();
+
+SingleMapping parseSingleMapping(Map json) => parseJson(json) as SingleMapping;
diff --git a/pkg/dart2js_tools/pubspec.yaml b/pkg/dart2js_tools/pubspec.yaml
index 0d28868..e7f1642 100644
--- a/pkg/dart2js_tools/pubspec.yaml
+++ b/pkg/dart2js_tools/pubspec.yaml
@@ -10,4 +10,4 @@
   source_span: any
   stack_trace: ^1.9.3
 environment:
-  sdk: '>=2.3.0 <3.0.0'
+  sdk: '2.12.0 <3.0.0'
diff --git a/tools/VERSION b/tools/VERSION
index 6459dd6..70ba861 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 24
+PRERELEASE 25
 PRERELEASE_PATCH 0
\ No newline at end of file
