diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 780bd0b..fd9daec 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -23,7 +23,6 @@
 import 'package:analysis_server/src/domain_execution.dart';
 import 'package:analysis_server/src/domain_kythe.dart';
 import 'package:analysis_server/src/domain_server.dart';
-import 'package:analysis_server/src/domains/analysis/macro_files.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
@@ -54,7 +53,6 @@
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
-import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:http/http.dart' as http;
 import 'package:telemetry/crash_reporting.dart';
@@ -723,10 +721,7 @@
   server.AnalysisNavigationParams _computeNavigationParams(
       String path, CompilationUnit unit) {
     var collector = NavigationCollectorImpl();
-    computeDartNavigation(resourceProvider, collector, unit, null, null,
-        analyzerConverter: AnalyzerConverter(
-            locationProvider:
-                MacroElementLocationProvider(MacroFiles(resourceProvider))));
+    computeDartNavigation(resourceProvider, collector, unit, null, null);
     collector.createRegions();
     return server.AnalysisNavigationParams(
         path, collector.regions, collector.targets, collector.files);
diff --git a/pkg/analysis_server/lib/src/domains/analysis/macro_files.dart b/pkg/analysis_server/lib/src/domains/analysis/macro_files.dart
deleted file mode 100644
index be391be..0000000
--- a/pkg/analysis_server/lib/src/domains/analysis/macro_files.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/util/file_paths.dart' as file_paths;
-import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
-import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
-
-class MacroElementLocationProvider implements ElementLocationProvider {
-  final MacroFiles _macroFiles;
-
-  MacroElementLocationProvider(this._macroFiles);
-
-  @override
-  protocol.Location? forElement(Element element) {
-    if (element is HasMacroGenerationData) {
-      var macro = (element as HasMacroGenerationData).macro;
-      if (macro != null) {
-        return _forElement(element, macro);
-      }
-    }
-  }
-
-  protocol.Location? _forElement(Element element, MacroGenerationData macro) {
-    var unitElement = element.thisOrAncestorOfType<CompilationUnitElement>();
-    if (unitElement is! CompilationUnitElementImpl) {
-      return null;
-    }
-
-    var generatedFile = _macroFiles.generatedFile(unitElement);
-    if (generatedFile == null) {
-      return null;
-    }
-
-    var nameOffset = element.nameOffset;
-    var nameLength = element.nameLength;
-
-    var lineInfo = generatedFile.lineInfo;
-    var offsetLocation = lineInfo.getLocation(nameOffset);
-    var endLocation = lineInfo.getLocation(nameOffset + nameLength);
-
-    return protocol.Location(generatedFile.path, nameOffset, nameLength,
-        offsetLocation.lineNumber, offsetLocation.columnNumber,
-        endLine: endLocation.lineNumber, endColumn: endLocation.columnNumber);
-  }
-}
-
-/// Note, this class changes the file system.
-class MacroFiles {
-  final ResourceProvider _resourceProvider;
-
-  /// Keys are source paths.
-  final Map<String, _MacroGeneratedFile> _files = {};
-
-  MacroFiles(this._resourceProvider);
-
-  /// If [unitElement] has macro-generated elements, write the combined
-  /// content into a new file in `.dart_tool`, and return the description of
-  /// this file.
-  _MacroGeneratedFile? generatedFile(CompilationUnitElementImpl unitElement) {
-    var sourcePath = unitElement.source.fullName;
-
-    var result = _files[sourcePath];
-    if (result != null) {
-      return result;
-    }
-
-    var sourceFile = _resourceProvider.getFile(sourcePath);
-
-    // TODO(scheglov) Use workspace?
-    Folder? packageRoot;
-    for (var parent in sourceFile.parent2.withAncestors) {
-      if (parent.getChildAssumingFile(file_paths.pubspecYaml).exists) {
-        packageRoot = parent;
-        break;
-      }
-    }
-    if (packageRoot == null) {
-      return null;
-    }
-
-    var pathContext = _resourceProvider.pathContext;
-    var relativePath = pathContext.relative(
-      sourcePath,
-      from: packageRoot.path,
-    );
-    var generatedPath = pathContext.join(
-        packageRoot.path, '.dart_tool', 'analyzer', 'macro', relativePath);
-
-    var generatedContent = unitElement.macroGeneratedContent;
-    if (generatedContent == null) {
-      return null;
-    }
-
-    try {
-      _resourceProvider.getFile(generatedPath)
-        ..parent2.create()
-        ..writeAsStringSync(generatedContent);
-    } on FileSystemException {
-      return null;
-    }
-
-    return _files[sourcePath] = _MacroGeneratedFile(
-      generatedPath,
-      generatedContent,
-    );
-  }
-}
-
-class _MacroGeneratedFile {
-  final String path;
-  final String content;
-  final LineInfo lineInfo;
-
-  _MacroGeneratedFile(this.path, this.content)
-      : lineInfo = LineInfo.fromContent(content);
-}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index d203ef9..a9bc050 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -6,7 +6,6 @@
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart'
     hide AnalysisGetNavigationParams;
-import 'package:analysis_server/src/domains/analysis/macro_files.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
@@ -16,7 +15,6 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
-import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:collection/collection.dart';
 
@@ -56,10 +54,8 @@
     final result = await server.getResolvedUnit(path);
     final unit = result?.unit;
     if (result?.state == ResultState.VALID && unit != null) {
-      computeDartNavigation(server.resourceProvider, collector, unit, offset, 0,
-          analyzerConverter: AnalyzerConverter(
-              locationProvider: MacroElementLocationProvider(
-                  MacroFiles(server.resourceProvider))));
+      computeDartNavigation(
+          server.resourceProvider, collector, unit, offset, 0);
       collector.createRegions();
     }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 71cc613..979ab11 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -141,6 +141,22 @@
 /// An object used to build a list of suggestions in response to a single
 /// completion request.
 class SuggestionBuilder {
+  /// The cache of suggestions for [Element]s. We use it to avoid computing
+  /// the same documentation, parameters, return type, etc for elements that
+  /// are exactly the same (the same instances) as they were the last time.
+  ///
+  /// This cache works because:
+  /// 1. Flutter applications usually reference many libraries, which they
+  /// consume, but don't change. So, all their elements stay unchanged.
+  /// 2. The analyzer keeps the same library instances loaded as the user
+  /// types in the application, so the instances of all elements stay the
+  /// same, and the cache works.
+  /// 3. The analyzer does not patch elements (at least not after the linking
+  /// process is done, and the elements are exposed to any client code). So,
+  /// any type information, or documentation, stays the same. If this changes,
+  /// we would need a signal, e.g. some modification counter on the element.
+  static final _elementSuggestionCache = Expando<_CompletionSuggestionEntry>();
+
   /// The completion request for which suggestions are being built.
   final DartCompletionRequest request;
 
@@ -1004,6 +1020,50 @@
       CompletionSuggestionKind? kind,
       String? prefix,
       required int relevance}) {
+    var inputs = _CompletionSuggestionInputs(
+      completion: completion,
+      elementKind: elementKind,
+      kind: kind,
+      prefix: prefix,
+    );
+
+    var cacheEntry = _elementSuggestionCache[element];
+    if (cacheEntry != null) {
+      if (cacheEntry.inputs == inputs) {
+        final suggestion = cacheEntry.suggestion;
+        suggestion.relevance = relevance;
+        return suggestion;
+      }
+    }
+
+    var suggestion = _createSuggestion0(
+      element,
+      completion: completion,
+      elementKind: elementKind,
+      kind: kind,
+      prefix: prefix,
+      relevance: relevance,
+    );
+    if (suggestion == null) {
+      return null;
+    }
+
+    _elementSuggestionCache[element] = _CompletionSuggestionEntry(
+      inputs: inputs,
+      suggestion: suggestion,
+    );
+    return suggestion;
+  }
+
+  /// The non-caching implementation of [_createSuggestion].
+  CompletionSuggestion? _createSuggestion0(
+    Element element, {
+    required String? completion,
+    required protocol.ElementKind? elementKind,
+    required CompletionSuggestionKind? kind,
+    required String? prefix,
+    required int relevance,
+  }) {
     if (element is ExecutableElement && element.isOperator) {
       // Do not include operators in suggestions
       return null;
@@ -1159,3 +1219,41 @@
   /// no `elementKindRelevance` table associated with the [completionLocation].
   void missingElementKindTableFor(String completionLocation);
 }
+
+/// The entry of the element to suggestion cache.
+class _CompletionSuggestionEntry {
+  final _CompletionSuggestionInputs inputs;
+
+  /// The suggestion computed for the element and [inputs].
+  final CompletionSuggestion suggestion;
+
+  _CompletionSuggestionEntry({
+    required this.inputs,
+    required this.suggestion,
+  });
+}
+
+/// The inputs, other than the [Element], that were provided to create an
+/// instance of [CompletionSuggestion].
+class _CompletionSuggestionInputs {
+  final String? completion;
+  final protocol.ElementKind? elementKind;
+  final CompletionSuggestionKind? kind;
+  final String? prefix;
+
+  _CompletionSuggestionInputs({
+    required this.completion,
+    required this.elementKind,
+    required this.kind,
+    required this.prefix,
+  });
+
+  @override
+  bool operator ==(Object other) {
+    return other is _CompletionSuggestionInputs &&
+        other.completion == completion &&
+        other.elementKind == elementKind &&
+        other.kind == kind &&
+        other.prefix == prefix;
+  }
+}
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index f334a64..035909b 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -918,63 +918,6 @@
     assertHasTargetString('my.lib');
   }
 
-  Future<void> test_macro_simpleIdentifier_getter() async {
-    // TODO(scheglov) Use PubPackageResolutionTest?
-    newFile('$projectPath/pubspec.yaml', content: '');
-
-    newFile('$projectPath/bin/macro_annotations.dart', content: r'''
-library analyzer.macro.annotations;
-const observable = 0;
-''');
-
-    addTestFile(r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-}
-
-void f(A a) {
-  a.foo;
-}
-''');
-
-    await prepareNavigation();
-    assertHasRegionString('foo;', 3);
-
-    var generatedFile = getFile(
-      '/project/.dart_tool/analyzer/macro/bin/test.dart',
-    );
-
-    var generatedContent = generatedFile.readAsStringSync();
-    expect(generatedContent, r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-
-  int get foo => _foo;
-
-  set foo(int val) {
-    print('Setting foo to ${val}');
-    _foo = val;
-  }
-}
-
-void f(A a) {
-  a.foo;
-}
-''');
-
-    assertHasFileTarget(
-      generatedFile.path,
-      generatedContent.indexOf('foo =>'),
-      'foo'.length,
-    );
-  }
-
   Future<void> test_multiplyDefinedElement() async {
     newFile('$projectPath/bin/libA.dart', content: 'library A; int TEST = 1;');
     newFile('$projectPath/bin/libB.dart', content: 'library B; int TEST = 2;');
diff --git a/pkg/analysis_server/test/lsp/definition_test.dart b/pkg/analysis_server/test/lsp/definition_test.dart
index 083158c..f15c592 100644
--- a/pkg/analysis_server/test/lsp/definition_test.dart
+++ b/pkg/analysis_server/test/lsp/definition_test.dart
@@ -188,71 +188,6 @@
     );
   }
 
-  Future<void> test_macro_simpleIdentifier_getter() async {
-    final macroAnnotationsContents = '''
-library analyzer.macro.annotations;
-const observable = 0;
-''';
-
-    final mainContents = '''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-}
-
-void f(A a) {
-  a.[[foo^]];
-}
-''';
-
-    final combinedContents = r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-
-  int get [[foo]] => _foo;
-
-  set foo(int val) {
-    print('Setting foo to ${val}');
-    _foo = val;
-  }
-}
-
-void f(A a) {
-  a.[[foo^]];
-}
-''';
-
-    final macroAnnotationsFileUri =
-        Uri.file(join(projectFolderPath, 'lib', 'macro_annotations.dart'));
-    final pubspecFileUri = Uri.file(join(projectFolderPath, 'pubspec.yaml'));
-    final combinedFileUri = Uri.file(join(projectFolderPath, '.dart_tool',
-        'analyzer', 'macro', 'lib', 'main.dart'));
-
-    await initialize(
-        textDocumentCapabilities:
-            withLocationLinkSupport(emptyTextDocumentClientCapabilities));
-    await openFile(pubspecFileUri, '');
-    await openFile(
-        macroAnnotationsFileUri, withoutMarkers(macroAnnotationsContents));
-    await openFile(mainFileUri, withoutMarkers(mainContents));
-    final res = await getDefinitionAsLocationLinks(
-        mainFileUri, positionFromMarker(mainContents));
-
-    expect(res, hasLength(1));
-    final loc = res.single;
-    expect(loc.originSelectionRange, equals(rangeFromMarkers(mainContents)));
-    expect(loc.targetUri, equals(combinedFileUri.toString()));
-
-    final getFooRange = rangesFromMarkers(combinedContents)[0];
-    expect(loc.targetRange, equals(getFooRange));
-    expect(loc.targetSelectionRange, equals(getFooRange));
-  }
-
   Future<void> test_nonDartFile() async {
     newFile(pubspecFilePath, content: simplePubspecContent);
     await initialize();
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index c07ce8f..cbbb42b 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -270,7 +270,6 @@
   CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
   CompileTimeErrorCode.LATE_FINAL_LOCAL_ALREADY_ASSIGNED,
   CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-  CompileTimeErrorCode.MACRO_EXECUTION_ERROR,
   CompileTimeErrorCode.MAIN_FIRST_POSITIONAL_PARAMETER_TYPE,
   CompileTimeErrorCode.MAIN_HAS_REQUIRED_NAMED_PARAMETERS,
   CompileTimeErrorCode.MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 5b6574a..1255129 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 = 180;
+  static const int DATA_VERSION = 181;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -950,7 +950,7 @@
 
     FileState file = _fileTracker.getFile(path);
     RecordingErrorListener listener = RecordingErrorListener();
-    CompilationUnit unit = file.parse(errorListener: listener);
+    CompilationUnit unit = file.parse(listener);
     return ParsedUnitResultImpl(currentSession, file.path, file.uri,
         file.content, file.lineInfo, file.isPart, unit, listener.errors);
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index eff19a9..620c43d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -368,21 +368,10 @@
   }
 
   /// Return a new parsed unresolved [CompilationUnit].
-  ///
-  /// If [content] is provided, then it is parsed instead, for example because
-  /// it contains macro-generated declarations, and we want to resolve the
-  /// unit with these declarations.
-  CompilationUnitImpl parse({
-    String? content,
-    AnalysisErrorListener? errorListener,
-  }) {
-    content ??= this.content;
+  CompilationUnitImpl parse([AnalysisErrorListener? errorListener]) {
     errorListener ??= AnalysisErrorListener.NULL_LISTENER;
     try {
-      return _parse(
-        content: content,
-        errorListener: errorListener,
-      );
+      return _parse(errorListener);
     } catch (exception, stackTrace) {
       throw CaughtExceptionWithFiles(
         exception,
@@ -560,10 +549,7 @@
     }
   }
 
-  CompilationUnitImpl _parse({
-    required String content,
-    required AnalysisErrorListener errorListener,
-  }) {
+  CompilationUnitImpl _parse(AnalysisErrorListener errorListener) {
     CharSequenceReader reader = CharSequenceReader(content);
     Scanner scanner = Scanner(source, reader, errorListener)
       ..configureFeatures(
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 78e7fc4e..d2a5859 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
@@ -50,6 +51,7 @@
 
 var timerLibraryAnalyzer = Stopwatch();
 var timerLibraryAnalyzerConst = Stopwatch();
+var timerLibraryAnalyzerFreshUnit = Stopwatch();
 var timerLibraryAnalyzerResolve = Stopwatch();
 var timerLibraryAnalyzerSplicer = Stopwatch();
 var timerLibraryAnalyzerVerify = Stopwatch();
@@ -104,9 +106,24 @@
   /// Compute analysis results for all units of the library.
   Map<FileState, UnitAnalysisResult> analyzeSync() {
     timerLibraryAnalyzer.start();
+    Map<FileState, CompilationUnitImpl> units = {};
+
+    // Parse all files.
+    timerLibraryAnalyzerFreshUnit.start();
+    for (FileState file in _library.libraryFiles) {
+      units[file] = _parse(file);
+    }
+    timerLibraryAnalyzerFreshUnit.stop();
+
+    // Resolve URIs in directives to corresponding sources.
+    FeatureSet featureSet = units[_library]!.featureSet;
+    units.forEach((file, unit) {
+      _validateFeatureSet(unit, featureSet);
+      _resolveUriBasedDirectives(file, unit);
+    });
 
     timerLibraryAnalyzerResolve.start();
-    var units = _resolveDirectives();
+    _resolveDirectives(units);
 
     units.forEach((file, unit) {
       _resolveFile(file, unit);
@@ -173,9 +190,7 @@
     units.forEach((file, unit) {
       List<AnalysisError> errors = _getErrorListener(file).errors;
       errors = _filterIgnoredErrors(file, errors);
-      var combinedResult = UnitAnalysisResult(file, unit, errors);
-      var writtenResult = _transformToWrittenCode(combinedResult);
-      results[file] = writtenResult;
+      results[file] = UnitAnalysisResult(file, unit, errors);
     });
     timerLibraryAnalyzer.stop();
     return results;
@@ -483,16 +498,10 @@
   }
 
   /// Return a new parsed unresolved [CompilationUnit].
-  CompilationUnitImpl _parse(
-    FileState file,
-    CompilationUnitElementImpl element,
-  ) {
+  CompilationUnitImpl _parse(FileState file) {
     AnalysisErrorListener errorListener = _getErrorListener(file);
-    String content = element.macroGeneratedContent ?? file.content;
-    var unit = file.parse(
-      content: content,
-      errorListener: errorListener,
-    );
+    String content = file.content;
+    var unit = file.parse(errorListener);
 
     LineInfo lineInfo = unit.lineInfo!;
     _fileToLineInfo[file] = lineInfo;
@@ -501,17 +510,9 @@
     return unit;
   }
 
-  Map<FileState, CompilationUnitImpl> _resolveDirectives() {
-    var units = <FileState, CompilationUnitImpl>{};
-
-    var definingElement = _libraryElement.definingCompilationUnit;
-    definingElement as CompilationUnitElementImpl;
-
-    var definingUnit = _parse(_library, definingElement);
-    units[_library] = definingUnit;
-
-    definingUnit.element = definingElement;
-    _resolveUriBasedDirectives(_library, definingUnit);
+  void _resolveDirectives(Map<FileState, CompilationUnitImpl> units) {
+    var definingCompilationUnit = units[_library]!;
+    definingCompilationUnit.element = _libraryElement.definingCompilationUnit;
 
     bool matchNodeElement(Directive node, Element element) {
       return node.keyword.offset == element.nameOffset;
@@ -524,7 +525,7 @@
     var directivesToResolve = <DirectiveImpl>[];
     int partDirectiveIndex = 0;
     int partElementIndex = 0;
-    for (Directive directive in definingUnit.directives) {
+    for (Directive directive in definingCompilationUnit.directives) {
       if (directive is LibraryDirectiveImpl) {
         libraryNameNode = directive.name;
         directivesToResolve.add(directive);
@@ -567,15 +568,10 @@
           continue;
         }
 
+        var partUnit = units[partFile]!;
         var partElement = _libraryElement.parts[partElementIndex++];
-        partElement as CompilationUnitElementImpl;
-
-        var partUnit = _parse(partFile, partElement);
-        units[partFile] = partUnit;
-
         partUnit.element = partElement;
         directive.element = partElement;
-        _resolveUriBasedDirectives(partFile, partUnit);
 
         Source? partSource = directive.uriSource;
         if (partSource == null) {
@@ -641,7 +637,6 @@
     }
 
     // TODO(scheglov) remove DirectiveResolver class
-    return units;
   }
 
   void _resolveFile(FileState file, CompilationUnit unit) {
@@ -760,74 +755,13 @@
     return directive.uri.stringValue ?? '';
   }
 
-  /// The [combined] result was resolved, potentially with macro-generated
-  /// declarations. But the result (at least the version that corresponds to
-  /// the original, user-written file) should not include these declarations.
-  /// So, we remove these nodes, and correspondingly patch the token sequence.
-  ///
-  /// Similarly, we transform any reported diagnostics.
-  UnitAnalysisResult _transformToWrittenCode(UnitAnalysisResult combined) {
-    var unit = combined.unit;
-    var unitElement = unit.declaredElement as CompilationUnitElementImpl;
-
-    var macroGenerationDataList = unitElement.macroGenerationDataList;
-    if (macroGenerationDataList == null) {
-      return combined;
+  /// Validate that the feature set associated with the compilation [unit] is
+  /// the same as the [expectedSet] of features supported by the library.
+  void _validateFeatureSet(CompilationUnit unit, FeatureSet expectedSet) {
+    FeatureSet actualSet = unit.featureSet;
+    if (actualSet != expectedSet) {
+      // TODO(brianwilkerson) Generate a diagnostic.
     }
-
-    for (var macroData in macroGenerationDataList.reversed) {
-      var classIndex = macroData.classDeclarationIndex;
-      if (classIndex != null) {
-        var classDeclaration = unit.declarations
-            .whereType<ClassDeclaration>()
-            .toList()[classIndex];
-        // A macro-generated declaration is always the last one.
-        var removed = classDeclaration.members.removeAt(
-          classDeclaration.members.length - 1,
-        );
-        // Patch the token sequence.
-        var followToken = removed.endToken.next!;
-        removed.beginToken.previous!.next = followToken;
-        // Shift the following tokens.
-        for (var t = followToken; t != unit.endToken; t = t.next!) {
-          t.offset -= macroData.insertLength;
-        }
-      } else {
-        // TODO(scheglov) implement top-level
-        throw UnimplementedError();
-      }
-    }
-
-    var errors = <AnalysisError>[];
-    for (var combinedError in combined.errors) {
-      var offset = combinedError.offset;
-      var isInWritten = true;
-      for (var macroData in macroGenerationDataList.reversed) {
-        if (offset > macroData.insertOffset) {
-          if (offset < macroData.insertOffset + macroData.insertLength) {
-            isInWritten = false;
-            break;
-          } else {
-            offset -= macroData.insertLength;
-          }
-        }
-      }
-      if (isInWritten) {
-        errors.add(
-          AnalysisError.forValues(
-            combinedError.source,
-            offset,
-            combinedError.length,
-            combinedError.errorCode,
-            combinedError.message,
-            combinedError.correction,
-            contextMessages: combinedError.contextMessages,
-          ),
-        );
-      }
-    }
-
-    return UnitAnalysisResult(combined.file, unit, errors);
   }
 
   /// Check the given [directive] to see if the referenced source exists and
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index cab5839..461b256 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -20,7 +20,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/summary2/link.dart' as link2;
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -115,13 +114,10 @@
 
       cycle.directDependencies.forEach(loadBundle);
 
-      var unitsInformativeData = <Uri, InformativeUnitData>{};
+      var unitsInformativeBytes = <Uri, Uint8List>{};
       for (var library in cycle.libraries) {
         for (var file in library.libraryFiles) {
-          unitsInformativeData[file.uri] = InformativeUnitData(
-            content: file.content,
-            bytes: file.getInformativeBytes(),
-          );
+          unitsInformativeBytes[file.uri] = file.getInformativeBytes();
         }
       }
 
@@ -200,7 +196,7 @@
         elementFactory.addBundle(
           BundleReader(
             elementFactory: elementFactory,
-            unitsInformativeData: unitsInformativeData,
+            unitsInformativeBytes: unitsInformativeBytes,
             resolutionBytes: resolutionBytes,
           ),
         );
@@ -249,7 +245,7 @@
           BundleReader(
             elementFactory: elementFactory,
             resolutionBytes: bundle.resolutionBytes,
-            unitsInformativeData: {},
+            unitsInformativeBytes: {},
           ),
         );
       }
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 6ca554a..3df0bb6 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
 Element? _readElement(AstNode node) {
@@ -92,13 +91,6 @@
   }
 }
 
-extension FieldDeclarationExtension on FieldDeclaration {
-  /// Return the element of the first field.
-  FieldElementImpl get firstElement {
-    return fields.variables.first.declaredElement as FieldElementImpl;
-  }
-}
-
 extension FormalParameterExtension on FormalParameter {
   bool get isOfLocalFunction {
     return thisOrAncestorOfType<FunctionBody>() != null;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 994614b..f1b79a3 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
-import 'dart:typed_data';
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/session.dart';
@@ -42,7 +41,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/macro/impl/error.dart' as macro;
 import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -416,7 +414,7 @@
 
 /// An [AbstractClassElementImpl] which is a class.
 class ClassElementImpl extends AbstractClassElementImpl
-    with TypeParameterizedElementMixin, HasMacroExecutionErrors {
+    with TypeParameterizedElementMixin {
   /// The superclass of the class, or `null` for [Object].
   InterfaceType? _supertype;
 
@@ -985,22 +983,6 @@
   @override
   late Source librarySource;
 
-  /// If this unit has macro-generated elements, and is created in the
-  /// environment where the file content is available (e.g. interactive
-  /// analysis, and not batch analysis), then this is a combination of the
-  /// user-written code and macro-generated declarations.
-  ///
-  /// For elements created from the user-written code [Element.nameOffset]s
-  /// are offsets in the user-written code.
-  ///
-  /// For macro-generated elements [Element.nameOffset]s are offsets in the
-  /// combined file containing both user-written and generated code.
-  String? macroGeneratedContent;
-
-  /// If this unit has macro-generated elements, information about each one
-  /// is stored here, so that it can be combined to [macroGeneratedContent].
-  List<MacroGenerationData>? macroGenerationDataList;
-
   /// A list containing all of the top-level accessors (getters and setters)
   /// contained in this compilation unit.
   List<PropertyAccessorElement> _accessors = const [];
@@ -1427,7 +1409,7 @@
 /// A concrete implementation of a [ConstructorElement].
 class ConstructorElementImpl extends ExecutableElementImpl
     with ConstructorElementMixin
-    implements ConstructorElement, HasMacroGenerationData {
+    implements ConstructorElement {
   /// The constructor to which this constructor is redirecting.
   ConstructorElement? _redirectedConstructor;
 
@@ -1436,9 +1418,6 @@
   List<ConstructorInitializer> _constantInitializers = const [];
 
   @override
-  MacroGenerationData? macro;
-
-  @override
   int? periodOffset;
 
   @override
@@ -2409,11 +2388,6 @@
   /// children of this element's parent.
   String get identifier => name!;
 
-  /// The informative data, or `null` if the element is synthetic, or if the
-  /// informative data is not available in this environment (e.g. semantics
-  /// only summaries in Bazel).
-  ElementInformativeDataSetImpl? get informative => null;
-
   bool get isNonFunctionTypeAliasesEnabled {
     return library!.featureSet.isEnabled(Feature.nonfunction_type_aliases);
   }
@@ -2630,51 +2604,6 @@
   FunctionType get typeInternal;
 }
 
-/// Informative data about an [ElementImpl].
-class ElementInformativeDataImpl {
-  /// The offset of the beginning of the element's code in the file.
-  final int codeOffset;
-
-  /// The length of the element's code in the file.
-  final int codeLength;
-
-  /// The documentation comment for this element.
-  final String? docComment;
-
-  /// The offset of the name of this element in the file that contains the
-  /// declaration of this element.
-  final int nameOffset;
-
-  ElementInformativeDataImpl({
-    required this.codeOffset,
-    required this.codeLength,
-    required this.docComment,
-    required this.nameOffset,
-  });
-}
-
-/// The set of informative data about an [ElementImpl].
-class ElementInformativeDataSetImpl {
-  /// Informative data in the user-written file.
-  ///
-  /// This property is `null` if the element was macro-generated.
-  final ElementInformativeDataImpl? written;
-
-  /// Informative data in the combined file, which is the user-written file
-  /// augmented with macro-generated declarations.
-  ///
-  /// This property cannot be `null`, because each element is either declared
-  /// by the user directly (so has [written] which is then transformed), or
-  /// is macro-generated, or is synthetic (so we don't have this object
-  /// at all).
-  final ElementInformativeDataImpl combined;
-
-  ElementInformativeDataSetImpl({
-    required this.written,
-    required this.combined,
-  });
-}
-
 /// A concrete implementation of an [ElementLocation].
 class ElementLocationImpl implements ElementLocation {
   /// The character used to separate components in the encoded form.
@@ -3314,7 +3243,6 @@
 
 /// A concrete implementation of a [FieldElement].
 class FieldElementImpl extends PropertyInducingElementImpl
-    with HasMacroExecutionErrors
     implements FieldElement {
   /// True if this field inherits from a covariant parameter. This happens
   /// when it overrides a field in a supertype that is covariant.
@@ -3570,19 +3498,6 @@
   }
 }
 
-mixin HasMacroExecutionErrors {
-  /// The list of errors recorded during execution of macro builders
-  /// over this element.
-  List<macro.MacroExecutionError> macroExecutionErrors = [];
-}
-
-/// This interface is implemented by [Element]s that can be added by macros.
-abstract class HasMacroGenerationData {
-  /// If this element was added by a macro, the code of a declaration that
-  /// was produced by the macro.
-  MacroGenerationData? macro;
-}
-
 /// A concrete implementation of a [HideElementCombinator].
 class HideElementCombinatorImpl implements HideElementCombinator {
   @override
@@ -4267,56 +4182,8 @@
       visitor.visitLocalVariableElement(this);
 }
 
-/// Information about a macro-produced [Element].
-class MacroGenerationData {
-  /// The sequential id of this macro-produced element, for an element created
-  /// for a declaration that was macro-generated later this value is greater.
-  ///
-  /// This is different from [ElementImpl.id], which is also incrementing,
-  /// but shows the order in which elements were built from declarations,
-  /// not the order of declarations, and we process all field declarations
-  /// before method declarations.
-  final int id;
-
-  /// The code that was produced by the macro. It is used to compose full
-  /// code of a unit to display to the user, so that new declarations are
-  /// added to the end of the unit or existing classes.
-  ///
-  /// When a class is generated, its code might have some members, or might
-  /// be empty, and new elements might be macro-generated into it.
-  final String code;
-
-  /// Informative data derived from the [code], such as offsets.
-  final Uint8List informative;
-
-  /// If this element is macro-generated into a class declaration, this is
-  /// the index of this class declaration in the unit.
-  final int? classDeclarationIndex;
-
-  /// The offset in [CompilationUnitElementImpl.macroGeneratedContent],
-  /// where the [code] is located. This offset depends on the informative
-  /// data, as any other offset.
-  late int codeOffset;
-
-  /// Similar to [codeOffset], but the offset of the prefix before [code].
-  late int insertOffset;
-
-  /// The length of the string inserted at [insertOffset]. This string
-  /// consists of the [code] itself, with leading and trailing whitespaces
-  /// and newlines for better formatting.
-  late int insertLength;
-
-  MacroGenerationData({
-    required this.id,
-    required this.code,
-    required this.informative,
-    required this.classDeclarationIndex,
-  });
-}
-
 /// A concrete implementation of a [MethodElement].
-class MethodElementImpl extends ExecutableElementImpl
-    implements MethodElement, HasMacroGenerationData {
+class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
   /// Is `true` if this method is `operator==`, and there is no explicit
   /// type specified for its formal parameter, in this method or in any
   /// overridden methods other than the one declared in `Object`.
@@ -4326,9 +4193,6 @@
   /// this variable is not a subject of type inference, or there was no error.
   TopLevelInferenceError? typeInferenceError;
 
-  @override
-  MacroGenerationData? macro;
-
   /// Initialize a newly created method element to have the given [name] at the
   /// given [offset].
   MethodElementImpl(String name, int offset) : super(name, offset);
@@ -5130,14 +4994,11 @@
 
 /// A concrete implementation of a [PropertyAccessorElement].
 class PropertyAccessorElementImpl extends ExecutableElementImpl
-    implements PropertyAccessorElement, HasMacroGenerationData {
+    implements PropertyAccessorElement {
   /// The variable associated with this accessor.
   @override
   late PropertyInducingElement variable;
 
-  @override
-  MacroGenerationData? macro;
-
   /// Initialize a newly created property accessor element to have the given
   /// [name] and [offset].
   PropertyAccessorElementImpl(String name, int offset) : super(name, offset);
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 26f8a6d..d52742b 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -31,7 +31,6 @@
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/summary2/link.dart' as link2;
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -835,15 +834,12 @@
       var resolutionData = byteStore.get(resolutionKey, cycle.signature);
       var resolutionBytes = resolutionData?.bytes;
 
-      var unitsInformativeData = <Uri, InformativeUnitData>{};
+      var unitsInformativeBytes = <Uri, Uint8List>{};
       for (var library in cycle.libraries) {
         for (var file in library.libraryFiles) {
           var informativeBytes = file.informativeBytes;
           if (informativeBytes != null) {
-            unitsInformativeData[file.uri] = InformativeUnitData(
-              content: file.getContentWithSameDigest(),
-              bytes: informativeBytes,
-            );
+            unitsInformativeBytes[file.uri] = informativeBytes;
           }
         }
       }
@@ -913,7 +909,7 @@
         elementFactory.addBundle(
           BundleReader(
             elementFactory: elementFactory,
-            unitsInformativeData: unitsInformativeData,
+            unitsInformativeBytes: unitsInformativeBytes,
             resolutionBytes: resolutionBytes as Uint8List,
           ),
         );
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 0754988..0b43ce7 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -7831,15 +7831,6 @@
           hasPublishedDocs: true);
 
   /**
-   * Parameters:
-   * 0: the name of the macro
-   * 1: the message
-   */
-  static const CompileTimeErrorCode MACRO_EXECUTION_ERROR =
-      CompileTimeErrorCode(
-          'MACRO_EXECUTION_ERROR', "Exception thrown by macro {0}: {1}");
-
-  /**
    * No parameters.
    */
   // #### Description
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 5c03dd2..ecedd89 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -45,7 +45,6 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/this_access_tracker.dart';
-import 'package:analyzer/src/macro/impl/error.dart' as macro;
 import 'package:collection/collection.dart';
 
 class EnclosingExecutableContext {
@@ -445,8 +444,7 @@
     var outerClass = _enclosingClass;
     try {
       _isInNativeClass = node.nativeClause != null;
-      var enclosingClass = node.declaredElement as ClassElementImpl;
-      _enclosingClass = enclosingClass;
+      _enclosingClass = node.declaredElement as ClassElementImpl;
 
       List<ClassMember> members = node.members;
       _duplicateDefinitionVerifier.checkClass(node);
@@ -470,10 +468,6 @@
       _checkForBadFunctionUse(node);
       _checkForWrongTypeParameterVarianceInSuperinterfaces();
       _checkForMainFunction(node.name);
-      _reportMacroExecutionErrors(
-        node.metadata,
-        enclosingClass.macroExecutionErrors,
-      );
       super.visitClassDeclaration(node);
     } finally {
       _isInNativeClass = false;
@@ -654,10 +648,6 @@
       _checkForNotInitializedNonNullableStaticField(node);
       _checkForWrongTypeParameterVarianceInField(node);
       _checkForLateFinalFieldWithConstConstructor(node);
-      _reportMacroExecutionErrors(
-        node.metadata,
-        node.firstElement.macroExecutionErrors,
-      );
       super.visitFieldDeclaration(node);
     } finally {
       _isInStaticVariableDeclaration = false;
@@ -4999,23 +4989,6 @@
     return null;
   }
 
-  /// Report [macroExecutionErrors] at the corresponding [annotations].
-  void _reportMacroExecutionErrors(
-    List<Annotation> annotations,
-    List<macro.MacroExecutionError> macroExecutionErrors,
-  ) {
-    for (var macroExecutionError in macroExecutionErrors) {
-      errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.MACRO_EXECUTION_ERROR,
-        annotations[macroExecutionError.annotationIndex],
-        [
-          macroExecutionError.macroName,
-          macroExecutionError.message,
-        ],
-      );
-    }
-  }
-
   void _withEnclosingExecutable(
     ExecutableElement element,
     void Function() operation,
diff --git a/pkg/analyzer/lib/src/macro/api/code.dart b/pkg/analyzer/lib/src/macro/api/code.dart
deleted file mode 100644
index a3fed07..0000000
--- a/pkg/analyzer/lib/src/macro/api/code.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2021, 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.
-
-/// Combines [parts] into a [String].
-/// Must only contain [Code] or [String] instances.
-String _combineParts(List<Object> parts) {
-  var buffer = StringBuffer();
-
-  void write(Object part) {
-    if (part is String) {
-      buffer.write(part);
-    } else if (part is Code) {
-      buffer.write(part.code);
-    } else if (part is Iterable<Object>) {
-      part.forEach(write);
-    } else {
-      throw UnsupportedError(
-        'Only String, Code, and List(s) of them are '
-        'allowed but got ${part.runtimeType}',
-      );
-    }
-  }
-
-  write(parts);
-  return buffer.toString();
-}
-
-/// The representation of a piece of code.
-abstract class Code {
-  String get code;
-
-  @override
-  String toString() => code;
-}
-
-/// A piece of code representing a syntactically valid declaration.
-class Declaration extends Code {
-  @override
-  final String code;
-
-  Declaration(this.code);
-
-  /// Creates a [Declaration] from [parts], which must be of type [Code],
-  /// [String], or [Iterable]s of them.
-  factory Declaration.fromParts(List<Object> parts) =>
-      Declaration(_combineParts(parts));
-}
-
-/// A piece of code that can't be parsed into a valid language construct in its
-/// current form. No validation or parsing is performed.
-class Fragment extends Code {
-  @override
-  final String code;
-
-  Fragment(this.code);
-
-  /// Creates a [Fragment] from [parts], which must be of type [Code],
-  /// [String], or [Iterable]s of them.
-  factory Fragment.fromParts(List<Object> parts) =>
-      Fragment(_combineParts(parts));
-}
diff --git a/pkg/analyzer/lib/src/macro/api/macro.dart b/pkg/analyzer/lib/src/macro/api/macro.dart
deleted file mode 100644
index 78eb6c0..0000000
--- a/pkg/analyzer/lib/src/macro/api/macro.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/src/macro/api/code.dart';
-
-/// The api used by [DeclarationMacro]s to contribute new declarations to the
-/// current class.
-///
-/// Note that this is available to macros that run directly on classes, as well
-/// as macros that run on any members of a class.
-abstract class ClassDeclarationBuilder implements DeclarationBuilder {
-  /// Adds a new declaration to the surrounding class.
-  void addToClass(Declaration declaration);
-}
-
-/// The interface for [DeclarationMacro]s that can be applied to classes.
-abstract class ClassDeclarationMacro implements DeclarationMacro {
-  void visitClassDeclaration(
-      ast.ClassDeclaration declaration, ClassDeclarationBuilder builder);
-}
-
-/// The api used by [DeclarationMacro]s to contribute new declarations to the
-/// current library.
-abstract class DeclarationBuilder {
-  /// Adds a new regular declaration to the surrounding library.
-  ///
-  /// Note that type declarations are not supported.
-  void addToLibrary(Declaration declaration);
-
-  /// Return the [Code] of the [node].
-  Code typeAnnotationCode(ast.TypeAnnotation node);
-}
-
-/// The marker interface for macros that are allowed to contribute new
-/// declarations to the program, including both top level and class level
-/// declarations.
-///
-/// These macros run after [TypeMacro] macros, but before [DefinitionMacro]
-/// macros.
-///
-/// These macros can resolve type annotations to specific declarations, and
-/// inspect type hierarchies, but they cannot inspect the declarations on those
-/// type annotations, since new declarations could still be added in this phase.
-abstract class DeclarationMacro implements Macro {}
-
-/// The marker interface for macros that are only allowed to implement or wrap
-/// existing declarations in the program. They cannot introduce any new
-/// declarations that are visible to the program, but are allowed to add
-/// declarations that only they can see.
-///
-/// These macros run after all other types of macros.
-///
-/// These macros can fully reflect on the program since the static shape is
-/// fully defined by the time they run.
-abstract class DefinitionMacro implements Macro {}
-
-/// The interface for [DeclarationMacro]s that can be applied to fields.
-abstract class FieldDeclarationMacro implements DeclarationMacro {
-  void visitFieldDeclaration(
-    ast.FieldDeclaration declaration,
-    ClassDeclarationBuilder builder,
-  );
-}
-
-/// The marker interface for all types of macros.
-abstract class Macro {}
-
-/// The marker interface for macros that are allowed to contribute new type
-/// declarations into the program.
-///
-/// These macros run before all other types of macros.
-///
-/// In exchange for the power to add new type declarations, these macros have
-/// limited introspections capabilities, since new types can be added in this
-/// phase you cannot follow type references back to their declarations.
-abstract class TypeMacro implements Macro {}
diff --git a/pkg/analyzer/lib/src/macro/builders/data_class.dart b/pkg/analyzer/lib/src/macro/builders/data_class.dart
deleted file mode 100644
index a4a0393..0000000
--- a/pkg/analyzer/lib/src/macro/builders/data_class.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/macro/api/code.dart';
-import 'package:analyzer/src/macro/api/macro.dart';
-
-class AutoConstructorMacro implements ClassDeclarationMacro {
-  const AutoConstructorMacro();
-
-  @override
-  void visitClassDeclaration(
-    ast.ClassDeclaration node,
-    ClassDeclarationBuilder builder,
-  ) {
-    // TODO(scheglov) Should we provide the element as a parameter?
-    var classElement = node.declaredElement!;
-    var typeSystem = classElement.library.typeSystem;
-
-    if (classElement.unnamedConstructor != null) {
-      throw ArgumentError(
-        'Cannot generate a constructor because one already exists',
-      );
-    }
-
-    var fieldsCode = classElement.fields.map((field) {
-      var isNullable = typeSystem.isNullable(field.type);
-      var requiredKeyword = isNullable ? '' : 'required ';
-      return '${requiredKeyword}this.${field.name}';
-    }).join(', ');
-
-    // TODO(scheglov) super constructor
-
-    builder.addToClass(
-      Declaration('${classElement.name}({$fieldsCode});'),
-    );
-  }
-}
-
-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();
-
-  @override
-  void visitClassDeclaration(
-    ast.ClassDeclaration node,
-    ClassDeclarationBuilder builder,
-  ) {
-    var expression = node.declaredElement!.allFields
-        .map((e) => '${e.name}.hashCode')
-        .join(' ^ ');
-    builder.addToClass(
-      Declaration('''
-  @override
-  int get hashCode => $expression;
-'''),
-    );
-  }
-}
-
-class ToStringMacro implements ClassDeclarationMacro {
-  const ToStringMacro();
-
-  @override
-  void visitClassDeclaration(
-    ast.ClassDeclaration node,
-    ClassDeclarationBuilder builder,
-  ) {
-    var classElement = node.declaredElement!;
-    var fieldsCode = classElement.allFields.map((field) {
-      var name = field.name;
-      return '$name: \$$name';
-    }).join(', ');
-    builder.addToClass(
-      Declaration('''
-  @override
-  String toString() => '${classElement.name}($fieldsCode)';
-'''),
-    );
-  }
-}
-
-extension on ClassElement {
-  Iterable<FieldElement> get allFields sync* {
-    for (ClassElement? class_ = this; class_ != null;) {
-      yield* class_.fields.where((e) => !e.isSynthetic);
-      class_ = class_.supertype?.element;
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/macro/builders/observable.dart b/pkg/analyzer/lib/src/macro/builders/observable.dart
deleted file mode 100644
index dac5565..0000000
--- a/pkg/analyzer/lib/src/macro/builders/observable.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/src/macro/api/code.dart';
-import 'package:analyzer/src/macro/api/macro.dart';
-
-class ObservableMacro implements FieldDeclarationMacro {
-  const ObservableMacro();
-
-  @override
-  void visitFieldDeclaration(
-    ast.FieldDeclaration node,
-    ClassDeclarationBuilder builder,
-  ) {
-    var typeNode = node.fields.type;
-    if (typeNode == null) {
-      throw ArgumentError('@observable can only annotate typed fields.');
-    }
-    var typeCode = builder.typeAnnotationCode(typeNode);
-
-    var fields = node.fields.variables;
-    for (var field in fields) {
-      var name = field.name.name;
-      if (!name.startsWith('_')) {
-        throw ArgumentError(
-          '@observable can only annotate private fields, and it will create '
-          'public getters and setters for them, but the public field '
-          '$name was annotated.',
-        );
-      }
-      var publicName = name.substring(1);
-
-      var getter = Declaration(
-        '  $typeCode get $publicName => $name;',
-      );
-      builder.addToClass(getter);
-
-      var setter = Declaration('''
-  set $publicName($typeCode val) {
-    print('Setting $publicName to \${val}');
-    $name = val;
-  }
-''');
-      builder.addToClass(setter);
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/macro/impl/error.dart b/pkg/analyzer/lib/src/macro/impl/error.dart
deleted file mode 100644
index 8c2780c..0000000
--- a/pkg/analyzer/lib/src/macro/impl/error.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2021, 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.
-
-/// Error that happened during executing a macro builder.
-class MacroExecutionError {
-  final int annotationIndex;
-  final String macroName;
-  final String message;
-
-  MacroExecutionError({
-    required this.annotationIndex,
-    required this.macroName,
-    required this.message,
-  });
-}
diff --git a/pkg/analyzer/lib/src/macro/impl/macro.dart b/pkg/analyzer/lib/src/macro/impl/macro.dart
deleted file mode 100644
index 32c6358..0000000
--- a/pkg/analyzer/lib/src/macro/impl/macro.dart
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/analysis/utilities.dart';
-import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/src/dart/ast/ast.dart' as ast;
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/macro/api/code.dart';
-import 'package:analyzer/src/macro/api/macro.dart';
-import 'package:analyzer/src/summary2/informative_data.dart';
-import 'package:analyzer/src/summary2/library_builder.dart';
-
-class ClassDeclarationBuilderImpl extends DeclarationBuilderImpl
-    implements ClassDeclarationBuilder {
-  final LinkingUnit linkingUnit;
-
-  /// The index of [node] among other [ast.ClassDeclarationImpl]s.
-  final int nodeIndex;
-
-  final ast.ClassDeclarationImpl node;
-
-  ClassDeclarationBuilderImpl(
-    this.linkingUnit,
-    this.nodeIndex,
-    this.node,
-  );
-
-  @override
-  void addToClass(Declaration declaration) {
-    var declarationCode = declaration.code.trim();
-
-    // TODO(scheglov) feature set
-    // TODO(scheglov) throw if errors?
-    var parseResult = parseString(
-      content: 'class ${node.name.name} { $declarationCode }',
-    );
-    var parsedDeclarations = parseResult.unit.declarations;
-    var parsedClass = parsedDeclarations.single as ast.ClassDeclaration;
-    var parsedMember = parsedClass.members.single;
-    _rebaseOffsets(parsedMember);
-
-    node.members.add(parsedMember);
-
-    var macroGeneratedContent = linkingUnit.macroGeneratedContent;
-    var collected = _Declaration(
-      data: MacroGenerationData(
-        id: macroGeneratedContent.nextId++,
-        code: declarationCode,
-        informative: writeDeclarationInformative(parsedMember),
-        classDeclarationIndex: nodeIndex,
-      ),
-      node: parsedMember,
-    );
-    macroGeneratedContent._declarations.add(collected);
-  }
-
-  /// We parsed [node] in the context of some synthetic code string, its
-  /// current offsets only have meaning relative to the begin offset of the
-  /// [node]. So, we update offsets accordingly.
-  static void _rebaseOffsets(ast.AstNode node) {
-    var baseOffset = node.offset;
-    for (Token? t = node.beginToken;
-        t != null && t != node.endToken;
-        t = t.next) {
-      t.offset -= baseOffset;
-    }
-  }
-}
-
-class DeclarationBuilderImpl implements DeclarationBuilder {
-  @override
-  void addToLibrary(Declaration declaration) {
-    // TODO: implement addToLibrary
-  }
-
-  @override
-  Code typeAnnotationCode(ast.TypeAnnotation node) {
-    return Fragment(node.toSource());
-  }
-}
-
-class MacroGeneratedContent {
-  final LinkingUnit linkingUnit;
-  final List<_Declaration> _declarations = [];
-  int nextId = 0;
-
-  MacroGeneratedContent(this.linkingUnit);
-
-  /// Finish building of elements: combine the source code of the unit with
-  /// macro-generated pieces of code; update offsets of macro-generated
-  /// elements to use offsets inside this combined code.
-  void finish() {
-    // Don't set empty values, keep it null.
-    if (_declarations.isEmpty) {
-      return;
-    }
-
-    // Sort declarations by:
-    // 1. The top-level declaration location.
-    // 2. The ordering in the top-level declaration.
-    // We need (2) because `sort` is not stable.
-    _declarations.sort((a, b) {
-      const indexForUnit = 1 << 24;
-      var aIndex = a.data.classDeclarationIndex ?? indexForUnit;
-      var bIndex = b.data.classDeclarationIndex ?? indexForUnit;
-      if (aIndex != bIndex) {
-        return aIndex - bIndex;
-      }
-      return a.data.id - b.data.id;
-    });
-
-    const classMemberCodePrefix = '\n  ';
-    const classMemberCodeSuffix = '\n';
-    // TODO(scheglov) make it required?
-    var generatedContent = linkingUnit.input.sourceContent!;
-    var shift = 0;
-    var classDeclarations = linkingUnit.input.unit.declarations
-        .whereType<ast.ClassDeclaration>()
-        .toList();
-    for (var declaration in _declarations) {
-      var classIndex = declaration.data.classDeclarationIndex;
-      if (classIndex != null) {
-        var targetClass = classDeclarations[classIndex];
-        var code = classMemberCodePrefix +
-            declaration.data.code +
-            classMemberCodeSuffix;
-        var insertOffset = shift + targetClass.rightBracket.offset;
-        declaration.data.insertOffset = insertOffset;
-        declaration.data.codeOffset =
-            insertOffset + classMemberCodePrefix.length;
-        generatedContent = generatedContent.substring(0, insertOffset) +
-            code +
-            generatedContent.substring(insertOffset);
-        declaration.data.insertLength = code.length;
-        shift += code.length;
-      } else {
-        throw UnimplementedError();
-      }
-
-      var node = declaration.node;
-      if (node is ast.Declaration) {
-        var element = node.declaredElement as ElementImpl;
-        element.accept(
-          _ShiftOffsetsElementVisitor(declaration.data.codeOffset),
-        );
-        if (element is HasMacroGenerationData) {
-          (element as HasMacroGenerationData).macro = declaration.data;
-        }
-      }
-    }
-
-    linkingUnit.element.macroGeneratedContent = generatedContent;
-    linkingUnit.element.macroGenerationDataList =
-        _declarations.map((e) => e.data).toList();
-  }
-}
-
-/// [MacroGenerationData] plus its linking [node] (to get the element).
-class _Declaration {
-  final MacroGenerationData data;
-  final ast.AstNode node;
-
-  _Declaration({
-    required this.data,
-    required this.node,
-  });
-}
-
-/// TODO(scheglov) Enhance to support more nodes.
-/// For now only nodes that are currently used in tests are supported.
-/// Which is probably enough for experiments, but should be improved if this
-/// is something we are going to do for real.
-class _ShiftOffsetsAstVisitor extends RecursiveAstVisitor<void> {
-  final int shift;
-
-  _ShiftOffsetsAstVisitor(this.shift);
-
-  @override
-  void visitAnnotation(ast.Annotation node) {
-    _token(node.atSign);
-    super.visitAnnotation(node);
-  }
-
-  @override
-  void visitSimpleIdentifier(ast.SimpleIdentifier node) {
-    _token(node.token);
-  }
-
-  void _token(Token token) {
-    token.offset += shift;
-  }
-}
-
-/// Macro-generated elements are created from pieces of code that are rebased
-/// to start at zero-th offset. When we later know that actual offset in the
-/// combined (source + generated) code of the unit, we shift the offsets.
-class _ShiftOffsetsElementVisitor extends GeneralizingElementVisitor<void> {
-  final int shift;
-
-  _ShiftOffsetsElementVisitor(this.shift);
-
-  @override
-  void visitElement(covariant ElementImpl element) {
-    element.nameOffset += shift;
-    _metadata(element.metadata);
-    super.visitElement(element);
-  }
-
-  void _metadata(List<ElementAnnotation> metadata) {
-    for (var annotation in metadata) {
-      annotation as ElementAnnotationImpl;
-      annotation.annotationAst.accept(
-        _ShiftOffsetsAstVisitor(shift),
-      );
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 2b75f9e..bd9248b 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/macro/impl/error.dart' as macro;
 import 'package:analyzer/src/summary2/ast_binary_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_tag.dart';
 import 'package:analyzer/src/summary2/data_reader.dart';
@@ -31,16 +30,16 @@
 
 class BundleReader {
   final SummaryDataReader _reader;
-  final Map<Uri, InformativeUnitData> _unitsInformativeData;
+  final Map<Uri, Uint8List> _unitsInformativeBytes;
 
   final Map<String, LibraryReader> libraryMap = {};
 
   BundleReader({
     required LinkedElementFactory elementFactory,
     required Uint8List resolutionBytes,
-    Map<Uri, InformativeUnitData> unitsInformativeData = const {},
+    Map<Uri, Uint8List> unitsInformativeBytes = const {},
   })  : _reader = SummaryDataReader(resolutionBytes),
-        _unitsInformativeData = unitsInformativeData {
+        _unitsInformativeBytes = unitsInformativeBytes {
     _reader.offset = _reader.bytes.length - 4 * 4;
     var baseResolutionOffset = _reader.readUInt32();
     var librariesOffset = _reader.readUInt32();
@@ -70,7 +69,7 @@
       libraryMap[uriStr] = LibraryReader._(
         elementFactory: elementFactory,
         reader: _reader,
-        unitsInformativeData: _unitsInformativeData,
+        unitsInformativeBytes: _unitsInformativeBytes,
         baseResolutionOffset: baseResolutionOffset,
         referenceReader: referenceReader,
         reference: reference,
@@ -413,12 +412,11 @@
 class LibraryReader {
   final LinkedElementFactory _elementFactory;
   final SummaryDataReader _reader;
-  final Map<Uri, InformativeUnitData> _unitsInformativeData;
+  final Map<Uri, Uint8List> _unitsInformativeBytes;
   final int _baseResolutionOffset;
   final _ReferenceReader _referenceReader;
   final Reference _reference;
   final int _offset;
-  final Map<int, MacroGenerationData> _macroDeclarations = {};
 
   final Uint32List _classMembersLengths;
   int _classMembersLengthsIndex = 0;
@@ -428,7 +426,7 @@
   LibraryReader._({
     required LinkedElementFactory elementFactory,
     required SummaryDataReader reader,
-    required Map<Uri, InformativeUnitData> unitsInformativeData,
+    required Map<Uri, Uint8List> unitsInformativeBytes,
     required int baseResolutionOffset,
     required _ReferenceReader referenceReader,
     required Reference reference,
@@ -436,7 +434,7 @@
     required Uint32List classMembersLengths,
   })  : _elementFactory = elementFactory,
         _reader = reader,
-        _unitsInformativeData = unitsInformativeData,
+        _unitsInformativeBytes = unitsInformativeBytes,
         _baseResolutionOffset = baseResolutionOffset,
         _referenceReader = referenceReader,
         _reference = reference,
@@ -494,10 +492,8 @@
 
     _declareDartCoreDynamicNever();
 
-    InformativeDataApplier(_elementFactory).applyTo(
-      _unitsInformativeData,
-      libraryElement,
-    );
+    InformativeDataApplier(_elementFactory, _unitsInformativeBytes)
+        .applyTo(libraryElement);
 
     return libraryElement;
   }
@@ -529,10 +525,6 @@
     element.setLinkedData(reference, linkedData);
     ClassElementFlags.read(_reader, element);
 
-    element.macroExecutionErrors = _reader.readTypedList(
-      _readMacroExecutionError,
-    );
-
     element.typeParameters = _readTypeParameters();
 
     if (!element.isMixinApplication) {
@@ -595,7 +587,6 @@
       element.setLinkedData(reference, linkedData);
       ConstructorElementFlags.read(_reader, element);
       element.parameters = _readParameters(element, reference);
-      _readMacro(element, element);
       return element;
     });
   }
@@ -765,9 +756,6 @@
 
     FieldElementFlags.read(_reader, element);
     element.typeInferenceError = _readTopLevelInferenceError();
-    element.macroExecutionErrors = _reader.readTypedList(
-      _readMacroExecutionError,
-    );
     element.createImplicitAccessors(classReference, name);
 
     return element;
@@ -859,29 +847,6 @@
     return LibraryLanguageVersion(package: package, override: override);
   }
 
-  void _readMacro(Element element, HasMacroGenerationData hasMacro) {
-    var id = _reader.readOptionalUInt30();
-    if (id != null) {
-      var data = _macroDeclarations[id]!;
-      hasMacro.macro = data;
-      InformativeDataApplier(
-        _elementFactory,
-        baseOffset: data.codeOffset,
-      ).applyToDeclaration(
-        element,
-        data.informative,
-      );
-    }
-  }
-
-  macro.MacroExecutionError _readMacroExecutionError() {
-    return macro.MacroExecutionError(
-      annotationIndex: _reader.readUInt30(),
-      macroName: _reader.readStringReference(),
-      message: _reader.readStringReference(),
-    );
-  }
-
   List<MethodElementImpl> _readMethods(
     CompilationUnitElementImpl unitElement,
     ElementImpl enclosingElement,
@@ -905,7 +870,6 @@
       element.typeParameters = _readTypeParameters();
       element.parameters = _readParameters(element, reference);
       element.typeInferenceError = _readTopLevelInferenceError();
-      _readMacro(element, element);
       return element;
     });
   }
@@ -1047,7 +1011,6 @@
     element.setLinkedData(reference, linkedData);
 
     element.parameters = _readParameters(element, reference);
-    _readMacro(element, element);
     return element;
   }
 
@@ -1267,7 +1230,6 @@
     unitElement.uri = _reader.readOptionalStringReference();
     unitElement.isSynthetic = _reader.readBool();
 
-    _readUnitMacroGenerationDataList(unitElement);
     _readClasses(unitElement, unitReference);
     _readEnums(unitElement, unitReference);
     _readExtensions(unitElement, unitReference);
@@ -1285,28 +1247,6 @@
     return unitElement;
   }
 
-  void _readUnitMacroGenerationDataList(
-    CompilationUnitElementImpl unitElement,
-  ) {
-    var length = _reader.readUInt30();
-    if (length == 0) {
-      return;
-    }
-
-    var dataList = List.generate(length, (index) {
-      return MacroGenerationData(
-        id: _reader.readUInt30(),
-        code: _reader.readStringUtf8(),
-        informative: _reader.readUint8List(),
-        classDeclarationIndex: _reader.readOptionalUInt30(),
-      );
-    });
-    unitElement.macroGenerationDataList = dataList;
-    for (var data in dataList) {
-      _macroDeclarations[data.id] = data;
-    }
-  }
-
   static Variance? _decodeVariance(int index) {
     var tag = TypeParameterVarianceTag.values[index];
     switch (tag) {
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 33e913e..f6fdf85 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
-import 'package:analyzer/src/macro/impl/error.dart' as macro;
 import 'package:analyzer/src/summary2/ast_binary_tag.dart';
 import 'package:analyzer/src/summary2/ast_binary_writer.dart';
 import 'package:analyzer/src/summary2/data_writer.dart';
@@ -130,11 +129,6 @@
     _sink._writeStringReference(element.name);
     ClassElementFlags.write(_sink, element);
 
-    _writeList(
-      element.macroExecutionErrors,
-      _sink._writeMacroExecutionError,
-    );
-
     _resolutionSink._writeAnnotationList(element.metadata);
 
     _writeTypeParameters(element.typeParameters, () {
@@ -168,7 +162,6 @@
 
     _resolutionSink.localElements.withElements(element.parameters, () {
       _writeList(element.parameters, _writeParameterElement);
-      _writeMacro(element.macro);
       _resolutionSink.writeElement(element.redirectedConstructor);
       _resolutionSink._writeNodeList(element.constantInitializers);
     });
@@ -231,10 +224,6 @@
     _sink.writeBool(element is ConstFieldElementImpl);
     FieldElementFlags.write(_sink, element);
     _sink._writeTopLevelInferenceError(element.typeInferenceError);
-    _writeList(
-      element.macroExecutionErrors,
-      _sink._writeMacroExecutionError,
-    );
     _resolutionSink._writeAnnotationList(element.metadata);
     _resolutionSink.writeType(element.type);
     _resolutionSink._writeOptionalNode(element.constantInitializer);
@@ -285,10 +274,6 @@
     }
   }
 
-  void _writeMacro(MacroGenerationData? macro) {
-    _sink.writeOptionalUInt30(macro?.id);
-  }
-
   void _writeMethodElement(MethodElement element) {
     element as MethodElementImpl;
     _sink.writeUInt30(_resolutionSink.offset);
@@ -302,8 +287,6 @@
       _sink._writeTopLevelInferenceError(element.typeInferenceError);
       _resolutionSink.writeType(element.returnType);
     });
-
-    _writeMacro(element.macro);
   }
 
   void _writeMixinElement(ClassElement element) {
@@ -378,9 +361,7 @@
 
     _resolutionSink._writeAnnotationList(element.metadata);
     _resolutionSink.writeType(element.returnType);
-
     _writeList(element.parameters, _writeParameterElement);
-    _writeMacro(element.macro);
   }
 
   void _writeReferences(List<Reference> references) {
@@ -450,7 +431,6 @@
     _sink._writeOptionalStringReference(unitElement.uri);
     _sink.writeBool(unitElement.isSynthetic);
     _resolutionSink._writeAnnotationList(unitElement.metadata);
-    _writeUnitElementMacroGenerationDataList(unitElement);
     _writeList(unitElement.classes, _writeClassElement);
     _writeList(unitElement.enums, _writeEnumElement);
     _writeList(unitElement.extensions, _writeExtensionElement);
@@ -470,18 +450,6 @@
     );
   }
 
-  void _writeUnitElementMacroGenerationDataList(
-    CompilationUnitElementImpl unitElement,
-  ) {
-    var dataList = unitElement.macroGenerationDataList ?? [];
-    _writeList<MacroGenerationData>(dataList, (data) {
-      _sink.writeUInt30(data.id);
-      _sink.writeStringUtf8(data.code);
-      _sink.writeUint8List(data.informative);
-      _sink.writeOptionalUInt30(data.classDeclarationIndex);
-    });
-  }
-
   static TypeParameterVarianceTag _encodeVariance(
       TypeParameterElementImpl element) {
     if (element.isLegacyCovariant) {
@@ -983,12 +951,6 @@
     }
   }
 
-  void _writeMacroExecutionError(macro.MacroExecutionError error) {
-    writeUInt30(error.annotationIndex);
-    _writeStringReference(error.macroName);
-    _writeStringReference(error.message);
-  }
-
   void _writeOptionalStringReference(String? value) {
     if (value != null) {
       writeBool(true);
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index d10835a..c375b8c 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -89,19 +89,6 @@
     }
   }
 
-  /// Build elements for [members] and add into the [element].
-  void buildMacroClassMembers(
-    ClassElementImpl element,
-    List<ClassMember> members,
-  ) {
-    var holder = _buildClassMembers(element, members);
-
-    element.accessors.addAll(holder.propertyAccessors);
-    element.constructors.addAll(holder.constructors);
-    element.fields.addAll(holder.properties.whereType<FieldElementImpl>());
-    element.methods.addAll(holder.methods);
-  }
-
   @override
   void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     var nameNode = node.name;
@@ -903,7 +890,7 @@
   }
 
   _EnclosingContext _buildClassMembers(
-      ElementImpl element, List<ClassMember> members) {
+      ElementImpl element, NodeList<ClassMember> members) {
     var hasConstConstructor = members.any((e) {
       return e is ConstructorDeclaration && e.constKeyword != null;
     });
@@ -919,9 +906,29 @@
     var element = node.declaredElement as ClassElementImpl;
     var holder = _buildClassMembers(element, node.members);
     element.accessors = holder.propertyAccessors;
-    element.constructors = holder.constructors;
     element.fields = holder.properties.whereType<FieldElement>().toList();
     element.methods = holder.methods;
+
+    var constructors = holder.constructors;
+    if (constructors.isEmpty) {
+      var containerRef = element.reference!.getChild('@constructor');
+      constructors = [
+        ConstructorElementImpl('', -1)
+          ..isSynthetic = true
+          ..reference = containerRef.getChild(''),
+      ];
+    }
+    element.constructors = constructors;
+
+    // We have all fields and constructors.
+    // Now we can resolve field formal parameters.
+    for (var constructor in constructors) {
+      for (var parameter in constructor.parameters) {
+        if (parameter is FieldFormalParameterElementImpl) {
+          parameter.field = element.getField(parameter.name);
+        }
+      }
+    }
   }
 
   void _buildExecutableElementChildren({
diff --git a/pkg/analyzer/lib/src/summary2/element_flags.dart b/pkg/analyzer/lib/src/summary2/element_flags.dart
index 529a06f..e808000 100644
--- a/pkg/analyzer/lib/src/summary2/element_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/element_flags.dart
@@ -8,8 +8,8 @@
 
 class ClassElementFlags {
   static const int _isAbstract = 1 << 0;
-  static const int _isMixinApplication = 1 << 2;
-  static const int _isSimplyBounded = 1 << 3;
+  static const int _isMixinApplication = 1 << 1;
+  static const int _isSimplyBounded = 1 << 2;
 
   static void read(SummaryDataReader reader, ClassElementImpl element) {
     var byte = reader.readByte();
@@ -60,8 +60,8 @@
   static const int _isCovariant = 1 << 5;
   static const int _isExternal = 1 << 6;
   static const int _isFinal = 1 << 7;
-  static const int _isLate = 1 << 9;
-  static const int _isStatic = 1 << 10;
+  static const int _isLate = 1 << 8;
+  static const int _isStatic = 1 << 9;
 
   static void read(SummaryDataReader reader, FieldElementImpl element) {
     var byte = reader.readUInt30();
@@ -161,8 +161,8 @@
   static const int _isAbstract = 1 << 1;
   static const int _isAsynchronous = 1 << 2;
   static const int _isExternal = 1 << 3;
-  static const int _isGenerator = 1 << 5;
-  static const int _isStatic = 1 << 6;
+  static const int _isGenerator = 1 << 4;
+  static const int _isStatic = 1 << 5;
 
   static void read(SummaryDataReader reader, MethodElementImpl element) {
     var byte = reader.readByte();
@@ -217,8 +217,8 @@
   static const int _isAbstract = 1 << 3;
   static const int _isAsynchronous = 1 << 4;
   static const int _isExternal = 1 << 5;
-  static const int _isGenerator = 1 << 7;
-  static const int _isStatic = 1 << 8;
+  static const int _isGenerator = 1 << 6;
+  static const int _isStatic = 1 << 7;
 
   static void read(
     SummaryDataReader reader,
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 3914a90..c592b1f 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -19,15 +19,6 @@
 import 'package:analyzer/src/util/comment.dart';
 import 'package:collection/collection.dart';
 
-/// Write the informative data (mostly offsets) of the given [node].
-/// Throw [UnimplementedError] if [node] is not supported.
-Uint8List writeDeclarationInformative(AstNode node) {
-  var byteSink = ByteSink();
-  var sink = BufferedSink(byteSink);
-  _InformativeDataWriter(sink).writeDeclaration(node);
-  return sink.flushAndTake();
-}
-
 Uint8List writeUnitInformative(CompilationUnit unit) {
   var byteSink = ByteSink();
   var sink = BufferedSink(byteSink);
@@ -41,15 +32,10 @@
 /// offsets are different from `nameOffset` for example, which are applied
 /// directly after creating corresponding elements during a library loading.
 class ApplyConstantOffsets {
-  final int _baseOffset;
   Uint32List? _offsets;
   void Function(_OffsetsApplier)? _function;
 
-  ApplyConstantOffsets(
-    this._offsets,
-    this._function, {
-    int baseOffset = 0,
-  }) : _baseOffset = baseOffset;
+  ApplyConstantOffsets(this._offsets, this._function);
 
   void perform() {
     var offsets = _offsets;
@@ -57,7 +43,6 @@
     if (offsets != null && function != null) {
       var applier = _OffsetsApplier(
         _SafeListIterator(offsets),
-        baseOffset: _baseOffset,
       );
       function.call(applier);
       // Clear the references to possible closure data.
@@ -70,17 +55,14 @@
 
 class InformativeDataApplier {
   final LinkedElementFactory _elementFactory;
-  final int _baseOffset;
+  final Map<Uri, Uint8List> _unitsInformativeBytes2;
 
   InformativeDataApplier(
-    this._elementFactory, {
-    int baseOffset = 0,
-  }) : _baseOffset = baseOffset;
+    this._elementFactory,
+    this._unitsInformativeBytes2,
+  );
 
-  void applyTo(
-    Map<Uri, InformativeUnitData> unitsInformativeData,
-    LibraryElementImpl libraryElement,
-  ) {
+  void applyTo(LibraryElementImpl libraryElement) {
     if (_elementFactory.isApplyingInformativeData) {
       throw StateError('Unexpected recursion.');
     }
@@ -90,9 +72,9 @@
     for (var i = 0; i < unitElements.length; i++) {
       var unitElement = unitElements[i] as CompilationUnitElementImpl;
       var unitUri = unitElement.source.uri;
-      var unitInfoData = unitsInformativeData[unitUri];
-      if (unitInfoData != null) {
-        var unitReader = SummaryDataReader(unitInfoData.bytes);
+      var unitInfoBytes = _unitsInformativeBytes2[unitUri];
+      if (unitInfoBytes != null) {
+        var unitReader = SummaryDataReader(unitInfoBytes);
         var unitInfo = _InfoUnit(unitReader);
 
         if (i == 0) {
@@ -101,7 +83,6 @@
 
         unitElement.setCodeRange(unitInfo.codeOffset, unitInfo.codeLength);
         unitElement.lineInfo = LineInfo(unitInfo.lineStarts);
-        _setUnitMacroGeneratedContent(unitElement, unitInfoData, unitInfo);
 
         _applyToAccessors(unitElement.accessors, unitInfo.accessors);
 
@@ -159,49 +140,35 @@
     _elementFactory.isApplyingInformativeData = false;
   }
 
-  /// Read informative data from [bytes], and apply it to [element].
-  /// The data and the [element] must correspond to each other.
-  void applyToDeclaration(Element element, Uint8List bytes) {
-    if (_elementFactory.isApplyingInformativeData) {
-      throw StateError('Unexpected recursion.');
-    }
-    _elementFactory.isApplyingInformativeData = true;
-
-    var reader = SummaryDataReader(bytes);
-
-    var kindIndex = reader.readByte();
-    var kind = _DeclarationKind.values[kindIndex];
-
-    if (kind == _DeclarationKind.constructorDeclaration &&
-        element is ConstructorElement) {
-      var info = _InfoConstructorDeclaration(reader);
-      _applyToConstructor(element, info);
-    } else if (kind == _DeclarationKind.methodDeclaration &&
-        element is MethodElement) {
-      var info = _InfoMethodDeclaration(reader);
-      _applyToMethod(element, info);
-    } else if (kind == _DeclarationKind.methodDeclaration &&
-        element is PropertyAccessorElement) {
-      var info = _InfoMethodDeclaration(reader);
-      _applyToPropertyAccessor(element, info);
-    } else {
-      throw UnimplementedError(
-        'Unsupported kind: $kind, '
-        'or element: ${element.runtimeType}',
-      );
-    }
-
-    _elementFactory.isApplyingInformativeData = false;
-  }
-
   void _applyToAccessors(
     List<PropertyAccessorElement> elementList,
     List<_InfoMethodDeclaration> infoList,
   ) {
-    forCorrespondingPairs(
+    forCorrespondingPairs<PropertyAccessorElement, _InfoMethodDeclaration>(
       elementList.notSynthetic,
       infoList,
-      _applyToPropertyAccessor,
+      (element, info) {
+        element as PropertyAccessorElementImpl;
+        element.setCodeRange(info.codeOffset, info.codeLength);
+        element.nameOffset = info.nameOffset;
+        element.documentationComment = info.documentationComment;
+        _applyToFormalParameters(
+          element.parameters_unresolved,
+          info.parameters,
+        );
+
+        var linkedData = element.linkedData;
+        if (linkedData is PropertyAccessorElementLinkedData) {
+          linkedData.applyConstantOffsets = ApplyConstantOffsets(
+            info.constantOffsets,
+            (applier) {
+              applier.applyToMetadata(element);
+              applier.applyToTypeParameters(element.typeParameters);
+              applier.applyToFormalParameters(element.parameters);
+            },
+          );
+        }
+      },
     );
   }
 
@@ -273,32 +240,6 @@
     );
   }
 
-  void _applyToConstructor(
-    ConstructorElement element,
-    _InfoConstructorDeclaration info,
-  ) {
-    element as ConstructorElementImpl;
-    element.setCodeRange(info.codeOffset, info.codeLength);
-    element.periodOffset = info.periodOffset;
-    element.nameOffset = _baseOffset + info.nameOffset;
-    element.nameEnd = info.nameEnd;
-    element.documentationComment = info.documentationComment;
-    _applyToFormalParameters(
-      element.parameters_unresolved,
-      info.parameters,
-    );
-
-    var linkedData = element.linkedData as ConstructorElementLinkedData;
-    linkedData.applyConstantOffsets = ApplyConstantOffsets(
-      info.constantOffsets,
-      (applier) {
-        applier.applyToMetadata(element);
-        applier.applyToFormalParameters(element.parameters);
-        applier.applyToConstructorInitializers(element);
-      },
-    );
-  }
-
   void _applyToConstructors(
     List<ConstructorElement> elementList,
     List<_InfoConstructorDeclaration> infoList,
@@ -306,7 +247,28 @@
     forCorrespondingPairs<ConstructorElement, _InfoConstructorDeclaration>(
       elementList,
       infoList,
-      _applyToConstructor,
+      (element, info) {
+        element as ConstructorElementImpl;
+        element.setCodeRange(info.codeOffset, info.codeLength);
+        element.periodOffset = info.periodOffset;
+        element.nameOffset = info.nameOffset;
+        element.nameEnd = info.nameEnd;
+        element.documentationComment = info.documentationComment;
+        _applyToFormalParameters(
+          element.parameters_unresolved,
+          info.parameters,
+        );
+
+        var linkedData = element.linkedData as ConstructorElementLinkedData;
+        linkedData.applyConstantOffsets = ApplyConstantOffsets(
+          info.constantOffsets,
+          (applier) {
+            applier.applyToMetadata(element);
+            applier.applyToFormalParameters(element.parameters);
+            applier.applyToConstructorInitializers(element);
+          },
+        );
+      },
     );
   }
 
@@ -401,7 +363,7 @@
       (element, info) {
         element as ParameterElementImpl;
         element.setCodeRange(info.codeOffset, info.codeLength);
-        element.nameOffset = _baseOffset + info.nameOffset;
+        element.nameOffset = info.nameOffset;
         _applyToTypeParameters(element.typeParameters, info.typeParameters);
         _applyToFormalParameters(element.parameters, info.parameters);
       },
@@ -537,32 +499,6 @@
     );
   }
 
-  void _applyToMethod(MethodElement element, _InfoMethodDeclaration info) {
-    element as MethodElementImpl;
-    element.setCodeRange(info.codeOffset, info.codeLength);
-    element.nameOffset = _baseOffset + info.nameOffset;
-    element.documentationComment = info.documentationComment;
-    _applyToTypeParameters(
-      element.typeParameters_unresolved,
-      info.typeParameters,
-    );
-    _applyToFormalParameters(
-      element.parameters_unresolved,
-      info.parameters,
-    );
-
-    var linkedData = element.linkedData as MethodElementLinkedData;
-    linkedData.applyConstantOffsets = ApplyConstantOffsets(
-      info.constantOffsets,
-      (applier) {
-        applier.applyToMetadata(element);
-        applier.applyToTypeParameters(element.typeParameters);
-        applier.applyToFormalParameters(element.parameters);
-      },
-      baseOffset: _baseOffset,
-    );
-  }
-
   void _applyToMethods(
     List<MethodElement> elementList,
     List<_InfoMethodDeclaration> infoList,
@@ -570,7 +506,30 @@
     forCorrespondingPairs<MethodElement, _InfoMethodDeclaration>(
       elementList,
       infoList,
-      _applyToMethod,
+      (element, info) {
+        element as MethodElementImpl;
+        element.setCodeRange(info.codeOffset, info.codeLength);
+        element.nameOffset = info.nameOffset;
+        element.documentationComment = info.documentationComment;
+        _applyToTypeParameters(
+          element.typeParameters_unresolved,
+          info.typeParameters,
+        );
+        _applyToFormalParameters(
+          element.parameters_unresolved,
+          info.parameters,
+        );
+
+        var linkedData = element.linkedData as MethodElementLinkedData;
+        linkedData.applyConstantOffsets = ApplyConstantOffsets(
+          info.constantOffsets,
+          (applier) {
+            applier.applyToMetadata(element);
+            applier.applyToTypeParameters(element.typeParameters);
+            applier.applyToFormalParameters(element.parameters);
+          },
+        );
+      },
     );
   }
 
@@ -601,33 +560,6 @@
     );
   }
 
-  void _applyToPropertyAccessor(
-    PropertyAccessorElement element,
-    _InfoMethodDeclaration info,
-  ) {
-    element as PropertyAccessorElementImpl;
-    element.setCodeRange(info.codeOffset, info.codeLength);
-    element.nameOffset = _baseOffset + info.nameOffset;
-    element.documentationComment = info.documentationComment;
-    _applyToFormalParameters(
-      element.parameters_unresolved,
-      info.parameters,
-    );
-
-    var linkedData = element.linkedData;
-    if (linkedData is PropertyAccessorElementLinkedData) {
-      linkedData.applyConstantOffsets = ApplyConstantOffsets(
-        info.constantOffsets,
-        (applier) {
-          applier.applyToMetadata(element);
-          applier.applyToTypeParameters(element.typeParameters);
-          applier.applyToFormalParameters(element.parameters);
-        },
-        baseOffset: _baseOffset,
-      );
-    }
-  }
-
   void _applyToTopLevelVariable(
     TopLevelVariableElement element,
     _InfoTopLevelVariable info,
@@ -662,38 +594,6 @@
     );
   }
 
-  void _setUnitMacroGeneratedContent(
-    CompilationUnitElementImpl unitElement,
-    InformativeUnitData unitInfoData,
-    _InfoUnit unitInfo,
-  ) {
-    var macroGenerationDataList = unitElement.macroGenerationDataList;
-    if (macroGenerationDataList != null) {
-      const classMemberCodePrefix = '\n  ';
-      const classMemberCodeSuffix = '\n';
-      var generatedContent = unitInfoData.content;
-      var shift = 0;
-      for (var data in macroGenerationDataList) {
-        var classIndex = data.classDeclarationIndex;
-        if (classIndex != null) {
-          var targetClass = unitInfo.classDeclarations[classIndex];
-          var code = classMemberCodePrefix + data.code + classMemberCodeSuffix;
-          var insertOffset = shift + targetClass.rightBracketOffset;
-          data.insertOffset = insertOffset;
-          data.codeOffset = insertOffset + classMemberCodePrefix.length;
-          generatedContent = generatedContent.substring(0, insertOffset) +
-              code +
-              generatedContent.substring(insertOffset);
-          data.insertLength = code.length;
-          shift += code.length;
-        } else {
-          throw UnimplementedError();
-        }
-      }
-      unitElement.macroGeneratedContent = generatedContent;
-    }
-  }
-
   void _setupApplyConstantOffsetsForTypeAlias(
     TypeAliasElementImpl element,
     Uint32List constantOffsets, {
@@ -729,30 +629,10 @@
   }
 }
 
-/// Informative data about a source file.
-class InformativeUnitData {
-  /// The content of the file.
-  final String content;
-
-  /// Informative data derived from the [content], such as offsets.
-  final Uint8List bytes;
-
-  InformativeUnitData({
-    required this.content,
-    required this.bytes,
-  });
-}
-
-enum _DeclarationKind {
-  constructorDeclaration,
-  methodDeclaration,
-}
-
 class _InfoClassDeclaration {
   final int codeOffset;
   final int codeLength;
   final int nameOffset;
-  final int rightBracketOffset;
   final String? documentationComment;
   final List<_InfoTypeParameter> typeParameters;
   final List<_InfoConstructorDeclaration> constructors;
@@ -767,7 +647,6 @@
       codeOffset: reader.readUInt30(),
       codeLength: reader.readUInt30(),
       nameOffset: reader.readUInt30() - nameOffsetDelta,
-      rightBracketOffset: reader.readUInt30(),
       documentationComment: reader.readStringUtf8().nullIfEmpty,
       typeParameters: reader.readTypedList(
         () => _InfoTypeParameter(reader),
@@ -792,7 +671,6 @@
     required this.codeOffset,
     required this.codeLength,
     required this.nameOffset,
-    required this.rightBracketOffset,
     required this.documentationComment,
     required this.typeParameters,
     required this.constructors,
@@ -1256,7 +1134,6 @@
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
       sink.writeUInt30(node.name.offset);
-      sink.writeUInt30(node.rightBracket.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1302,7 +1179,6 @@
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
       sink.writeUInt30(1 + (node.name?.offset ?? -1));
-      sink.writeUInt30(node.rightBracket.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1392,7 +1268,6 @@
       sink.writeUInt30(node.offset);
       sink.writeUInt30(node.length);
       sink.writeUInt30(node.name.offset);
-      sink.writeUInt30(node.rightBracket.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
       _writeConstructors(node.members);
@@ -1414,18 +1289,6 @@
     );
   }
 
-  void writeDeclaration(AstNode node) {
-    if (node is ConstructorDeclaration) {
-      sink.addByte(_DeclarationKind.constructorDeclaration.index);
-      _writeConstructor(node);
-    } else if (node is MethodDeclaration) {
-      sink.addByte(_DeclarationKind.methodDeclaration.index);
-      _writeMethod(node);
-    } else {
-      throw UnimplementedError('(${node.runtimeType}) $node');
-    }
-  }
-
   int _codeOffsetForVariable(VariableDeclaration node) {
     var codeOffset = node.offset;
     var variableList = node.parent as VariableDeclarationList;
@@ -1442,24 +1305,22 @@
     });
   }
 
-  void _writeConstructor(ConstructorDeclaration node) {
-    sink.writeUInt30(node.offset);
-    sink.writeUInt30(node.length);
-    sink.writeOptionalUInt30(node.period?.offset);
-    var nameNode = node.name ?? node.returnType;
-    sink.writeUInt30(nameNode.offset);
-    sink.writeUInt30(nameNode.end);
-    _writeDocumentationComment(node);
-    _writeFormalParameters(node.parameters);
-    _writeOffsets(
-      metadata: node.metadata,
-      formalParameters: node.parameters,
-      constructorInitializers: node.initializers,
-    );
-  }
-
   void _writeConstructors(List<ClassMember> members) {
-    sink.writeList2<ConstructorDeclaration>(members, _writeConstructor);
+    sink.writeList2<ConstructorDeclaration>(members, (node) {
+      sink.writeUInt30(node.offset);
+      sink.writeUInt30(node.length);
+      sink.writeOptionalUInt30(node.period?.offset);
+      var nameNode = node.name ?? node.returnType;
+      sink.writeUInt30(nameNode.offset);
+      sink.writeUInt30(nameNode.end);
+      _writeDocumentationComment(node);
+      _writeFormalParameters(node.parameters);
+      _writeOffsets(
+        metadata: node.metadata,
+        formalParameters: node.parameters,
+        constructorInitializers: node.initializers,
+      );
+    });
   }
 
   void _writeDocumentationComment(AnnotatedNode node) {
@@ -1522,7 +1383,19 @@
           .whereType<MethodDeclaration>()
           .where((e) => e.isGetter || e.isSetter)
           .toList(),
-      _writeMethod,
+      (node) {
+        sink.writeUInt30(node.offset);
+        sink.writeUInt30(node.length);
+        sink.writeUInt30(node.name.offset);
+        _writeDocumentationComment(node);
+        _writeTypeParameters(node.typeParameters);
+        _writeFormalParameters(node.parameters);
+        _writeOffsets(
+          metadata: node.metadata,
+          typeParameters: node.typeParameters,
+          formalParameters: node.parameters,
+        );
+      },
     );
   }
 
@@ -1547,27 +1420,25 @@
     );
   }
 
-  void _writeMethod(MethodDeclaration node) {
-    sink.writeUInt30(node.offset);
-    sink.writeUInt30(node.length);
-    sink.writeUInt30(node.name.offset);
-    _writeDocumentationComment(node);
-    _writeTypeParameters(node.typeParameters);
-    _writeFormalParameters(node.parameters);
-    _writeOffsets(
-      metadata: node.metadata,
-      typeParameters: node.typeParameters,
-      formalParameters: node.parameters,
-    );
-  }
-
   void _writeMethods(List<ClassMember> members) {
     sink.writeList<MethodDeclaration>(
       members
           .whereType<MethodDeclaration>()
           .where((e) => !(e.isGetter || e.isSetter))
           .toList(),
-      _writeMethod,
+      (node) {
+        sink.writeUInt30(node.offset);
+        sink.writeUInt30(node.length);
+        sink.writeUInt30(node.name.offset);
+        _writeDocumentationComment(node);
+        _writeTypeParameters(node.typeParameters);
+        _writeFormalParameters(node.parameters);
+        _writeOffsets(
+          metadata: node.metadata,
+          typeParameters: node.typeParameters,
+          formalParameters: node.parameters,
+        );
+      },
     );
   }
 
@@ -1803,12 +1674,8 @@
 
 class _OffsetsApplier extends _OffsetsAstVisitor {
   final _SafeListIterator<int> _iterator;
-  final int _baseOffset;
 
-  _OffsetsApplier(
-    this._iterator, {
-    int baseOffset = 0,
-  }) : _baseOffset = baseOffset;
+  _OffsetsApplier(this._iterator);
 
   void applyToConstantInitializer(Element element) {
     if (element is ConstVariableElement) {
@@ -1862,7 +1729,7 @@
   void handleToken(Token token) {
     var offset = _iterator.take();
     if (offset != null) {
-      token.offset = _baseOffset + offset;
+      token.offset = offset;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index fc66eed..f389647 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -5,15 +5,9 @@
 import 'package:analyzer/dart/ast/ast.dart' as ast;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart' as ast;
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:analyzer/src/macro/api/macro.dart' as macro;
-import 'package:analyzer/src/macro/builders/data_class.dart' as macro;
-import 'package:analyzer/src/macro/builders/observable.dart' as macro;
-import 'package:analyzer/src/macro/impl/error.dart' as macro;
-import 'package:analyzer/src/macro/impl/macro.dart' as macro;
 import 'package:analyzer/src/summary2/combinator.dart';
 import 'package:analyzer/src/summary2/constructor_initializer_resolver.dart';
 import 'package:analyzer/src/summary2/default_value_resolver.dart';
@@ -147,38 +141,6 @@
     }
   }
 
-  /// We don't create default constructors during building elements from AST,
-  /// there might be macros that will add one later. So, this method is
-  /// invoked after all macros that affect element models.
-  void processClassConstructors() {
-    // TODO(scheglov) We probably don't need constructors for mixins.
-    var classes = element.topLevelElements
-        .whereType<ClassElementImpl>()
-        .where((e) => !e.isMixinApplication)
-        .toList();
-
-    for (var element in classes) {
-      if (element.constructors.isEmpty) {
-        var containerRef = element.reference!.getChild('@constructor');
-        element.constructors = [
-          ConstructorElementImpl('', -1)
-            ..isSynthetic = true
-            ..reference = containerRef.getChild(''),
-        ];
-      }
-
-      // We have all fields and constructors.
-      // Now we can resolve field formal parameters.
-      for (var constructor in element.constructors) {
-        for (var parameter in constructor.parameters) {
-          if (parameter is FieldFormalParameterElementImpl) {
-            parameter.field = element.getField(parameter.name);
-          }
-        }
-      }
-    }
-  }
-
   void resolveConstructors() {
     ConstructorInitializerResolver(linker, element).resolve();
   }
@@ -201,139 +163,6 @@
     }
   }
 
-  /// Run built-in declaration macros.
-  void runDeclarationMacros() {
-    /// If [node] has a macro annotation with the required [name],
-    /// return the index of this annotation node.
-    int? hasMacroAnnotation(ast.AnnotatedNode node, String name) {
-      var metadata = node.metadata;
-      for (var i = 0; i < metadata.length; i++) {
-        var annotation = metadata[i];
-        var nameNode = annotation.name;
-        if (nameNode is ast.SimpleIdentifier &&
-            annotation.arguments == null &&
-            annotation.constructorName == null &&
-            nameNode.name == name) {
-          var nameElement = element.scope.lookup(name).getter;
-          if (nameElement != null &&
-              nameElement.library?.name == 'analyzer.macro.annotations') {
-            return i;
-          }
-        }
-      }
-      return null;
-    }
-
-    /// Build types for type annotations in new [nodes].
-    void resolveTypeAnnotations(
-      List<ast.AstNode> nodes, {
-      ClassElementImpl? classElement,
-    }) {
-      var nodesToBuildType = NodesToBuildType();
-      var resolver = ReferenceResolver(linker, nodesToBuildType, element);
-      if (classElement != null) {
-        resolver.enterScopeClassElement(classElement);
-      }
-      for (var node in nodes) {
-        node.accept(resolver);
-      }
-      TypesBuilder(linker).build(nodesToBuildType);
-    }
-
-    for (var linkingUnit in units) {
-      var classDeclarationIndex = -1;
-      for (var declaration in linkingUnit.node.declarations) {
-        if (declaration is ast.ClassDeclarationImpl) {
-          classDeclarationIndex++;
-          var macroExecutionErrors = <macro.MacroExecutionError>[];
-
-          var members = declaration.members.toList();
-          var classBuilder = macro.ClassDeclarationBuilderImpl(
-            linkingUnit,
-            classDeclarationIndex,
-            declaration,
-          );
-
-          void runClassMacro(
-            String name,
-            macro.ClassDeclarationMacro Function() newInstance,
-          ) {
-            var annotationIndex = hasMacroAnnotation(declaration, name);
-            if (annotationIndex != null) {
-              try {
-                newInstance().visitClassDeclaration(
-                  declaration,
-                  classBuilder,
-                );
-              } catch (e) {
-                macroExecutionErrors.add(
-                  macro.MacroExecutionError(
-                    annotationIndex: annotationIndex,
-                    macroName: name,
-                    message: e.toString(),
-                  ),
-                );
-              }
-            }
-          }
-
-          runClassMacro('autoConstructor', () => macro.AutoConstructorMacro());
-          runClassMacro('dataClass', () => macro.DataClassMacro());
-          runClassMacro('hashCode', () => macro.HashCodeMacro());
-          runClassMacro('toString', () => macro.ToStringMacro());
-
-          var classElement = declaration.declaredElement as ClassElementImpl;
-          classElement.macroExecutionErrors = macroExecutionErrors;
-
-          for (var member in members) {
-            if (member is ast.FieldDeclarationImpl) {
-              var macroExecutionErrors = <macro.MacroExecutionError>[];
-
-              void runFieldMacro(
-                String name,
-                macro.FieldDeclarationMacro Function() newInstance,
-              ) {
-                var annotationIndex = hasMacroAnnotation(member, name);
-                if (annotationIndex != null) {
-                  try {
-                    newInstance().visitFieldDeclaration(member, classBuilder);
-                  } catch (e) {
-                    macroExecutionErrors.add(
-                      macro.MacroExecutionError(
-                        annotationIndex: annotationIndex,
-                        macroName: name,
-                        message: e.toString(),
-                      ),
-                    );
-                  }
-                }
-              }
-
-              runFieldMacro('observable', () => macro.ObservableMacro());
-              member.firstElement.macroExecutionErrors = macroExecutionErrors;
-            }
-          }
-
-          var newMembers = declaration.members.sublist(members.length);
-          if (newMembers.isNotEmpty) {
-            var elementBuilder = ElementBuilder(
-              libraryBuilder: this,
-              unitReference: linkingUnit.reference,
-              unitElement: linkingUnit.element,
-            );
-            var classElement = declaration.declaredElement as ClassElementImpl;
-            elementBuilder.buildMacroClassMembers(classElement, newMembers);
-            resolveTypeAnnotations(newMembers, classElement: classElement);
-          }
-        }
-      }
-    }
-
-    for (var linkingUnit in units) {
-      linkingUnit.macroGeneratedContent.finish();
-    }
-  }
-
   void storeExportScope() {
     exports = exportScope.map.values.toList();
     linker.elementFactory.setExportsOfLibrary('$uri', exports);
@@ -460,8 +289,6 @@
   final Reference reference;
   final ast.CompilationUnitImpl node;
   final CompilationUnitElementImpl element;
-  late final macro.MacroGeneratedContent macroGeneratedContent =
-      macro.MacroGeneratedContent(this);
 
   LinkingUnit({
     required this.input,
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 18118c5..db4d362 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -92,7 +92,6 @@
     _createTypeSystem();
     _buildEnumChildren();
     _resolveTypes();
-    _runDeclarationMacros();
     _performTopLevelInference();
     _resolveConstructors();
     _resolveConstantInitializers();
@@ -213,13 +212,6 @@
     TypesBuilder(this).build(nodesToBuildType);
   }
 
-  void _runDeclarationMacros() {
-    for (var library in builders.values) {
-      library.runDeclarationMacros();
-      library.processClassConstructors();
-    }
-  }
-
   void _writeLibraries() {
     var bundleWriter = BundleWriter(
       elementFactory.dynamicRef,
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 2475bbb..ef6c180 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -45,10 +45,6 @@
         scope = libraryElement.scope,
         isNNBD = libraryElement.isNonNullableByDefault;
 
-  void enterScopeClassElement(ClassElementImpl element) {
-    scope = TypeParameterScope(scope, element.typeParameters);
-  }
-
   @override
   void visitBlockFunctionBody(BlockFunctionBody node) {}
 
diff --git a/pkg/analyzer/test/src/dart/resolution/macro_test.dart b/pkg/analyzer/test/src/dart/resolution/macro_test.dart
deleted file mode 100644
index 6d88fd7..0000000
--- a/pkg/analyzer/test/src/dart/resolution/macro_test.dart
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'package:analyzer/dart/analysis/utilities.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'context_collection_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(MacroResolutionTest);
-  });
-}
-
-@reflectiveTest
-class MacroResolutionTest extends PubPackageResolutionTest {
-  @override
-  void setUp() {
-    super.setUp();
-
-    newFile('$testPackageLibPath/macro_annotations.dart', content: r'''
-library analyzer.macro.annotations;
-const autoConstructor = 0;
-const observable = 0;
-''');
-  }
-
-  test_autoConstructor() async {
-    var code = r'''
-import 'macro_annotations.dart';
-
-@autoConstructor
-class A {
-  final int a;
-}
-
-void f() {
-  A(a: 0);
-}
-''';
-
-    // No diagnostics, specifically:
-    // 1. The constructor `A()` is declared.
-    // 2. The final field `a` is not marked, because the macro-generated
-    //    constructor does initialize it.
-    await assertNoErrorsInCode(code);
-
-    _assertResolvedUnitWithParsed(code);
-  }
-
-  test_errors_parse_shiftToWritten() async {
-    await assertErrorsInCode(r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-}
-
-int a = 0
-''', [
-      error(ParserErrorCode.EXPECTED_TOKEN, 85, 1),
-    ]);
-  }
-
-  test_errors_resolution_removeInGenerated() async {
-    // The generated `set foo(int x) { _foo = x; }` has an error, it attempts
-    // to assign to a final field `_foo`. But this error does not exist in
-    // the written code, so it is not present.
-    await assertNoErrorsInCode(r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  final int _foo = 0;
-}
-''');
-  }
-
-  test_errors_resolution_shiftToWritten() async {
-    await assertErrorsInCode(r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-}
-
-notInt a = 0;
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 77, 6),
-    ]);
-  }
-
-  test_executionError_autoConstructor() async {
-    await assertErrorsInCode(r'''
-import 'macro_annotations.dart';
-
-@autoConstructor
-class A {
-  final int a;
-  A(this.a);
-}
-''', [
-      error(CompileTimeErrorCode.MACRO_EXECUTION_ERROR, 34, 16),
-    ]);
-  }
-
-  test_executionError_observable_implicitlyTyped() async {
-    await assertErrorsInCode(r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  var _a = 0;
-}
-''', [
-      error(CompileTimeErrorCode.MACRO_EXECUTION_ERROR, 46, 11),
-      error(HintCode.UNUSED_FIELD, 64, 2),
-    ]);
-  }
-
-  test_observable() async {
-    var code = r'''
-import 'macro_annotations.dart';
-
-class A {
-  @observable
-  int _foo = 0;
-}
-
-void f(A a) {
-  a.foo;
-  a.foo = 2;
-}
-''';
-
-    // No diagnostics, such as unused `_foo`.
-    // We generate a getter/setter pair, so it is used.
-    await assertNoErrorsInCode(code);
-
-    _assertResolvedUnitWithParsed(code);
-  }
-
-  void _assertResolvedUnitWithParsed(String code) {
-    // The resolved content is the original code.
-    expect(result.content, code);
-
-    var resolvedUnit = result.unit;
-    var parsedUnit = parseString(content: code).unit;
-
-    // The token stream was patched to keep only tokens that existed in the
-    // original code.
-    _assertEqualTokens(resolvedUnit, parsedUnit);
-
-    // The AST was patched to keep only nodes that existed in the
-    // original code.
-    var resolvedTokenString = _nodeTokenString(resolvedUnit);
-    var parsedTokenString = _nodeTokenString(parsedUnit);
-    expect(resolvedTokenString, parsedTokenString);
-  }
-
-  static void _assertEqualTokens(AstNode first, AstNode second) {
-    var firstToken = first.beginToken;
-    var secondToken = second.beginToken;
-    while (true) {
-      if (firstToken == first.endToken && secondToken == second.endToken) {
-        break;
-      }
-      expect(firstToken.lexeme, secondToken.lexeme);
-      expect(firstToken.offset, secondToken.offset);
-      firstToken = firstToken.next!;
-      secondToken = secondToken.next!;
-    }
-  }
-
-  /// Return the string dump of all tokens in [node] and its children.
-  static String _nodeTokenString(AstNode node) {
-    var tokens = <Token>[];
-    node.accept(
-      _RecursiveTokenCollector(tokens),
-    );
-
-    // `AstNode.childEntities` does not return tokens in any specific order.
-    // So, we sort them to make the sequence look reasonable.
-    tokens.sort((a, b) => a.offset - b.offset);
-
-    var buffer = StringBuffer();
-    for (var token in tokens) {
-      buffer.writeln('${token.lexeme} @${token.offset}');
-    }
-    return buffer.toString();
-  }
-}
-
-class _RecursiveTokenCollector extends GeneralizingAstVisitor<void> {
-  final List<Token> _tokens;
-
-  _RecursiveTokenCollector(this._tokens);
-
-  @override
-  void visitNode(AstNode node) {
-    _tokens.addAll(
-      node.childEntities.whereType<Token>(),
-    );
-    super.visitNode(node);
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 70b37ab..0c72655 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -44,7 +44,6 @@
 import 'library_element_test.dart' as library_element;
 import 'local_function_test.dart' as local_function;
 import 'local_variable_test.dart' as local_variable;
-import 'macro_test.dart' as macro;
 import 'metadata_test.dart' as metadata;
 import 'method_declaration_test.dart' as method_declaration;
 import 'method_invocation_test.dart' as method_invocation;
@@ -106,7 +105,6 @@
     library_element.main();
     local_function.main();
     local_variable.main();
-    macro.main();
     metadata.main();
     method_declaration.main();
     method_invocation.main();
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 1c07a3e..fb0093f 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -395,14 +395,17 @@
       expect(e.nameOffset, -1);
       expect(e.nonSynthetic, same(e.enclosingElement));
     } else {
-      expect(e.nameOffset, isNonNegative);
+      expect(e.nameOffset, isPositive);
     }
   }
 
   void _writeDocumentation(Element element) {
     var documentation = element.documentationComment;
     if (documentation != null) {
-      _writelnMultiLineWithIndent('documentationComment: $documentation');
+      var str = documentation;
+      str = str.replaceAll('\n', r'\n');
+      str = str.replaceAll('\r', r'\r');
+      _writelnWithIndent('documentationComment: $str');
     }
   }
 
@@ -518,12 +521,6 @@
     buffer.writeln();
   }
 
-  void _writelnMultiLineWithIndent(String str) {
-    str = str.replaceAll('\n', r'\n');
-    str = str.replaceAll('\r', r'\r');
-    _writelnWithIndent(str);
-  }
-
   void _writelnWithIndent(String line) {
     buffer.write(indent);
     buffer.writeln(line);
@@ -648,8 +645,6 @@
   }
 
   void _writePropertyAccessorElement(PropertyAccessorElement e) {
-    e as PropertyAccessorElementImpl;
-
     PropertyInducingElement variable = e.variable;
     expect(variable, isNotNull);
 
@@ -858,7 +853,6 @@
   }
 
   void _writeUnitElement(CompilationUnitElement e) {
-    e as CompilationUnitElementImpl;
     _writeElements('classes', e.classes, _writeClassElement);
     _writeElements('enums', e.enums, _writeClassElement);
     _writeElements('extensions', e.extensions, _writeExtensionElement);
@@ -875,12 +869,6 @@
       _writePropertyAccessorElement,
     );
     _writeElements('functions', e.functions, _writeFunctionElement);
-
-    var macroGeneratedContent = e.macroGeneratedContent;
-    if (macroGeneratedContent != null) {
-      _writelnWithIndent('macroGeneratedContent');
-      buffer.write(macroGeneratedContent);
-    }
   }
 
   void _writeUri(Source? source) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index d85eb96..bc041e1 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -59,9 +59,11 @@
     var inputLibraries = <LinkInputLibrary>[];
     for (var sdkLibrary in sdk.sdkLibraries) {
       var source = sourceFactory.resolveUri(null, sdkLibrary.shortName)!;
+      var text = getFile(source.fullName).readAsStringSync();
+      var unit = parseText(text, featureSet);
 
       var inputUnits = <LinkInputUnit>[];
-      _addLibraryUnits(source, inputUnits, featureSet);
+      _addLibraryUnits(source, unit, inputUnits, featureSet);
       inputLibraries.add(
         LinkInputLibrary(
           source: source,
@@ -97,17 +99,11 @@
     var inputLibraries = <LinkInputLibrary>[];
     _addNonDartLibraries({}, inputLibraries, source);
 
-    var unitsInformativeData = <Uri, InformativeUnitData>{};
+    var unitsInformativeBytes = <Uri, Uint8List>{};
     for (var inputLibrary in inputLibraries) {
       for (var inputUnit in inputLibrary.units) {
-        var content = inputUnit.sourceContent;
-        if (content != null) {
-          var informativeBytes = writeUnitInformative(inputUnit.unit);
-          unitsInformativeData[inputUnit.uri] = InformativeUnitData(
-            content: content,
-            bytes: informativeBytes,
-          );
-        }
+        var informativeBytes = writeUnitInformative(inputUnit.unit);
+        unitsInformativeBytes[inputUnit.uri] = informativeBytes;
       }
     }
 
@@ -127,7 +123,7 @@
     elementFactory.addBundle(
       BundleReader(
         elementFactory: elementFactory,
-        unitsInformativeData: {},
+        unitsInformativeBytes: {},
         resolutionBytes: sdkBundle.resolutionBytes,
       ),
     );
@@ -141,7 +137,7 @@
       elementFactory.addBundle(
         BundleReader(
           elementFactory: elementFactory,
-          unitsInformativeData: unitsInformativeData,
+          unitsInformativeBytes: unitsInformativeBytes,
           resolutionBytes: linkResult.resolutionBytes,
         ),
       );
@@ -156,16 +152,14 @@
 
   void _addLibraryUnits(
     Source definingSource,
+    CompilationUnit definingUnit,
     List<LinkInputUnit> units,
     FeatureSet featureSet,
   ) {
-    var definingContent = _readSafely(definingSource.fullName);
-    var definingUnit = parseText(definingContent, featureSet);
     units.add(
       LinkInputUnit(
         partDirectiveIndex: null,
         source: definingSource,
-        sourceContent: definingContent,
         isSynthetic: false,
         unit: definingUnit,
       ),
@@ -190,7 +184,6 @@
               partDirectiveIndex: partDirectiveIndex,
               partUriStr: relativeUriStr,
               source: partSource,
-              sourceContent: text,
               isSynthetic: false,
               unit: unit,
             ),
@@ -215,7 +208,7 @@
     var unit = parseText(text, featureSet);
 
     var units = <LinkInputUnit>[];
-    _addLibraryUnits(source, units, featureSet);
+    _addLibraryUnits(source, unit, units, featureSet);
     libraries.add(
       LinkInputLibrary(
         source: source,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 487ad9e..6040c16 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -21543,478 +21543,6 @@
 ''');
   }
 
-  test_macro_autoConstructor() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library analyzer.macro.annotations;
-const autoConstructor = 0;
-''');
-    var library = await checkLibrary(r'''
-import 'macro_annotations.dart';
-@autoConstructor
-class A {
-  final int a;
-  final int? b;
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @56
-        metadata
-          Annotation
-            atSign: @ @33
-            element: macro_annotations.dart::@getter::autoConstructor
-            name: SimpleIdentifier
-              staticElement: macro_annotations.dart::@getter::autoConstructor
-              staticType: null
-              token: autoConstructor @34
-        fields
-          final a @72
-            type: int
-          final b @88
-            type: int?
-        constructors
-          @94
-            parameters
-              requiredName final this.a @111
-                type: int
-              optionalNamed final this.b @119
-                type: int?
-        accessors
-          synthetic get a @-1
-            returnType: int
-          synthetic get b @-1
-            returnType: int?
-    macroGeneratedContent
-import 'macro_annotations.dart';
-@autoConstructor
-class A {
-  final int a;
-  final int? 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)';
-}
-''');
-  }
-
-  test_macro_hashCode() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @49
-        metadata
-          Annotation
-            atSign: @ @33
-            element: macro_annotations.dart::@getter::hashCode
-            name: SimpleIdentifier
-              staticElement: macro_annotations.dart::@getter::hashCode
-              staticType: null
-              token: hashCode @34
-        fields
-          final a @65
-            type: int
-          final b @80
-            type: int
-          synthetic hashCode @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get a @-1
-            returnType: int
-          synthetic get b @-1
-            returnType: int
-          get hashCode @106
-            metadata
-              Annotation
-                atSign: @ @0
-                element: dart:core::@getter::override
-                name: SimpleIdentifier
-                  staticElement: dart:core::@getter::override
-                  staticType: null
-                  token: override @1
-            returnType: int
-    macroGeneratedContent
-import 'macro_annotations.dart';
-@hashCode
-class A {
-  final int a;
-  final int b;
-
-  @override
-  int get hashCode => a.hashCode ^ b.hashCode;
-}
-''');
-  }
-
-  test_macro_hashCode_withSuper() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library analyzer.macro.annotations;
-const hashCode = 0;
-''');
-    var library = await checkLibrary(r'''
-import 'macro_annotations.dart';
-
-class A {
-  final int a;
-}
-
-@hashCode
-class B extends A {
-  final int b;
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @40
-        fields
-          final a @56
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get a @-1
-            returnType: int
-      class B @78
-        metadata
-          Annotation
-            atSign: @ @62
-            element: macro_annotations.dart::@getter::hashCode
-            name: SimpleIdentifier
-              staticElement: macro_annotations.dart::@getter::hashCode
-              staticType: null
-              token: hashCode @63
-        supertype: A
-        fields
-          final b @104
-            type: int
-          synthetic hashCode @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get b @-1
-            returnType: int
-          get hashCode @130
-            metadata
-              Annotation
-                atSign: @ @110
-                element: dart:core::@getter::override
-                name: SimpleIdentifier
-                  staticElement: dart:core::@getter::override
-                  staticType: null
-                  token: override @111
-            returnType: int
-    macroGeneratedContent
-import 'macro_annotations.dart';
-
-class A {
-  final int a;
-}
-
-@hashCode
-class B extends A {
-  final int b;
-
-  @override
-  int get hashCode => b.hashCode ^ a.hashCode;
-}
-''');
-  }
-
-  test_macro_observable() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library analyzer.macro.annotations;
-const observable = 0;
-''');
-    var library = await checkLibrary(r'''
-import 'macro_annotations.dart';
-class A {
-  @observable
-  int _f = 0;
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @39
-        fields
-          _f @63
-            metadata
-              Annotation
-                atSign: @ @45
-                element: macro_annotations.dart::@getter::observable
-                name: SimpleIdentifier
-                  staticElement: macro_annotations.dart::@getter::observable
-                  staticType: null
-                  token: observable @46
-            type: int
-          synthetic f @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get _f @-1
-            returnType: int
-          synthetic set _f @-1
-            parameters
-              requiredPositional __f @-1
-                type: int
-            returnType: void
-          get f @82
-            returnType: int
-          set f @98
-            parameters
-              requiredPositional val @104
-                type: int
-            returnType: void
-    macroGeneratedContent
-import 'macro_annotations.dart';
-class A {
-  @observable
-  int _f = 0;
-
-  int get f => _f;
-
-  set f(int val) {
-    print('Setting f to ${val}');
-    _f = val;
-  }
-}
-''');
-  }
-
-  test_macro_observable_generic() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library analyzer.macro.annotations;
-const observable = 0;
-''');
-    var library = await checkLibrary(r'''
-import 'macro_annotations.dart';
-class A<T> {
-  @observable
-  T _f;
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @39
-        typeParameters
-          covariant T @41
-            defaultType: dynamic
-        fields
-          _f @64
-            metadata
-              Annotation
-                atSign: @ @48
-                element: macro_annotations.dart::@getter::observable
-                name: SimpleIdentifier
-                  staticElement: macro_annotations.dart::@getter::observable
-                  staticType: null
-                  token: observable @49
-            type: T
-          synthetic f @-1
-            type: T
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get _f @-1
-            returnType: T
-          synthetic set _f @-1
-            parameters
-              requiredPositional __f @-1
-                type: T
-            returnType: void
-          get f @77
-            returnType: T
-          set f @93
-            parameters
-              requiredPositional val @97
-                type: T
-            returnType: void
-    macroGeneratedContent
-import 'macro_annotations.dart';
-class A<T> {
-  @observable
-  T _f;
-
-  T get f => _f;
-
-  set f(T val) {
-    print('Setting f to ${val}');
-    _f = val;
-  }
-}
-''');
-  }
-
-  test_macro_toString() async {
-    addLibrarySource('/macro_annotations.dart', r'''
-library analyzer.macro.annotations;
-const toString = 0;
-''');
-    var library = await checkLibrary(r'''
-import 'macro_annotations.dart';
-@toString
-class A {
-  final int a;
-  final int b;
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    macro_annotations.dart
-  definingUnit
-    classes
-      class A @49
-        metadata
-          Annotation
-            atSign: @ @33
-            element: macro_annotations.dart::@getter::toString
-            name: SimpleIdentifier
-              staticElement: macro_annotations.dart::@getter::toString
-              staticType: null
-              token: toString @34
-        fields
-          final a @65
-            type: int
-          final b @80
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get a @-1
-            returnType: int
-          synthetic get b @-1
-            returnType: int
-        methods
-          toString @105
-            metadata
-              Annotation
-                atSign: @ @86
-                element: dart:core::@getter::override
-                name: SimpleIdentifier
-                  staticElement: dart:core::@getter::override
-                  staticType: null
-                  token: override @87
-            returnType: String
-    macroGeneratedContent
-import 'macro_annotations.dart';
-@toString
-class A {
-  final int a;
-  final int b;
-
-  @override
-  String toString() => 'A(a: $a, b: $b)';
-}
-''');
-  }
-
   test_main_class() async {
     var library = await checkLibrary('class main {}');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/tool/macro/generate.dart b/pkg/analyzer/tool/macro/generate.dart
deleted file mode 100644
index 2cc9a41..0000000
--- a/pkg/analyzer/tool/macro/generate.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2021, 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.
-
-import 'dart:io' as io;
-
-import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/util/file_paths.dart' as file_paths;
-
-void main(List<String> arguments) async {
-  if (arguments.length != 1) {
-    _printUsage();
-    io.exit(1);
-  }
-
-  var resourceProvider = PhysicalResourceProvider.INSTANCE;
-  var pathContext = resourceProvider.pathContext;
-
-  // The directory must exist.
-  var packagePath = arguments[0];
-  var packageFolder = resourceProvider.getFolder(packagePath);
-  if (!packageFolder.exists) {
-    print('Error: $packagePath does not exist.');
-    io.exit(1);
-  }
-
-  // The directory must be a Pub package.
-  var pubspecYamlFile = packageFolder.getChildAssumingFile(
-    file_paths.pubspecYaml,
-  );
-  if (!pubspecYamlFile.exists) {
-    print('Error: ${pubspecYamlFile.path} does not exist.');
-    io.exit(1);
-  }
-
-  var collection = AnalysisContextCollection(
-    includedPaths: [packagePath],
-  );
-  for (var analysisContext in collection.contexts) {
-    var analyzedPaths = analysisContext.contextRoot.analyzedFiles();
-    for (var path in analyzedPaths) {
-      if (file_paths.isDart(pathContext, path)) {
-        var session = analysisContext.currentSession;
-        var unitElementResult = await session.getUnitElement(path);
-        if (unitElementResult is UnitElementResult) {
-          var unitElement =
-              unitElementResult.element as CompilationUnitElementImpl;
-          // If has macro-generated content, write it.
-          var macroGeneratedContent = unitElement.macroGeneratedContent;
-          if (macroGeneratedContent != null) {
-            var relativePath = pathContext.relative(path, from: packagePath);
-            var combinedPath = pathContext.join(
-                packagePath, '.dart_tool', 'analyzer', 'macro', relativePath);
-            resourceProvider.getFile(combinedPath)
-              ..parent2.create()
-              ..writeAsStringSync(macroGeneratedContent);
-          }
-        }
-      }
-    }
-  }
-}
-
-void _printUsage() {
-  print('''
-Usage: dart generate.dart path-to-pub-package
-Write combined code of files that have macro-generated declarations.
-''');
-}
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 10640fc..575cd5b 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -17,13 +17,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class AnalyzerConverter {
-  /// Optional provider for [analyzer.Element] location, used for example to
-  /// override the location of macro-generated elements.
-  final ElementLocationProvider? _locationProvider;
-
-  AnalyzerConverter({ElementLocationProvider? locationProvider})
-      : _locationProvider = locationProvider;
-
   /// Convert the analysis [error] from the 'analyzer' package to an analysis
   /// error defined by the plugin API. If a [lineInfo] is provided then the
   /// error's location will have a start line and start column. If a [severity]
@@ -206,12 +199,6 @@
     if (element == null || element.source == null) {
       return null;
     }
-
-    var result = _locationProvider?.forElement(element);
-    if (result != null) {
-      return result;
-    }
-
     offset ??= element.nameOffset;
     length ??= element.nameLength;
     if (element is analyzer.CompilationUnitElement ||
@@ -425,9 +412,3 @@
         endLine: endLine, endColumn: endColumn);
   }
 }
-
-abstract class ElementLocationProvider {
-  /// Return the location of [element] that this provider wants to override,
-  /// or `null` if the default location should be used.
-  plugin.Location? forElement(analyzer.Element element);
-}
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 532762c..8d5106f 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -16,15 +16,12 @@
 import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
 
 NavigationCollector computeDartNavigation(
-  ResourceProvider resourceProvider,
-  NavigationCollector collector,
-  CompilationUnit unit,
-  int? offset,
-  int? length, {
-  AnalyzerConverter? analyzerConverter,
-}) {
-  var dartCollector = _DartNavigationCollector(
-      collector, offset, length, analyzerConverter ?? AnalyzerConverter());
+    ResourceProvider resourceProvider,
+    NavigationCollector collector,
+    CompilationUnit unit,
+    int? offset,
+    int? length) {
+  var dartCollector = _DartNavigationCollector(collector, offset, length);
   var visitor = _DartNavigationComputerVisitor(resourceProvider, dartCollector);
   if (offset == null || length == null) {
     unit.accept(visitor);
@@ -69,14 +66,9 @@
   final NavigationCollector collector;
   final int? requestedOffset;
   final int? requestedLength;
-  final AnalyzerConverter _analyzerConverter;
 
   _DartNavigationCollector(
-    this.collector,
-    this.requestedOffset,
-    this.requestedLength,
-    this._analyzerConverter,
-  );
+      this.collector, this.requestedOffset, this.requestedLength);
 
   void _addRegion(int offset, int length, Element? element) {
     element = element?.nonSynthetic;
@@ -93,14 +85,15 @@
     if (!_isWithinRequestedRange(offset, length)) {
       return;
     }
-    var kind = _analyzerConverter.convertElementKind(element.kind);
-    var location = _analyzerConverter.locationFromElement(element);
+    var converter = AnalyzerConverter();
+    var kind = converter.convertElementKind(element.kind);
+    var location = converter.locationFromElement(element);
     if (location == null) {
       return;
     }
 
     var codeLocation = collector.collectCodeLocations
-        ? _getCodeLocation(element, location)
+        ? _getCodeLocation(element, location, converter)
         : null;
 
     collector.addRegion(offset, length, kind, location,
@@ -129,8 +122,8 @@
   }
 
   /// Get the location of the code (excluding leading doc comments) for this element.
-  protocol.Location? _getCodeLocation(
-      Element element, protocol.Location location) {
+  protocol.Location? _getCodeLocation(Element element,
+      protocol.Location location, AnalyzerConverter converter) {
     var codeElement = element;
     // For synthetic getters created for fields, we need to access the associated
     // variable to get the codeOffset/codeLength.
@@ -169,7 +162,7 @@
       codeOffset = offsetAfterDocs;
     }
 
-    return _analyzerConverter.locationFromElement(element,
+    return converter.locationFromElement(element,
         offset: codeOffset, length: codeLength);
   }
 
diff --git a/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart b/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
index fc51912..2c20593 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
@@ -233,12 +233,9 @@
   }
 
   void _replaceReceiverArgumentWithDummy(HInvoke node, int receiverIndex) {
-    HInstruction receiverArgument = node.inputs[receiverIndex];
     ConstantValue constant = DummyInterceptorConstantValue();
     HConstant dummy = _graph.addConstant(constant, _closedWorld);
-    receiverArgument.usedBy.remove(node);
-    node.inputs[receiverIndex] = dummy;
-    dummy.usedBy.add(node);
+    node.replaceInput(receiverIndex, dummy);
   }
 }
 
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 6f187a3..7bd3dde 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -1313,8 +1313,8 @@
     removeFromList(usedBy, user);
   }
 
-  // Change all uses of [oldInput] by [this] to [newInput]. Also
-  // updates the [usedBy] of [oldInput] and [newInput].
+  // Change all uses of [oldInput] by [this] to [newInput]. Also updates the
+  // [usedBy] of [oldInput] and [newInput].
   void changeUse(HInstruction oldInput, HInstruction newInput) {
     assert(newInput != null && !identical(oldInput, newInput));
     for (int i = 0; i < inputs.length; i++) {
@@ -1326,6 +1326,16 @@
     removeFromList(oldInput.usedBy, this);
   }
 
+  /// Replace a single input.
+  ///
+  /// Use [changeUse] to change all inputs that are the same value.
+  void replaceInput(int index, HInstruction replacement) {
+    assert(replacement.isInBasicBlock());
+    inputs[index].usedBy.remove(this);
+    inputs[index] = replacement;
+    replacement.usedBy.add(this);
+  }
+
   void replaceAllUsersDominatedBy(
       HInstruction cursor, HInstruction newInstruction) {
     DominatedUses.of(this, cursor).replaceWith(newInstruction);
@@ -1439,9 +1449,7 @@
           identical(oldInstruction, _source),
           'Input ${index} of ${user} changed.'
           '\n  Found: ${oldInstruction}\n  Expected: ${_source}');
-      user.inputs[index] = newInstruction;
-      oldInstruction.usedBy.remove(user);
-      newInstruction.usedBy.add(user);
+      user.replaceInput(index, newInstruction);
     }
   }
 
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 7fc8c53..d600d7e 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1158,6 +1158,79 @@
     return null;
   }
 
+  FieldEntity _indexFieldOfEnumClass(ClassEntity enumClass) {
+    MemberEntity member =
+        _closedWorld.elementEnvironment.lookupClassMember(enumClass, 'index');
+    if (member is FieldEntity) return member;
+    throw StateError('$enumClass should have index field, found $member');
+  }
+
+  IntConstantValue _indexValueOfEnumConstant(
+      ConstantValue constant, ClassEntity enumClass, FieldEntity field) {
+    if (constant is ConstructedConstantValue) {
+      if (constant.type.element == enumClass) {
+        final value = constant.fields[field];
+        if (value is IntConstantValue) return value;
+      }
+    }
+    throw StateError(
+        'Enum constant ${constant.toStructuredText(_closedWorld.dartTypes)}'
+        ' should have $field');
+  }
+
+  // The `enum` class of the [node], or `null` if [node] does not have an
+  // non-nullable enum type.
+  ClassEntity _enumClass(HInstruction node) {
+    final cls = _abstractValueDomain.getExactClass(node.instructionType);
+    if (cls == null) return null;
+    if (_closedWorld.elementEnvironment.isEnumClass(cls)) return cls;
+    return null;
+  }
+
+  // Try to replace enum labels in a switch with the index values. This is
+  // usually smaller, faster, and might allow the JavaScript engine to compile
+  // the switch to a jump-table.
+  void _tryReduceEnumsInSwitch(HSwitch node) {
+    final enumClass = _enumClass(node.expression);
+    if (enumClass == null) return;
+
+    FieldEntity indexField = _indexFieldOfEnumClass(enumClass);
+    // In some cases the `index` field is elided. We can't load an elided field.
+    //
+    // TODO(sra): The ConstantValue has the index value, so we can still reduce
+    // the enum to the index value. We could handle an elided `index` field in
+    // some cases by doing this optimization more like scalar replacement or
+    // unboxing, replacing all enums in the method at once, possibly reducing
+    // phis of enums to phis of indexes.
+    if (_closedWorld.fieldAnalysis.getFieldData(indexField).isElided) return;
+
+    // All the label expressions should be of the same enum class as the switch
+    // expression.
+    for (final label in node.inputs.skip(1)) {
+      if (label is! HConstant) return;
+      if (_enumClass(label) != enumClass) return;
+    }
+
+    final loadIndex = _directFieldGet(node.expression, indexField, node);
+    node.block.addBefore(node, loadIndex);
+    node.replaceInput(0, loadIndex);
+
+    for (int i = 1; i < node.inputs.length; i++) {
+      ConstantValue labelConstant = (node.inputs[i] as HConstant).constant;
+      node.replaceInput(
+          i,
+          _graph.addConstant(
+              _indexValueOfEnumConstant(labelConstant, enumClass, indexField),
+              _closedWorld));
+    }
+  }
+
+  @override
+  HInstruction visitSwitch(HSwitch node) {
+    _tryReduceEnumsInSwitch(node);
+    return node;
+  }
+
   @override
   HInstruction visitIdentity(HIdentity node) {
     HInstruction newInstruction = handleIdentityCheck(node);
@@ -1281,10 +1354,7 @@
 
   /// Returns [node] after replacing condition.
   HInstruction _replaceHIfCondition(HIf node, HInstruction newCondition) {
-    HInstruction condition = node.condition;
-    node.inputs[0] = newCondition;
-    condition.usedBy.remove(node);
-    newCondition.usedBy.add(node);
+    node.replaceInput(0, newCondition);
     return node;
   }
 
@@ -2506,9 +2576,7 @@
       // Pick the 'live' branch to be the smallest subgraph.
       bool value = thenSize <= elseSize;
       HInstruction newCondition = _graph.addConstantBool(value, closedWorld);
-      instruction.inputs[0] = newCondition;
-      condition.usedBy.remove(instruction);
-      newCondition.usedBy.add(instruction);
+      instruction.replaceInput(0, newCondition);
     }
   }
 
@@ -2563,7 +2631,7 @@
       block.forEachPhi((HPhi phi) {
         for (int i = 0; i < phi.inputs.length; ++i) {
           if (!predecessors[i].isLive && phi.inputs[i] != zapInstruction) {
-            replaceInput(i, phi, zapInstruction);
+            phi.replaceInput(i, zapInstruction);
           }
         }
       });
@@ -2598,12 +2666,6 @@
     }
   }
 
-  void replaceInput(int i, HInstruction from, HInstruction by) {
-    from.inputs[i].usedBy.remove(from);
-    from.inputs[i] = by;
-    by.usedBy.add(from);
-  }
-
   void removeUsers(HInstruction instruction) {
     instruction.usedBy.forEach((user) {
       removeInput(user, instruction);
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index ed20219..7d69548 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -356,9 +356,13 @@
 
 // Determine whether we will be using the simulator.
 #if defined(TARGET_ARCH_IA32)
-// No simulator used.
+#if !defined(HOST_ARCH_IA32)
+#define USING_SIMULATOR 1
+#endif
 #elif defined(TARGET_ARCH_X64)
-// No simulator used.
+#if !defined(HOST_ARCH_X64)
+#define USING_SIMULATOR 1
+#endif
 #elif defined(TARGET_ARCH_ARM)
 #if !defined(HOST_ARCH_ARM)
 #define TARGET_HOST_MISMATCH 1
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index c2e2d6c..a62e235 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -14,7 +14,7 @@
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
-const String version = '1.92';
+const String version = '1.93';
 
 // Restriction on statements and expressions.
 const int stmtDepth = 1;
@@ -550,6 +550,8 @@
     emitBraceWrapped(() => tryBody());
     emit(' on OutOfMemoryError ');
     emitBraceWrapped(() => emitLn('exit($oomExitCode);', newline: false));
+    emit(' on StackOverflowError ');
+    emitBraceWrapped(() => emitLn('exit($oomExitCode);', newline: false));
     emit(' catch (e, st) ');
     emitBraceWrapped(catchBody);
     if (finallyBody != null) {
@@ -1391,6 +1393,8 @@
     emitBraceWrapped(emitStatementsClosure);
     emit(' on OutOfMemoryError ');
     emitBraceWrapped(() => emitLn('exit($oomExitCode);', newline: false));
+    emit(' on StackOverflowError ');
+    emitBraceWrapped(() => emitLn('exit($oomExitCode);', newline: false));
     emit(' catch (exception, stackTrace) ', newline: false);
     emitBraceWrapped(emitStatementsClosure);
     if (coinFlip()) {
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 21399b7..1d74f0a 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -534,6 +534,12 @@
         required_capacity++;
       }
     }
+    // Over-allocate capacity so a few inserts can happen at startup without
+    // causing a rehash.
+    const intptr_t kSpareCapacity = 32;
+    required_capacity = static_cast<intptr_t>(
+        static_cast<double>(required_capacity + kSpareCapacity) /
+        HashTables::kMaxLoadFactor);
 
     intptr_t num_occupied = 0;
 
@@ -5365,6 +5371,10 @@
       if (d->isolate_group() == Dart::vm_isolate_group()) {
         Symbols::InitFromSnapshot(d->isolate_group());
       }
+#if defined(DEBUG)
+      Symbols::New(Thread::Current(), ":some:new:symbol:");
+      ASSERT(object_store->symbol_table() == table_.ptr());  // Did not rehash.
+#endif
     }
   }
 };
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index e27ac58..d193d23 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -64,7 +64,7 @@
   return
 #if defined(USING_SIMULATOR)
       "sim"
-#endif  // !defined(HOST_ARCH_ARM64)
+#endif  // !defined(USING_SIMULATOR)
       "arm64";
 }
 
diff --git a/runtime/vm/cpu_ia32.cc b/runtime/vm/cpu_ia32.cc
index a2ed128..27ae5c5 100644
--- a/runtime/vm/cpu_ia32.cc
+++ b/runtime/vm/cpu_ia32.cc
@@ -24,7 +24,11 @@
 }
 
 const char* CPU::Id() {
-  return "ia32";
+  return
+#if defined(USING_SIMULATOR)
+      "sim"
+#endif  // !defined(USING_SIMULATOR)
+      "ia32";
 }
 
 const char* HostCPUFeatures::hardware_ = nullptr;
diff --git a/runtime/vm/cpu_x64.cc b/runtime/vm/cpu_x64.cc
index 7f5981c..cf0acf3 100644
--- a/runtime/vm/cpu_x64.cc
+++ b/runtime/vm/cpu_x64.cc
@@ -23,7 +23,11 @@
 }
 
 const char* CPU::Id() {
-  return "x64";
+  return
+#if defined(USING_SIMULATOR)
+      "sim"
+#endif  // !defined(USING_SIMULATOR)
+      "x64";
 }
 
 const char* HostCPUFeatures::hardware_ = nullptr;
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 318dbf4..d917aae 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -553,6 +553,8 @@
     }
   }
 
+  static constexpr double kMaxLoadFactor = 0.71;
+
   template <typename Table>
   static void EnsureLoadFactor(double high, const Table& table) {
     // We count deleted elements because they take up space just
@@ -707,8 +709,7 @@
 
  protected:
   void EnsureCapacity() const {
-    static const double kMaxLoadFactor = 0.71;
-    HashTables::EnsureLoadFactor(kMaxLoadFactor, *this);
+    HashTables::EnsureLoadFactor(HashTables::kMaxLoadFactor, *this);
   }
 };
 
@@ -793,8 +794,7 @@
 
  protected:
   void EnsureCapacity() const {
-    static const double kMaxLoadFactor = 0.71;
-    HashTables::EnsureLoadFactor(kMaxLoadFactor, *this);
+    HashTables::EnsureLoadFactor(HashTables::kMaxLoadFactor, *this);
   }
 };
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 76a9ecd..97850c6 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -364,6 +364,7 @@
 
 void Heap::NotifyIdle(int64_t deadline) {
   Thread* thread = Thread::Current();
+  TIMELINE_FUNCTION_GC_DURATION(thread, "NotifyIdle");
   GcSafepointOperationScope safepoint_operation(thread);
 
   // Check if we want to collect new-space first, because if we want to collect
@@ -371,7 +372,6 @@
   // to shrink the root set (make old-space GC faster) and avoid
   // intergenerational garbage (make old-space GC free more memory).
   if (new_space_.ShouldPerformIdleScavenge(deadline)) {
-    TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
     CollectNewSpaceGarbage(thread, kIdle);
   }
 
@@ -383,7 +383,6 @@
     // We prefer mark-compact over other old space GCs if we have enough time,
     // since it removes old space fragmentation and frees up most memory.
     // Blocks for O(heap), roughtly twice as costly as mark-sweep.
-    TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
     CollectOldSpaceGarbage(thread, kMarkCompact, kIdle);
   } else if (old_space_.ReachedHardThreshold()) {
     // Even though the following GC may exceed our idle deadline, we need to
@@ -393,7 +392,6 @@
     // the only place that checks the old space allocation limit.
     // Compare the tail end of Heap::CollectNewSpaceGarbage.
     // Blocks for O(heap).
-    TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
     CollectOldSpaceGarbage(thread, kMarkSweep, kIdle);
   } else if (old_space_.ShouldStartIdleMarkSweep(deadline) ||
              old_space_.ReachedSoftThreshold()) {
@@ -408,16 +406,15 @@
       phase = old_space_.phase();
     }
     if (phase == PageSpace::kAwaitingFinalization) {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
       CollectOldSpaceGarbage(thread, Heap::kMarkSweep, Heap::kFinalize);
     } else if (phase == PageSpace::kDone) {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "IdleGC");
       StartConcurrentMarking(thread);
     }
   }
 }
 
 void Heap::NotifyLowMemory() {
+  TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "NotifyLowMemory");
   CollectMostGarbage(kLowMemory);
 }
 
diff --git a/runtime/vm/simulator.h b/runtime/vm/simulator.h
index 3194aa9..e08337c 100644
--- a/runtime/vm/simulator.h
+++ b/runtime/vm/simulator.h
@@ -9,8 +9,7 @@
 
 #if defined(USING_SIMULATOR)
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
-// No simulator used.
-#error Simulator not supported.
+#error Simulator not implemented.
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/simulator_arm.h"
 #elif defined(TARGET_ARCH_ARM64)
diff --git a/tools/VERSION b/tools/VERSION
index 9936ef2..e72b70a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 154
+PRERELEASE 155
 PRERELEASE_PATCH 0
\ No newline at end of file
