Version 2.14.0-350.0.dev

Merge commit '40766bd74266af011e410614179f054ac5db4226' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index e05af29..06c07a9 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-07-22T12:39:20.084398",
+  "generated": "2021-07-23T12:33:04.456358",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -731,7 +731,7 @@
       "name": "typed_data",
       "rootUri": "../third_party/pkg/typed_data",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.12"
     },
     {
       "name": "usage",
@@ -800,4 +800,4 @@
       "languageVersion": "2.12"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/DEPS b/DEPS
index f31a4bf..b299924 100644
--- a/DEPS
+++ b/DEPS
@@ -115,7 +115,7 @@
   "html_rev": "00cd3c22dac0e68e6ed9e7e4945101aedb1b3109",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev": "de1b312164c24a1690b46c6e97bd47eff40c4649",
-  "http_parser_rev": "7720bfd42a0c096734c5213478fdce92c62f0293",
+  "http_parser_rev": "202391286ddc13c4c3c284ac5b511f04697250ed",
   "http_rev": "778174bca2c13becd88ef3353309190b1e8b9479",
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "81d656878ec611cb0b42d52c82e9dae93920d9ba",
@@ -164,7 +164,7 @@
   "term_glyph_rev": "6a0f9b6fb645ba75e7a00a4e20072678327a0347",
   "test_reflective_loader_rev": "54e930a11c372683792e22bddad79197728c91ce",
   "test_rev": "099dcc4d052a30c6921489cfbefa1c8531d12975",
-  "typed_data_tag": "f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719",
+  "typed_data_rev": "29ce5a92b03326d0b8035916ac04f528874994bd",
   "usage_rev": "e0780cd8b2f8af69a28dc52678ffe8492da27d06",
   "vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
   "watcher_rev": "3924194385fb215cef483193ed2879a618a3d69c",
@@ -456,7 +456,7 @@
       Var("dart_git") + "test_reflective_loader.git" +
       "@" + Var("test_reflective_loader_rev"),
   Var("dart_root") + "/third_party/pkg/typed_data":
-      Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
+      Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_rev"),
   Var("dart_root") + "/third_party/pkg/usage":
       Var("dart_git") + "usage.git" + "@" + Var("usage_rev"),
   Var("dart_root") + "/third_party/pkg/vector_math":
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 017468a..5342239 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 = 164;
+  static const int DATA_VERSION = 166;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d466919..7660639 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3,6 +3,7 @@
 // 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';
@@ -2046,9 +2047,6 @@
   /// The length of the element's code, or `null` if the element is synthetic.
   int? _codeLength;
 
-  /// The language version for the library.
-  LibraryLanguageVersion? _languageVersion;
-
   /// Initialize a newly created element to have the given [name] at the given
   /// [_nameOffset].
   ElementImpl(String? name, this._nameOffset, {this.reference}) {
@@ -2361,15 +2359,6 @@
   /// children of this element's parent.
   String get identifier => name!;
 
-  /// Return `true` if this element was created from a macro-generated code.
-  bool get isFromMacro {
-    return hasModifier(Modifier.IS_FROM_MACRO);
-  }
-
-  set isFromMacro(bool isFromMacro) {
-    setModifier(Modifier.IS_FROM_MACRO, isFromMacro);
-  }
-
   bool get isNonFunctionTypeAliasesEnabled {
     return library!.featureSet.isEnabled(Feature.nonfunction_type_aliases);
   }
@@ -2723,7 +2712,12 @@
   /// The code that for produced by the macro.
   final String code;
 
-  ElementMacro(this.id, this.code);
+  /// When we build elements from macro-produced code, we remember informative
+  /// data, such as offsets - to store it into bytes. This field is set to
+  /// an empty list when reading from bytes.
+  final Uint8List informative;
+
+  ElementMacro(this.id, this.code, this.informative);
 }
 
 /// An [AbstractClassElementImpl] which is an enum.
@@ -3638,6 +3632,9 @@
   @override
   final AnalysisSession session;
 
+  /// The language version for the library.
+  LibraryLanguageVersion? _languageVersion;
+
   bool hasTypeProviderSystemSet = false;
 
   @override
@@ -4308,26 +4305,23 @@
   /// type being referred to is the return type.
   static const Modifier IMPLICIT_TYPE = Modifier('IMPLICIT_TYPE', 16);
 
-  /// Indicates that this element was created from macro-generated code.
-  static const Modifier IS_FROM_MACRO = Modifier('IS_FROM_MACRO', 17);
-
   /// Indicates that modifier 'lazy' was applied to the element.
-  static const Modifier LATE = Modifier('LATE', 18);
+  static const Modifier LATE = Modifier('LATE', 17);
 
   /// Indicates that a class is a mixin application.
-  static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 19);
+  static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 18);
 
   /// Indicates that the pseudo-modifier 'set' was applied to the element.
-  static const Modifier SETTER = Modifier('SETTER', 20);
+  static const Modifier SETTER = Modifier('SETTER', 19);
 
   /// Indicates that the modifier 'static' was applied to the element.
-  static const Modifier STATIC = Modifier('STATIC', 21);
+  static const Modifier STATIC = Modifier('STATIC', 20);
 
   /// Indicates that the element does not appear in the source code but was
   /// implicitly created. For example, if a class does not define any
   /// constructors, an implicit zero-argument constructor will be created and it
   /// will be marked as being synthetic.
-  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 22);
+  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 21);
 
   static const List<Modifier> values = [
     ABSTRACT,
@@ -4346,7 +4340,6 @@
     HAS_INITIALIZER,
     HAS_PART_OF_DIRECTIVE,
     IMPLICIT_TYPE,
-    IS_FROM_MACRO,
     LATE,
     MIXIN_APPLICATION,
     SETTER,
diff --git a/pkg/analyzer/lib/src/macro/impl/macro.dart b/pkg/analyzer/lib/src/macro/impl/macro.dart
index 85f0223..ddb1a2b 100644
--- a/pkg/analyzer/lib/src/macro/impl/macro.dart
+++ b/pkg/analyzer/lib/src/macro/impl/macro.dart
@@ -2,6 +2,8 @@
 // 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:typed_data';
+
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart' as ast;
 import 'package:analyzer/dart/ast/token.dart';
@@ -9,6 +11,7 @@
 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';
 
 class ClassDeclarationBuilderImpl extends DeclarationBuilderImpl
     implements ClassDeclarationBuilder {
@@ -19,27 +22,31 @@
 
   @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} { $declaration }',
+      content: 'class ${node.name.name} { $declarationCode }',
     );
     var parsedDeclarations = parseResult.unit.declarations;
     var parsedClass = parsedDeclarations.single as ast.ClassDeclaration;
     var parsedMember = parsedClass.members.single;
-    _resetOffsets(parsedMember);
+    _rebaseOffsets(parsedMember);
 
     node.members.add(parsedMember);
     _collector._add(parsedMember, declaration);
   }
 
   /// We parsed [node] in the context of some synthetic code string, its
-  /// current offsets are meaningless. So, we reset them for now.
-  static void _resetOffsets(ast.AstNode node) {
+  /// 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 = -1;
+      t.offset -= baseOffset;
     }
   }
 }
@@ -68,9 +75,11 @@
       if (node is ast.Declaration) {
         var element = node.declaredElement;
         if (element is HasElementMacro) {
+          var collectedDeclaration = entry.value;
           (element as HasElementMacro).macro = ElementMacro(
-            entry.value.id,
-            entry.value.declaration.code,
+            collectedDeclaration.id,
+            collectedDeclaration.declaration.code,
+            collectedDeclaration.informative,
           );
         }
       }
@@ -78,13 +87,22 @@
   }
 
   void _add(ast.AstNode node, Declaration declaration) {
-    _declarations[node] = _CollectedDeclaration(_nextId++, declaration);
+    _declarations[node] = _CollectedDeclaration(
+      _nextId++,
+      declaration,
+      writeDeclarationInformative(node),
+    );
   }
 }
 
 class _CollectedDeclaration {
   final int id;
   final Declaration declaration;
+  final Uint8List informative;
 
-  _CollectedDeclaration(this.id, this.declaration);
+  _CollectedDeclaration(
+    this.id,
+    this.declaration,
+    this.informative,
+  );
 }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 94e46ae..13b33b1 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -495,8 +495,10 @@
 
     _declareDartCoreDynamicNever();
 
-    InformativeDataApplier(_elementFactory, _unitsInformativeBytes)
-        .applyTo(libraryElement);
+    InformativeDataApplier(_elementFactory).applyTo(
+      _unitsInformativeBytes,
+      libraryElement,
+    );
 
     return libraryElement;
   }
@@ -850,12 +852,17 @@
     return LibraryLanguageVersion(package: package, override: override);
   }
 
-  ElementMacro? _readMacro() {
-    var hasData = _reader.readBool();
-    if (hasData) {
-      var id = _reader.readUInt30();
-      var code = _reader.readStringUtf8();
-      return ElementMacro(id, code);
+  void _readMacro(Element element, HasElementMacro hasMacro) {
+    if (_reader.readBool()) {
+      hasMacro.macro = ElementMacro(
+        _reader.readUInt30(),
+        _reader.readStringUtf8(),
+        Uint8List(0),
+      );
+      InformativeDataApplier(_elementFactory).applyToDeclaration(
+        element,
+        _reader.readUint8List(),
+      );
     }
   }
 
@@ -995,7 +1002,6 @@
 
     var element = PropertyAccessorElementImpl(name, -1);
     PropertyAccessorElementFlags.read(_reader, element);
-    element.macro = _readMacro();
 
     var reference = classReference
         .getChild(element.isGetter ? '@getter' : '@setter')
@@ -1009,6 +1015,7 @@
     element.setLinkedData(reference, linkedData);
 
     element.parameters = _readParameters(element, reference);
+    _readMacro(element, element);
     return element;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index a112b46..b9be7f8 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -285,6 +285,7 @@
     if (macro != null) {
       _sink.writeUInt30(macro.id);
       _sink.writeStringUtf8(macro.code);
+      _sink.writeUint8List(macro.informative);
     }
   }
 
@@ -372,11 +373,12 @@
     _sink.writeUInt30(_resolutionSink.offset);
     _sink._writeStringReference(element.displayName);
     PropertyAccessorElementFlags.write(_sink, element);
-    _writeMacro(element.macro);
 
     _resolutionSink._writeAnnotationList(element.metadata);
     _resolutionSink.writeType(element.returnType);
+
     _writeList(element.parameters, _writeParameterElement);
+    _writeMacro(element.macro);
   }
 
   void _writeReferences(List<Reference> references) {
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 983c60a..790c470 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -96,25 +96,10 @@
   ) {
     var holder = _buildClassMembers(element, members);
 
-    for (var newElement in holder.propertyAccessors) {
-      newElement.isFromMacro = true;
-      element.accessors.add(newElement);
-    }
-
-    for (var newElement in holder.constructors) {
-      newElement.isFromMacro = true;
-      element.constructors.add(newElement);
-    }
-
-    for (var newElement in holder.properties.whereType<FieldElementImpl>()) {
-      newElement.isFromMacro = true;
-      element.fields.add(newElement);
-    }
-
-    for (var newElement in holder.methods) {
-      newElement.isFromMacro = true;
-      element.methods.add(newElement);
-    }
+    element.accessors.addAll(holder.propertyAccessors);
+    element.constructors.addAll(holder.constructors);
+    element.fields.addAll(holder.properties.whereType<FieldElementImpl>());
+    element.methods.addAll(holder.methods);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/element_flags.dart b/pkg/analyzer/lib/src/summary2/element_flags.dart
index f43df16..529a06f 100644
--- a/pkg/analyzer/lib/src/summary2/element_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/element_flags.dart
@@ -8,14 +8,12 @@
 
 class ClassElementFlags {
   static const int _isAbstract = 1 << 0;
-  static const int _isFromMacro = 1 << 1;
   static const int _isMixinApplication = 1 << 2;
   static const int _isSimplyBounded = 1 << 3;
 
   static void read(SummaryDataReader reader, ClassElementImpl element) {
     var byte = reader.readByte();
     element.isAbstract = (byte & _isAbstract) != 0;
-    element.isFromMacro = (byte & _isFromMacro) != 0;
     element.isMixinApplication = (byte & _isMixinApplication) != 0;
     element.isSimplyBounded = (byte & _isSimplyBounded) != 0;
   }
@@ -23,7 +21,6 @@
   static void write(BufferedSink sink, ClassElementImpl element) {
     var result = 0;
     result |= element.isAbstract ? _isAbstract : 0;
-    result |= element.isFromMacro ? _isFromMacro : 0;
     result |= element.isMixinApplication ? _isMixinApplication : 0;
     result |= element.isSimplyBounded ? _isSimplyBounded : 0;
     sink.writeByte(result);
@@ -63,7 +60,6 @@
   static const int _isCovariant = 1 << 5;
   static const int _isExternal = 1 << 6;
   static const int _isFinal = 1 << 7;
-  static const int _isFromMacro = 1 << 8;
   static const int _isLate = 1 << 9;
   static const int _isStatic = 1 << 10;
 
@@ -77,7 +73,6 @@
     element.isCovariant = (byte & _isCovariant) != 0;
     element.isExternal = (byte & _isExternal) != 0;
     element.isFinal = (byte & _isFinal) != 0;
-    element.isFromMacro = (byte & _isFromMacro) != 0;
     element.isLate = (byte & _isLate) != 0;
     element.isStatic = (byte & _isStatic) != 0;
   }
@@ -92,7 +87,6 @@
     result |= element.isCovariant ? _isCovariant : 0;
     result |= element.isExternal ? _isExternal : 0;
     result |= element.isFinal ? _isFinal : 0;
-    result |= element.isFromMacro ? _isFromMacro : 0;
     result |= element.isLate ? _isLate : 0;
     result |= element.isStatic ? _isStatic : 0;
     sink.writeUInt30(result);
@@ -167,7 +161,6 @@
   static const int _isAbstract = 1 << 1;
   static const int _isAsynchronous = 1 << 2;
   static const int _isExternal = 1 << 3;
-  static const int _isFromMacro = 1 << 4;
   static const int _isGenerator = 1 << 5;
   static const int _isStatic = 1 << 6;
 
@@ -177,7 +170,6 @@
     element.isAbstract = (byte & _isAbstract) != 0;
     element.isAsynchronous = (byte & _isAsynchronous) != 0;
     element.isExternal = (byte & _isExternal) != 0;
-    element.isFromMacro = (byte & _isFromMacro) != 0;
     element.isGenerator = (byte & _isGenerator) != 0;
     element.isStatic = (byte & _isStatic) != 0;
   }
@@ -188,7 +180,6 @@
     result |= element.isAbstract ? _isAbstract : 0;
     result |= element.isAsynchronous ? _isAsynchronous : 0;
     result |= element.isExternal ? _isExternal : 0;
-    result |= element.isFromMacro ? _isFromMacro : 0;
     result |= element.isGenerator ? _isGenerator : 0;
     result |= element.isStatic ? _isStatic : 0;
     sink.writeByte(result);
@@ -226,7 +217,6 @@
   static const int _isAbstract = 1 << 3;
   static const int _isAsynchronous = 1 << 4;
   static const int _isExternal = 1 << 5;
-  static const int _isFromMacro = 1 << 6;
   static const int _isGenerator = 1 << 7;
   static const int _isStatic = 1 << 8;
 
@@ -241,7 +231,6 @@
     element.isAbstract = (byte & _isAbstract) != 0;
     element.isAsynchronous = (byte & _isAsynchronous) != 0;
     element.isExternal = (byte & _isExternal) != 0;
-    element.isFromMacro = (byte & _isFromMacro) != 0;
     element.isGenerator = (byte & _isGenerator) != 0;
     element.isStatic = (byte & _isStatic) != 0;
   }
@@ -254,7 +243,6 @@
     result |= element.isAbstract ? _isAbstract : 0;
     result |= element.isAsynchronous ? _isAsynchronous : 0;
     result |= element.isExternal ? _isExternal : 0;
-    result |= element.isFromMacro ? _isFromMacro : 0;
     result |= element.isGenerator ? _isGenerator : 0;
     result |= element.isStatic ? _isStatic : 0;
     sink.writeUInt30(result);
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 1dd1e5f..ca9e274 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -19,6 +19,15 @@
 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);
@@ -55,14 +64,13 @@
 
 class InformativeDataApplier {
   final LinkedElementFactory _elementFactory;
-  final Map<Uri, Uint8List> _unitsInformativeBytes2;
 
-  InformativeDataApplier(
-    this._elementFactory,
-    this._unitsInformativeBytes2,
-  );
+  InformativeDataApplier(this._elementFactory);
 
-  void applyTo(LibraryElementImpl libraryElement) {
+  void applyTo(
+    Map<Uri, Uint8List> unitsInformativeBytes,
+    LibraryElementImpl libraryElement,
+  ) {
     if (_elementFactory.isApplyingInformativeData) {
       throw StateError('Unexpected recursion.');
     }
@@ -72,7 +80,7 @@
     for (var i = 0; i < unitElements.length; i++) {
       var unitElement = unitElements[i] as CompilationUnitElementImpl;
       var unitUri = unitElement.source.uri;
-      var unitInfoBytes = _unitsInformativeBytes2[unitUri];
+      var unitInfoBytes = unitsInformativeBytes[unitUri];
       if (unitInfoBytes != null) {
         var unitReader = SummaryDataReader(unitInfoBytes);
         var unitInfo = _InfoUnit(unitReader);
@@ -140,35 +148,41 @@
     _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.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<PropertyAccessorElement, _InfoMethodDeclaration>(
+    forCorrespondingPairs(
       elementList.notSynthetic,
       infoList,
-      (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);
-            },
-          );
-        }
-      },
+      _applyToPropertyAccessor,
     );
   }
 
@@ -499,6 +513,31 @@
     );
   }
 
+  void _applyToMethod(MethodElement element, _InfoMethodDeclaration 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);
+      },
+    );
+  }
+
   void _applyToMethods(
     List<MethodElement> elementList,
     List<_InfoMethodDeclaration> infoList,
@@ -506,30 +545,7 @@
     forCorrespondingPairs<MethodElement, _InfoMethodDeclaration>(
       elementList,
       infoList,
-      (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);
-          },
-        );
-      },
+      _applyToMethod,
     );
   }
 
@@ -560,6 +576,32 @@
     );
   }
 
+  void _applyToPropertyAccessor(
+    PropertyAccessorElement element,
+    _InfoMethodDeclaration 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);
+        },
+      );
+    }
+  }
+
   void _applyToTopLevelVariable(
     TopLevelVariableElement element,
     _InfoTopLevelVariable info,
@@ -629,6 +671,10 @@
   }
 }
 
+enum _DeclarationKind {
+  methodDeclaration,
+}
+
 class _InfoClassDeclaration {
   final int codeOffset;
   final int codeLength;
@@ -1289,6 +1335,15 @@
     );
   }
 
+  void writeDeclaration(AstNode node) {
+    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;
@@ -1383,19 +1438,7 @@
           .whereType<MethodDeclaration>()
           .where((e) => e.isGetter || e.isSetter)
           .toList(),
-      (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,
-        );
-      },
+      _writeMethod,
     );
   }
 
@@ -1420,25 +1463,27 @@
     );
   }
 
+  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(),
-      (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,
-        );
-      },
+      _writeMethod,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
index a2cf17b..7269b91 100644
--- a/pkg/analyzer/lib/src/summary2/reference.dart
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -2,7 +2,6 @@
 // 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';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/summary2/scope.dart';
 
@@ -32,14 +31,6 @@
   /// The simple name of the reference in its [parent].
   final String name;
 
-  /// The node accessor, used to read nodes lazily.
-  /// Or `null` if a named container.
-  ReferenceNodeAccessor? nodeAccessor;
-
-  /// The corresponding [AstNode], or `null` if a named container.
-  /// TODO(scheglov) remove it
-  AstNode? node;
-
   /// The corresponding [Element], or `null` if a named container.
   Element? element;
 
@@ -97,21 +88,6 @@
     return map[name] ??= Reference._(this, name);
   }
 
-  /// If the reference has element, and it is for the [node], return `true`.
-  ///
-  /// The element might be not `null`, but the node is different in case of
-  /// duplicate declarations.
-  bool hasElementFor(AstNode node) {
-    if (element != null && this.node == node) {
-      return true;
-    } else {
-      if (this.node == null) {
-        this.node = node;
-      }
-      return false;
-    }
-  }
-
   void removeChild(String name) {
     _children!.remove(name);
   }
@@ -119,13 +95,3 @@
   @override
   String toString() => parent == null ? 'root' : '$parent::$name';
 }
-
-abstract class ReferenceNodeAccessor {
-  /// Return the node that corresponds to this [Reference], read it if not yet.
-  AstNode get node;
-
-  /// Fill [Reference.nodeAccessor] for children.
-  ///
-  /// TODO(scheglov) only class reader has a meaningful implementation.
-  void readIndex();
-}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 8e2ebe9..42f8774 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -685,7 +685,7 @@
       }
     }
 
-    if (e.isSynthetic || e.isFromMacro) {
+    if (e.isSynthetic) {
       expect(e.nameOffset, -1);
     } else {
       expect(e.nameOffset, isPositive);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 7c789a4f..bc3a7da 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -21288,17 +21288,17 @@
               requiredPositional __f @-1
                 type: int
             returnType: void
-          get f @-1
+          get f @8
             macro
               id: 0
               code: int get f => _f;
             returnType: int
-          set f @-1
+          set f @4
             macro
               id: 1
               code: set f(int val) {\n  print('Setting f to ${val}');\n  _f = val;\n}
             parameters
-              requiredPositional val @-1
+              requiredPositional val @10
                 type: int
             returnType: void
 ''');
@@ -21349,17 +21349,17 @@
               requiredPositional __f @-1
                 type: T
             returnType: void
-          get f @-1
+          get f @6
             macro
               id: 0
               code: T get f => _f;
             returnType: T
-          set f @-1
+          set f @4
             macro
               id: 1
               code: set f(T val) {\n  print('Setting f to ${val}');\n  _f = val;\n}
             parameters
-              requiredPositional val @-1
+              requiredPositional val @8
                 type: T
             returnType: void
 ''');
diff --git a/tools/VERSION b/tools/VERSION
index 1633d98..110a5dc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 349
+PRERELEASE 350
 PRERELEASE_PATCH 0
\ No newline at end of file