Version 2.12.0-108.0.dev

Merge commit 'ca5853779b4839a3bab54e49bfb2927b06394d06' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index aab52cb..a8bac9f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1423,36 +1423,6 @@
     }
   }
 
-  /// Updates the state to indicate that variables that are not definitely
-  /// unassigned in the [other], are also not definitely unassigned in the
-  /// result.
-  FlowModel<Variable, Type> joinUnassigned(FlowModel<Variable, Type> other) {
-    Map<Variable, VariableModel<Variable, Type>> newVariableInfo;
-
-    void markNotUnassigned(Variable variable) {
-      VariableModel<Variable, Type> info = variableInfo[variable];
-      if (info == null) return;
-
-      VariableModel<Variable, Type> newInfo = info.markNotUnassigned();
-      if (identical(newInfo, info)) return;
-
-      (newVariableInfo ??=
-          new Map<Variable, VariableModel<Variable, Type>>.from(
-              variableInfo))[variable] = newInfo;
-    }
-
-    for (Variable variable in other.variableInfo.keys) {
-      VariableModel<Variable, Type> otherInfo = other.variableInfo[variable];
-      if (!otherInfo.unassigned) {
-        markNotUnassigned(variable);
-      }
-    }
-
-    if (newVariableInfo == null) return this;
-
-    return new FlowModel<Variable, Type>.withInfo(reachable, newVariableInfo);
-  }
-
   /// Updates the state to reflect a control path that is known to have
   /// previously passed through some [other] state.
   ///
@@ -2117,15 +2087,6 @@
         null, const [], true, false, writeCaptured);
   }
 
-  /// Returns a new [VariableModel] reflecting the fact that the variable is
-  /// not definitely unassigned.
-  VariableModel<Variable, Type> markNotUnassigned() {
-    if (!unassigned) return this;
-
-    return new VariableModel<Variable, Type>(
-        promotedTypes, tested, assigned, false, writeCaptured);
-  }
-
   /// Returns an updated model reflect a control path that is known to have
   /// previously passed through some [other] state.  See [FlowModel.restrict]
   /// for details.
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index b7e5b8e..7d3a04f 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -2674,68 +2674,6 @@
       });
     });
 
-    group('joinUnassigned', () {
-      group('other', () {
-        test('unchanged', () {
-          var h = Harness();
-
-          var a = Var('a', 'int');
-          var b = Var('b', 'int');
-
-          var s1 = FlowModel<Var, Type>(Reachability.initial)
-              .declare(a, false)
-              .declare(b, false)
-              .write(a, Type('int'), h);
-          expect(s1.variableInfo, {
-            a: _matchVariableModel(assigned: true, unassigned: false),
-            b: _matchVariableModel(assigned: false, unassigned: true),
-          });
-
-          var s2 = s1.write(a, Type('int'), h);
-          expect(s2.variableInfo, {
-            a: _matchVariableModel(assigned: true, unassigned: false),
-            b: _matchVariableModel(assigned: false, unassigned: true),
-          });
-
-          var s3 = s1.joinUnassigned(s2);
-          expect(s3, same(s1));
-        });
-
-        test('changed', () {
-          var h = Harness();
-
-          var a = Var('a', 'int');
-          var b = Var('b', 'int');
-          var c = Var('c', 'int');
-
-          var s1 = FlowModel<Var, Type>(Reachability.initial)
-              .declare(a, false)
-              .declare(b, false)
-              .declare(c, false)
-              .write(a, Type('int'), h);
-          expect(s1.variableInfo, {
-            a: _matchVariableModel(assigned: true, unassigned: false),
-            b: _matchVariableModel(assigned: false, unassigned: true),
-            c: _matchVariableModel(assigned: false, unassigned: true),
-          });
-
-          var s2 = s1.write(b, Type('int'), h);
-          expect(s2.variableInfo, {
-            a: _matchVariableModel(assigned: true, unassigned: false),
-            b: _matchVariableModel(assigned: true, unassigned: false),
-            c: _matchVariableModel(assigned: false, unassigned: true),
-          });
-
-          var s3 = s1.joinUnassigned(s2);
-          expect(s3.variableInfo, {
-            a: _matchVariableModel(assigned: true, unassigned: false),
-            b: _matchVariableModel(assigned: false, unassigned: false),
-            c: _matchVariableModel(assigned: false, unassigned: true),
-          });
-        });
-      });
-    });
-
     group('conservativeJoin', () {
       test('unchanged', () {
         var h = Harness();
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 6578de6..7b20e05 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -420,7 +420,7 @@
     return ClientCapabilitiesWindow(workDoneProgress: workDoneProgress);
   }
 
-  /// Whether client supports handling progress notifications. If set servers
+  /// Whether client supports handling progress notifications. If set, servers
   /// are allowed to report in `workDoneProgress` property in the request
   /// specific server capabilities.
   ///
@@ -712,8 +712,8 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// A code action represents a change that can be performed in code, e.g. to fix
-/// a problem or to refactor code.
+/// A code action represents a change that can be performed in code. For
+/// example, to fix a problem or to refactor code.
 ///
 /// A CodeAction must set either `edit` and/or a `command`. If both are
 /// supplied, the `edit` is applied first, then the `command` is executed.
@@ -1222,7 +1222,7 @@
   /// Requested kind of actions to return.
   ///
   /// Actions not of this kind are filtered out by the client before being
-  /// shown. So servers can omit computing them.
+  /// shown, so servers can omit computing them.
   final List<CodeActionKind> only;
 
   Map<String, dynamic> toJson() {
@@ -1357,7 +1357,7 @@
   /// Source code actions apply to the entire file.
   static const Source = CodeActionKind('source');
 
-  /// Base kind for an organize imports source action: `source.organizeImports`.
+  /// Base kind for an organize imports source action `source.organizeImports`.
   static const SourceOrganizeImports = CodeActionKind('source.organizeImports');
 
   Object toJson() => _value;
@@ -1516,8 +1516,8 @@
   /// Context carrying additional information.
   final CodeActionContext context;
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The range for which the command was invoked.
@@ -1687,7 +1687,7 @@
   final List<CodeActionKind> codeActionKinds;
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -1777,11 +1777,11 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// A code lens represents a command that should be shown along with source
+/// A CodeLense represents a command that should be shown along with source
 /// text, like the number of references, a way to run tests, etc.
 ///
-/// A code lens is _unresolved_ when no command is associated to it. For
-/// performance reasons the creation of a code lens and resolving should be done
+/// A CodeLens is _unresolved_ when no command is associated to it. For
+/// performance reasons, the creation of a CodeLens and resolving should be done
 /// in two stages.
 class CodeLens implements ToJsonable {
   static const jsonHandler =
@@ -1800,15 +1800,14 @@
     return CodeLens(range: range, command: command, data: data);
   }
 
-  /// The command this code lens represents.
+  /// The command this CodeLens represents.
   final Command command;
 
-  /// A data entry field that is preserved on a code lens item between a code
-  /// lens and a code lens resolve request.
+  /// A data entry field that is preserved on a CodeLens item between a CodeLens
+  /// and a CodeLens resolve request.
   final dynamic data;
 
-  /// The range in which this code lens is valid. Should only span a single
-  /// line.
+  /// The range in which the CodeLens is valid. Should only span a single line.
   final Range range;
 
   Map<String, dynamic> toJson() {
@@ -1903,7 +1902,7 @@
     return CodeLensClientCapabilities(dynamicRegistration: dynamicRegistration);
   }
 
-  /// Whether code lens supports dynamic registration.
+  /// Whether CodeLens supports dynamic registration.
   final bool dynamicRegistration;
 
   Map<String, dynamic> toJson() {
@@ -2071,11 +2070,11 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
-  /// The document to request code lens for.
+  /// The document to request CodeLens for.
   final TextDocumentIdentifier textDocument;
 
   /// An optional token that a server can use to report work done progress.
@@ -2188,7 +2187,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// Code lens has a resolve provider as well.
@@ -2558,12 +2557,12 @@
   final List<TextEdit> additionalTextEdits;
 
   /// The label of this color presentation. It will be shown on the color picker
-  /// header. By default this is also the text that is inserted when selecting
+  /// header. By default, this is also the text that is inserted when selecting
   /// this color presentation.
   final String label;
 
   /// An edit ([TextEdit]) which is applied to a document when selecting this
-  /// presentation for the color.  When `falsy` the
+  /// presentation for the color. When `falsy`, the
   /// [label](#ColorPresentation.label) is used.
   final TextEdit textEdit;
 
@@ -2704,8 +2703,8 @@
   /// The color information to request presentations for.
   final Color color;
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The range where the color would be inserted. Serves as a context.
@@ -3149,8 +3148,8 @@
   ///
   /// A snippet can define tab stops and placeholders with `$1`, `$2` and
   /// `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of the
-  /// snippet. Placeholders with equal identifiers are linked, that is typing in
-  /// one will update others too.
+  /// snippet. Placeholders with equal identifiers are linked, so that typing in
+  /// one will update others as well.
   final bool snippetSupport;
 
   /// Client supports the tag property on a completion item. Clients supporting
@@ -3464,7 +3463,7 @@
         triggerKind: triggerKind, triggerCharacter: triggerCharacter);
   }
 
-  /// The trigger character (a single character) that has trigger code complete.
+  /// The trigger character (single character) that has trigger code complete.
   /// Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
   final String triggerCharacter;
 
@@ -3636,10 +3635,10 @@
   /// described with the additionalTextEdits-property.
   final Command command;
 
-  /// An optional set of characters that when pressed while this completion is
-  /// active will accept it first and then type that character. *Note* that all
-  /// commit characters should have `length=1` and that superfluous characters
-  /// will be ignored.
+  /// An optional set of characters that when pressed, while this completion is
+  /// active, will accept it first and then type that character.
+  /// *Note* that all commit characters should have `length=1` and that
+  /// superfluous characters will be ignored.
   final List<String> commitCharacters;
 
   /// A data entry field that is preserved on a completion item between a
@@ -3648,7 +3647,6 @@
 
   /// Indicates if this item is deprecated.
   ///  @deprecated Use `tags` instead if supported.
-  @core.deprecated
   final bool deprecated;
 
   /// A human-readable string with additional information about this item, like
@@ -3666,15 +3664,15 @@
   /// completion. When `falsy` the label is used.
   ///
   /// The `insertText` is subject to interpretation by the client side. Some
-  /// tools might not take the string literally. For example VS Code when code
+  /// tools might not take the string literally. For example, VS Code when code
   /// complete is requested in this example `con<cursor position>` and a
-  /// completion item with an `insertText` of `console` is provided it will only
-  /// insert `sole`. Therefore it is recommended to use `textEdit` instead since
-  /// it avoids additional client side interpretation.
+  /// completion item with an `insertText` of `console` is provided, it will
+  /// only insert `sole`. Therefore, it is recommended to use `textEdit` instead
+  /// since it avoids additional client side interpretation.
   final String insertText;
 
   /// The format of the insert text. The format applies to both the `insertText`
-  /// property and the `newText` property of a provided `textEdit`. If omitted
+  /// property and the `newText` property of a provided `textEdit`. If omitted,
   /// defaults to `InsertTextFormat.PlainText`.
   final InsertTextFormat insertTextFormat;
 
@@ -3702,8 +3700,8 @@
   ///  @since 3.15.0
   final List<CompletionItemTag> tags;
 
-  /// An edit which is applied to a document when selecting this completion.
-  /// When an edit is provided the value of `insertText` is ignored.
+  /// An edit that is applied to a document when selecting this completion. When
+  /// an edit is provided, the value of `insertText` is ignored.
   ///
   /// *Note:* The range of the edit must be a single line range and it must
   /// contain the position at which completion has been requested.
@@ -4204,11 +4202,11 @@
 
   /// The list of all possible characters that commit a completion. This field
   /// can be used if clients don't support individual commit characters per
-  /// completion item. See
-  /// `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`.
+  /// completion item. See `ClientCapabilities.`
+  /// `textDocument.completion.completionItem.commitCharactersSupport`.
   ///
   /// If a server provides both `allCommitCharacters` and commit characters on
-  /// an individual completion item the ones on the completion item win.
+  /// an individual completion item, the ones on the completion item win.
   ///  @since 3.2.0
   final List<String> allCommitCharacters;
 
@@ -4217,14 +4215,14 @@
   final bool resolveProvider;
 
   /// Most tools trigger completion request automatically without explicitly
-  /// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
-  /// do so when the user starts to type an identifier. For example if the user
-  /// types `c` in a JavaScript file code complete will automatically pop up
-  /// present `console` besides others as a completion item. Characters that
-  /// make up identifiers don't need to be listed here.
+  /// requesting it using a keyboard shortcut (for example Ctrl+Space).
+  /// Typically they do so when the user starts to type an identifier. For
+  /// example, if the user types `c` in a JavaScript file, code complete will
+  /// automatically display `console` along with others as a completion item.
+  /// Characters that make up identifiers don't need to be listed here.
   ///
-  /// If code complete should automatically be trigger on characters not being
-  /// valid inside an identifier (for example `.` in JavaScript) list them in
+  /// If code complete should automatically be triggered on characters not being
+  /// valid inside an identifier (for example `.` in JavaScript), list them in
   /// `triggerCharacters`.
   final List<String> triggerCharacters;
   final bool workDoneProgress;
@@ -4384,8 +4382,8 @@
   /// === true`
   final CompletionContext context;
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -4555,16 +4553,16 @@
 
   /// The list of all possible characters that commit a completion. This field
   /// can be used if clients don't support individual commit characters per
-  /// completion item. See
-  /// `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`.
+  /// completion item. See `ClientCapabilities.`
+  /// `textDocument.completion.completionItem.commitCharactersSupport`.
   ///
   /// If a server provides both `allCommitCharacters` and commit characters on
-  /// an individual completion item the ones on the completion item win.
+  /// an individual completion item, the ones on the completion item win.
   ///  @since 3.2.0
   final List<String> allCommitCharacters;
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The server provides support to resolve additional information for a
@@ -4572,14 +4570,14 @@
   final bool resolveProvider;
 
   /// Most tools trigger completion request automatically without explicitly
-  /// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
-  /// do so when the user starts to type an identifier. For example if the user
-  /// types `c` in a JavaScript file code complete will automatically pop up
-  /// present `console` besides others as a completion item. Characters that
-  /// make up identifiers don't need to be listed here.
+  /// requesting it using a keyboard shortcut (for example Ctrl+Space).
+  /// Typically they do so when the user starts to type an identifier. For
+  /// example, if the user types `c` in a JavaScript file, code complete will
+  /// automatically display `console` along with others as a completion item.
+  /// Characters that make up identifiers don't need to be listed here.
   ///
-  /// If code complete should automatically be trigger on characters not being
-  /// valid inside an identifier (for example `.` in JavaScript) list them in
+  /// If code complete should automatically be triggered on characters not being
+  /// valid inside an identifier (for example `.` in JavaScript), list them in
   /// `triggerCharacters`.
   final List<String> triggerCharacters;
   final bool workDoneProgress;
@@ -4724,7 +4722,7 @@
   static const Invoked = CompletionTriggerKind._(1);
 
   /// Completion was triggered by a trigger character specified by the
-  /// `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+  /// `triggerCharacters` properties of `CompletionRegistrationOptions`.
   static const TriggerCharacter = CompletionTriggerKind._(2);
 
   /// Completion was re-triggered as the current completion list is incomplete.
@@ -5103,8 +5101,8 @@
   }
 
   /// Whether declaration supports dynamic registration. If this is set to
-  /// `true` the client supports the new `DeclarationRegistrationOptions` return
-  /// value for the corresponding server capability as well.
+  /// `true`, the client supports the new `DeclarationRegistrationOptions`
+  /// return value for the corresponding server capability as well.
   final bool dynamicRegistration;
 
   /// The client supports additional metadata in the form of declaration links.
@@ -5282,8 +5280,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -5427,7 +5425,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -5708,8 +5706,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -5845,7 +5843,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -6346,7 +6344,7 @@
 
 /// Represents a related message and source code location for a diagnostic. This
 /// should be used to point to code locations that cause or are related to a
-/// diagnostics, e.g when duplicating a symbol in a scope.
+/// diagnostics, for example, when duplicating a symbol in a scope.
 class DiagnosticRelatedInformation implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DiagnosticRelatedInformation.canParse,
@@ -6679,19 +6677,18 @@
   }
 
   /// The actual content changes. The content changes describe single state
-  /// changes to the document. So if there are two content changes c1 (at array
-  /// index 0) and c2 (at array index 1) for a document in state S then c1 moves
-  /// the document from S to S' and c2 from S' to S''. So c1 is computed on the
-  /// state S and c2 is computed on the state S'.
+  /// changes to the document. If there are two content changes c1 (at array
+  /// index 0) and c2 (at array index 1) for a document in state S, then c1
+  /// moves the document from S to S' and c2 from S' to S''. So c1 is computed
+  /// on the state S and c2 is computed on the state S'.
   ///
-  /// To mirror the content of a document using change events use the following
+  /// To mirror the content of a document using change events, use the following
   /// approach:
   /// - start with the same initial content
-  /// - apply the 'textDocument/didChange' notifications in the order you
-  /// recevie them.
-  /// - apply the `TextDocumentContentChangeEvent`s in a single notification in
-  /// the order
-  ///   you receive them.
+  /// - apply the 'textDocument/didChange' notifications
+  ///     in the order you receive them.
+  /// - apply the `TextDocumentContentChangeEvent`s
+  ///     in a single notification in the order you receive them.
   final List<
       Either2<TextDocumentContentChangeEvent1,
           TextDocumentContentChangeEvent2>> contentChanges;
@@ -7484,8 +7481,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The text document.
@@ -7606,7 +7603,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -7717,13 +7714,13 @@
   /// - `*` to match one or more characters in a path segment
   /// - `?` to match on one character in a path segment
   /// - `**` to match any number of path segments, including none
-  /// - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
-  /// and JavaScript files)
-  /// - `[]` to declare a range of characters to match in a path segment (e.g.,
-  /// `example.[0-9]` to match on `example.0`, `example.1`, …)
+  /// - `{}` to group conditions
+  ///   (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+  /// - `[]` to declare a range of characters to match in a path segment
+  ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
   /// - `[!...]` to negate a range of characters to match in a path segment
-  /// (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
-  /// `example.0`)
+  ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`,
+  ///    but not `example.0`)
   final String pattern;
 
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
@@ -8088,7 +8085,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -8460,8 +8457,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -8603,7 +8600,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -8708,7 +8705,7 @@
 
   /// The tooltip text when you hover over this link.
   ///
-  /// If a tooltip is provided, is will be displayed in a string that includes
+  /// If a tooltip is provided, it will be displayed in a string that includes
   /// instructions on how to trigger the link, such as `{0} (ctrl + click)`. The
   /// specific instructions vary depending on OS, user settings, and
   /// localization.
@@ -9013,8 +9010,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The document to provide document links for.
@@ -9134,7 +9131,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// Document links have a resolve provider as well.
@@ -9596,7 +9593,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// A character on which formatting should be triggered, like `}`.
@@ -10017,7 +10014,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -10093,7 +10090,7 @@
 /// Represents programming constructs like variables, classes, interfaces etc.
 /// that appear in a document. Document symbols can be hierarchical and they
 /// have two ranges: one that encloses its definition and one that points to its
-/// most interesting range, e.g. the range of an identifier.
+/// most interesting range, for example, the range of an identifier.
 class DocumentSymbol implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(DocumentSymbol.canParse, DocumentSymbol.fromJson);
@@ -10162,12 +10159,13 @@
 
   /// The range enclosing this symbol not including leading/trailing whitespace
   /// but everything else like comments. This information is typically used to
-  /// determine if the clients cursor is inside the symbol to reveal in the
+  /// determine if the client's cursor is inside the symbol to reveal in the
   /// symbol in the UI.
   final Range range;
 
   /// The range that should be selected and revealed when this symbol is being
-  /// picked, e.g the name of a function. Must be contained by the `range`.
+  /// picked, for example, the name of a function. Must be contained by the
+  /// `range`.
   final Range selectionRange;
 
   Map<String, dynamic> toJson() {
@@ -10621,8 +10619,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The text document.
@@ -10739,7 +10737,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -11247,9 +11245,9 @@
   /// succeed or no changes at all are applied to the workspace.
   static const Transactional = FailureHandlingKind._('transactional');
 
-  /// If the workspace edit contains only textual file changes they are executed
-  /// transactional. If resource changes (create, rename or delete file) are
-  /// part of the change the failure handling strategy is abort.
+  /// If the workspace edit contains only textual file changes, they are
+  /// executed transactionally. If resource changes (create, rename or delete
+  /// file) are part of the change, the failure handling strategy is abort.
   static const TextOnlyTransactional =
       FailureHandlingKind._('textOnlyTransactional');
 
@@ -11416,12 +11414,12 @@
   /// - `?` to match on one character in a path segment
   /// - `**` to match any number of path segments, including none
   /// - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
-  /// and JavaScript files)
-  /// - `[]` to declare a range of characters to match in a path segment (e.g.,
-  /// `example.[0-9]` to match on `example.0`, `example.1`, …)
+  ///   and JavaScript files)
+  /// - `[]` to declare a range of characters to match in a path segment
+  ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
   /// - `[!...]` to negate a range of characters to match in a path segment
-  /// (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
-  /// `example.0`)
+  ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`,
+  ///    but not `example.0`)
   final String globPattern;
 
   /// The kind of events of interest. If omitted it defaults to WatchKind.Create
@@ -11681,15 +11679,15 @@
         lineFoldingOnly: lineFoldingOnly);
   }
 
-  /// Whether implementation supports dynamic registration for folding range
-  /// providers. If this is set to `true` the client supports the new
+  /// Whether the implementation supports dynamic registration for folding range
+  /// providers. If this is set to `true`, the client supports the new
   /// `FoldingRangeRegistrationOptions` return value for the corresponding
   /// server capability as well.
   final bool dynamicRegistration;
 
   /// If set, the client signals that it only supports folding complete lines.
-  /// If set, client will ignore specified `startCharacter` and `endCharacter`
-  /// properties in a FoldingRange.
+  /// If set, the client will ignore specified `startCharacter` and
+  /// `endCharacter` properties in a FoldingRange.
   final bool lineFoldingOnly;
 
   /// The maximum number of folding ranges that the client prefers to receive
@@ -11904,8 +11902,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The text document.
@@ -12026,7 +12024,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -12680,7 +12678,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -12767,7 +12765,7 @@
   }
 
   /// Whether implementation supports dynamic registration. If this is set to
-  /// `true` the client supports the new `ImplementationRegistrationOptions`
+  /// `true`, the client supports the new `ImplementationRegistrationOptions`
   /// return value for the corresponding server capability as well.
   final bool dynamicRegistration;
 
@@ -12947,8 +12945,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -13093,7 +13091,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -13249,15 +13247,14 @@
   /// User provided initialization options.
   final dynamic initializationOptions;
 
-  /// The process Id of the parent process that started the server. Is null if
+  /// The process ID of the parent process that started the server. Is null if
   /// the process has not been started by another process. If the parent process
-  /// is not alive then the server should exit (see exit notification) its
+  /// is not alive, then the server should exit (see exit notification) its
   /// process.
   final num processId;
 
   /// The rootPath of the workspace. Is null if no folder is open.
   ///  @deprecated in favour of rootUri.
-  @core.deprecated
   final String rootPath;
 
   /// The rootUri of the workspace. Is null if no folder is open. If both
@@ -13939,15 +13936,15 @@
   /// range at the mouse position.
   final Range originSelectionRange;
 
-  /// The full target range of this link. If the target for example is a symbol
-  /// then target range is the range enclosing this symbol not including
+  /// The full target range of this link. For example, if the target is a
+  /// symbol, then target range is the range enclosing this symbol not including
   /// leading/trailing whitespace but everything else like comments. This
   /// information is typically used to highlight the range in the editor.
   final Range targetRange;
 
   /// The range that should be selected and revealed when this link is being
-  /// followed, e.g the name of a function. Must be contained by the the
-  /// `targetRange`. See also `DocumentSymbol#range`
+  /// followed, for example, the name of a function. Must be contained by the
+  /// the `targetRange`. See also `DocumentSymbol#range`
   final Range targetSelectionRange;
 
   /// The target resource identifier of this link.
@@ -14160,16 +14157,15 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// A `MarkupContent` literal represents a string value which content is
+/// A `MarkupContent` literal represents a string value, which content is
 /// interpreted base on its kind flag. Currently the protocol supports
 /// `plaintext` and `markdown` as markup kinds.
 ///
-/// If the kind is `markdown` then the value can contain fenced code blocks like
-/// in GitHub issues. See
-/// https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+/// If the kind is `markdown`, then the value can contain fenced code blocks
+/// like in GitHub issues.
 ///
-/// Here is an example how such a string can be constructed using JavaScript /
-/// TypeScript: ```typescript let markdown: MarkdownContent = {
+/// An example how such a string is constructed using JavaScript / TypeScript:
+/// ```typescript let markdown: MarkdownContent = {
 ///
 /// kind: MarkupKind.Markdown,
 /// 	value: [
@@ -14180,8 +14176,8 @@
 /// 		'```'
 /// 	].join('\n') }; ```
 ///
-/// *Please Note* that clients might sanitize the return markdown. A client
-/// could decide to remove HTML from the markdown to avoid script execution.
+/// *Please Note* that clients might sanitize the returned Markdown. A client
+/// could decide to remove HTML from the Markdown to avoid script execution.
 class MarkupContent implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(MarkupContent.canParse, MarkupContent.fromJson);
@@ -14990,8 +14986,8 @@
     return PartialResultParams(partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   Map<String, dynamic> toJson() {
@@ -15566,9 +15562,8 @@
   /// The URI for which diagnostic information is reported.
   final String uri;
 
-  /// Optional the version number of the document the diagnostics are published
-  /// for.
-  ///  @since 3.15.0
+  /// The version number of the document the diagnostics are published for.
+  /// Optional. @since 3.15.0
   final num version;
 
   Map<String, dynamic> toJson() {
@@ -16102,8 +16097,8 @@
 
   final ReferenceContext context;
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -16260,7 +16255,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
   final bool workDoneProgress;
 
@@ -17105,7 +17100,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// Renames should be checked and tested before being executed.
@@ -17796,7 +17791,7 @@
   }
 
   /// Whether implementation supports dynamic registration for selection range
-  /// providers. If this is set to `true` the client supports the new
+  /// providers. If set to `true`, the client supports the new
   /// `SelectionRangeRegistrationOptions` return value for the corresponding
   /// server capability as well.
   final bool dynamicRegistration;
@@ -17956,8 +17951,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The positions inside the text document.
@@ -18105,7 +18100,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -18473,7 +18468,19 @@
                 : (json['selectionRangeProvider'] == null
                     ? null
                     : (throw '''${json['selectionRangeProvider']} was not one of (bool, SelectionRangeOptions, SelectionRangeRegistrationOptions)'''))));
-    final workspaceSymbolProvider = json['workspaceSymbolProvider'];
+    final workspaceSymbolProvider = json['workspaceSymbolProvider'] is bool
+        ? Either2<bool, WorkspaceSymbolOptions>.t1(
+            json['workspaceSymbolProvider'])
+        : (WorkspaceSymbolOptions.canParse(
+                json['workspaceSymbolProvider'], nullLspJsonReporter)
+            ? Either2<bool, WorkspaceSymbolOptions>.t2(
+                json['workspaceSymbolProvider'] != null
+                    ? WorkspaceSymbolOptions.fromJson(
+                        json['workspaceSymbolProvider'])
+                    : null)
+            : (json['workspaceSymbolProvider'] == null
+                ? null
+                : (throw '''${json['workspaceSymbolProvider']} was not one of (bool, WorkspaceSymbolOptions)''')));
     final workspace = json['workspace'] != null
         ? ServerCapabilitiesWorkspace.fromJson(json['workspace'])
         : null;
@@ -18511,7 +18518,7 @@
   /// property `textDocument.codeAction.codeActionLiteralSupport`.
   final Either2<bool, CodeActionOptions> codeActionProvider;
 
-  /// The server provides code lens.
+  /// The server provides CodeLens.
   final CodeLensOptions codeLensProvider;
 
   /// The server provides color provider support.
@@ -18585,8 +18592,8 @@
   final SignatureHelpOptions signatureHelpProvider;
 
   /// Defines how text documents are synced. Is either a detailed structure
-  /// defining each notification or for backwards compatibility the
-  /// TextDocumentSyncKind number. If omitted it defaults to
+  /// defining each notification or for backwards compatibility, the
+  /// TextDocumentSyncKind number. If omitted, it defaults to
   /// `TextDocumentSyncKind.None`.
   final Either2<TextDocumentSyncOptions, num> textDocumentSync;
 
@@ -18599,7 +18606,7 @@
   final ServerCapabilitiesWorkspace workspace;
 
   /// The server provides workspace symbol support.
-  final bool workspaceSymbolProvider;
+  final Either2<bool, WorkspaceSymbolOptions> workspaceSymbolProvider;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
@@ -18969,8 +18976,11 @@
       reporter.push('workspaceSymbolProvider');
       try {
         if (obj['workspaceSymbolProvider'] != null &&
-            !(obj['workspaceSymbolProvider'] is bool)) {
-          reporter.reportError('must be of type bool');
+            !((obj['workspaceSymbolProvider'] is bool ||
+                WorkspaceSymbolOptions.canParse(
+                    obj['workspaceSymbolProvider'], reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, WorkspaceSymbolOptions>');
           return false;
         }
       } finally {
@@ -19411,7 +19421,7 @@
   /// better express this.
   final num activeSignature;
 
-  /// One or more signatures. If no signaures are availabe the signature help
+  /// One or more signatures. If no signatures are available the signature help
   /// request should return `null`.
   final List<SignatureInformation> signatures;
 
@@ -19838,7 +19848,7 @@
   /// Character that caused signature help to be triggered.
   ///
   /// This is undefined when `triggerKind !==
-  /// SignatureHelpTriggerKind.TriggerCharacter`
+  /// SignatureHelpTriggerKind.TriggerCharacter`.
   final String triggerCharacter;
 
   /// Action that caused signature help to be triggered.
@@ -20113,7 +20123,7 @@
 
   /// The signature help context. This is only available if the client specifies
   /// to send this using the client capability
-  /// `textDocument.signatureHelp.contextSupport === true`
+  /// `textDocument.signatureHelp.contextSupport === true`.
   ///  @since 3.15.0
   final SignatureHelpContext context;
 
@@ -20268,7 +20278,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// List of characters that re-trigger signature help.
@@ -20891,7 +20901,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// How documents are synced to the server. See TextDocumentSyncKind.Full and
@@ -21594,7 +21604,6 @@
 
   /// The optional length of the range that got replaced.
   ///  @deprecated use range instead.
-  @core.deprecated
   final num rangeLength;
 
   /// The new text for the provided range.
@@ -22322,7 +22331,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   Map<String, dynamic> toJson() {
@@ -22389,8 +22398,8 @@
     return obj is num;
   }
 
-  /// Manually triggered, e.g. by the user pressing save, by starting debugging,
-  /// or by an API call.
+  /// Manually triggered, for example, by the user pressing save, by starting
+  /// debugging, or by an API call.
   static const Manual = TextDocumentSaveReason(1);
 
   /// Automatic after a delay.
@@ -22431,7 +22440,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The client is supposed to include the content on save.
@@ -22702,25 +22711,25 @@
   }
 
   /// Change notifications are sent to the server. See
-  /// TextDocumentSyncKind.None, TextDocumentSyncKind.Full and
-  /// TextDocumentSyncKind.Incremental. If omitted it defaults to
+  /// TextDocumentSyncKind.None, TextDocumentSyncKind.Full, and
+  /// TextDocumentSyncKind.Incremental. If omitted, it defaults to
   /// TextDocumentSyncKind.None.
   final TextDocumentSyncKind change;
 
-  /// Open and close notifications are sent to the server. If omitted open close
-  /// notification should not be sent.
+  /// Open and close notifications are sent to the server. If omitted, open
+  /// close notification should not be sent.
   final bool openClose;
 
-  /// If present save notifications are sent to the server. If omitted the
+  /// If present save notifications are sent to the server. If omitted, the
   /// notification should not be sent.
   final Either2<bool, SaveOptions> save;
 
-  /// If present will save notifications are sent to the server. If omitted the
+  /// If present will save notifications are sent to the server. If omitted, the
   /// notification should not be sent.
   final bool willSave;
 
   /// If present will save wait until requests are sent to the server. If
-  /// omitted the request should not be sent.
+  /// omitted, the request should not be sent.
   final bool willSaveWaitUntil;
 
   Map<String, dynamic> toJson() {
@@ -22942,7 +22951,7 @@
   }
 
   /// Whether implementation supports dynamic registration. If this is set to
-  /// `true` the client supports the new `TypeDefinitionRegistrationOptions`
+  /// `true`, the client supports the new ` TypeDefinitionRegistrationOptions`
   /// return value for the corresponding server capability as well.
   final bool dynamicRegistration;
 
@@ -23122,8 +23131,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// The position inside the text document.
@@ -23268,7 +23277,7 @@
   }
 
   /// A document selector to identify the scope of the registration. If set to
-  /// null the document selector provided on the client side will be used.
+  /// null, the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
@@ -23555,9 +23564,10 @@
 
   /// The version number of this document. If a versioned text document
   /// identifier is sent from the server to the client and the file is not open
-  /// in the editor (the server has not received an open notification before)
+  /// in the editor (the server has not received an open notification before),
   /// the server can send `null` to indicate that the version is known and the
-  /// content on disk is the master (as speced with document content ownership).
+  /// content on disk is the master (as specified with document content
+  /// ownership).
   ///
   /// The version number of a document will increase after each change,
   /// including undo/redo. The number doesn't need to be consecutive.
@@ -23795,8 +23805,8 @@
   }
 
   /// Controls if a cancel button should show to allow the user to cancel the
-  /// long running operation. Clients that don't support cancellation are
-  /// allowed to ignore the setting.
+  /// long running operation. Clients that don't support cancellation can ignore
+  /// the setting.
   final bool cancellable;
   final String kind;
 
@@ -24450,10 +24460,11 @@
         percentage: percentage);
   }
 
-  /// Controls enablement state of a cancel button. This property is only valid
-  /// if a cancel button got requested in the `WorkDoneProgressStart` payload.
+  /// Controls enablement state of a cancel button. T This property is only
+  /// valid if a cancel button is requested in the `WorkDoneProgressStart`
+  /// payload.
   ///
-  /// Clients that don't support cancellation or don't support control the
+  /// Clients that don't support cancellation or don't support controlling the
   /// button's enablement state are allowed to ignore the setting.
   final bool cancellable;
   final String kind;
@@ -24606,18 +24617,18 @@
   /// Holds changes to existing resources.
   final Map<String, List<TextEdit>> changes;
 
-  /// Depending on the client capability
-  /// `workspace.workspaceEdit.resourceOperations` document changes are either
-  /// an array of `TextDocumentEdit`s to express changes to n different text
-  /// documents where each text document edit addresses a specific version of a
-  /// text document. Or it can contain above `TextDocumentEdit`s mixed with
-  /// create, rename and delete file / folder operations.
+  /// The client capability `workspace.workspaceEdit.resourceOperations`
+  /// determines whether document changes are either an array of
+  /// `TextDocumentEdit`s to express changes to different text documents, where
+  /// each text document edit addresses a specific version of a text document,
+  /// or it can contains the above `TextDocumentEdit`s mixed with create,
+  /// rename, and delete file / folder operations.
   ///
   /// Whether a client supports versioned document edits is expressed via
   /// `workspace.workspaceEdit.documentChanges` client capability.
   ///
-  /// If a client neither supports `documentChanges` nor
-  /// `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
+  /// If a client doesn't support `documentChanges` or
+  /// `workspace.workspaceEdit.resourceOperations`, then only plain `TextEdit`s
   /// using the `changes` property are supported.
   final Either2<List<TextDocumentEdit>,
           List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
@@ -25384,8 +25395,8 @@
         partialResultToken: partialResultToken);
   }
 
-  /// An optional token that a server can use to report partial results (e.g.
-  /// streaming) to the client.
+  /// An optional token that a server can use to report partial results (for
+  /// example, streaming) to the client.
   final Either2<num, String> partialResultToken;
 
   /// A query string to filter symbols by. Clients may send an empty string here
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
index c7be4e9..4ea03d1 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
@@ -166,9 +166,6 @@
                   .trim()
               : item.detail,
           documentation: documentation,
-          // The deprecated field is deprecated, but we should still supply it
-          // for clients that have not adopted CompletionItemTags.
-          // ignore: deprecated_member_use_from_same_package
           deprecated: item.deprecated,
           preselect: item.preselect,
           sortText: item.sortText,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index 4ee1e1a..242c72f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -41,11 +41,7 @@
       }
       if (params.rootUri != null) {
         openWorkspacePaths.add(Uri.parse(params.rootUri).toFilePath());
-        // ignore: deprecated_member_use_from_same_package
       } else if (params.rootPath != null) {
-        // This is deprecated according to LSP spec, but we still want to support
-        // it in case older clients send us it.
-        // ignore: deprecated_member_use_from_same_package
         openWorkspacePaths.add(params.rootPath);
       }
     }
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 08e8739..b621c69 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -210,7 +210,7 @@
         commands: Commands.serverSupportedCommands,
         workDoneProgress: true,
       ),
-      workspaceSymbolProvider: true,
+      workspaceSymbolProvider: Either2<bool, WorkspaceSymbolOptions>.t1(true),
       workspace: ServerCapabilitiesWorkspace(
           workspaceFolders: WorkspaceFoldersServerCapabilities(
         supported: true,
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 94ff72b..e1591e8 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -441,7 +441,6 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere((c) => c.label == 'abcdefghij');
-    // ignore: deprecated_member_use_from_same_package
     expect(item.deprecated, isNull);
     // If the does not say it supports the deprecated flag, we should show
     // '(deprecated)' in the details.
@@ -467,7 +466,6 @@
     await openFile(mainFileUri, withoutMarkers(content));
     final res = await getCompletion(mainFileUri, positionFromMarker(content));
     final item = res.singleWhere((c) => c.label == 'abcdefghij');
-    // ignore: deprecated_member_use_from_same_package
     expect(item.deprecated, isTrue);
     // If the client says it supports the deprecated flag, we should not show
     // deprecated in the details.
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index a9f9ce5..3c8a5a2 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -327,9 +327,14 @@
     lines = _wrapLines(lines, (80 - 4 - buffer.totalIndent).clamp(0, 80));
     lines.forEach((l) => buffer.writeIndentedln('/// $l'.trim()));
   }
-  if (node.isDeprecated) {
-    buffer.writeIndentedln('@core.deprecated');
-  }
+  // Marking LSP-deprecated fields as deprecated in Dart results in a lot
+  // of warnings because we still often populate these fields for clients that
+  // may still be using them. This code is useful for enabling temporarily
+  // and reviewing which deprecated fields we should still support but isn't
+  // generally useful to keep enabled.
+  // if (node.isDeprecated) {
+  //   buffer.writeIndentedln('@core.deprecated');
+  // }
 }
 
 void _writeEnumClass(IndentableStringBuffer buffer, Namespace namespace) {
@@ -379,6 +384,10 @@
     ..outdent()
     ..writeIndentedln('}');
   namespace.members.whereType<Const>().forEach((cons) {
+    // We don't use any deprecated enum values, so ommit them entirely.
+    if (cons.isDeprecated) {
+      return;
+    }
     _writeDocCommentsAndAnnotations(buffer, cons);
     buffer.writeIndentedln(
         'static const ${_makeValidIdentifier(cons.name)} = ${namespace.name}$constructorName(${cons.valueAsLiteral});');
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 2998c8f..a265eb5 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -73,7 +73,7 @@
 /// Pattern to extract inline types from the `result: {xx, yy }` notes in the spec.
 /// Doesn't parse past full stops as some of these have english sentences tagged on
 /// the end that we don't want to parse.
-final _resultsInlineTypesPattern = RegExp(r'''\* result:[^\.]*({.*})''');
+final _resultsInlineTypesPattern = RegExp(r'''\* result:[^\.{}]*({[^\.`]*})''');
 
 Future<void> downloadSpec() async {
   final specResp = await http.get(specUri);
@@ -298,9 +298,10 @@
 
 /// Returns whether a script block should be parsed or not.
 bool shouldIncludeScriptBlock(String input) {
-  // We can't parse literal arrays, but this script block is just an example
-  // and not actually referenced anywhere.
-  if (input.trim() == r"export const EOL: string[] = ['\n', '\r\n', '\r'];") {
+  // Skip over some typescript blocks that are known sample code and not part
+  // of the LSP spec.
+  if (input.trim() == r"export const EOL: string[] = ['\n', '\r\n', '\r'];" ||
+      input.startsWith('textDocument.codeAction.resolveSupport =')) {
     return false;
   }
 
diff --git a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
index 4c8b08d..14ab9bc 100644
--- a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
+++ b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
@@ -10,8 +10,8 @@
 ---
 
 Copyright (c) Microsoft Corporation.
-
-All rights reserved.
+ 
+All rights reserved. 
 
 Distributed under the following terms:
 
@@ -32,11 +32,11 @@
 
 This document describes the 3.15.x version of the language server protocol. An implementation for node of the 3.15.x version of the protocol can be found [here](https://github.com/Microsoft/vscode-languageserver-node).
 
-**Note:** edits to this specification can be made via a pull request against this markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-15.md).
+**Note:** edits to this specification can be made via a pull request against this Markdown [document](https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-15.md).
 
 ## <a href="#whatIsNew" name="whatIsNew" class="anchor"> What's new in 3.15 </a>
 
-All new 3.15 features are tagged with a corresponding since version 3.15 text or in JSDoc using `@since 3.15.0` annotation. Major new feature are:
+All new 3.15 features are tagged with a corresponding since version 3.15 text or in JSDoc using `@since 3.15.0` annotation. Major new features are:
 
 - [general progress support](#progress), [work done progress](#workDoneProgress) and [partial result progress](#partialResults)
 - support for [selection ranges](#textDocument_selectionRange)
@@ -299,12 +299,12 @@
 	line: number;
 
 	/**
-	 * Character offset on a line in a document (zero-based). Assuming that the line is
-	 * represented as a string, the `character` value represents the gap between the
-	 * `character` and `character + 1`.
+	 * Character offset on a line in a document (zero-based). Assuming that the
+	 * line is represented as a string, the `character` value represents the gap
+	 * between the `character` and `character + 1`.
 	 *
-	 * If the character value is greater than the line length it defaults back to the
-	 * line length.
+	 * If the character value is greater than the line length it defaults back
+	 * to the line length.
 	 */
 	character: number;
 }
@@ -353,8 +353,8 @@
 	/**
 	 * Span of the origin of this link.
 	 *
-	 * Used as the underlined span for mouse interaction. Defaults to the word range at
-	 * the mouse position.
+	 * Used as the underlined span for mouse interaction.
+	 * Defaults to the word range at the mouse position.
 	 */
 	originSelectionRange?: Range;
 
@@ -364,15 +364,19 @@
 	targetUri: DocumentUri;
 
 	/**
-	 * The full target range of this link. If the target for example is a symbol then target range is the
-	 * range enclosing this symbol not including leading/trailing whitespace but everything else
-	 * like comments. This information is typically used to highlight the range in the editor.
+	 * The full target range of this link.
+	 * For example, if the target is a symbol, then target range is the range
+	 * enclosing this symbol not including leading/trailing whitespace but
+	 * everything else like comments.
+	 * This information is typically used to highlight the range in the editor.
 	 */
 	targetRange: Range;
 
 	/**
-	 * The range that should be selected and revealed when this link is being followed, e.g the name of a function.
-	 * Must be contained by the the `targetRange`. See also `DocumentSymbol#range`
+	 * The range that should be selected and revealed when this link is being
+	 * followed, for example, the name of a function.
+	 * Must be contained by the the `targetRange`.
+	 * See also `DocumentSymbol#range`
 	 */
 	targetSelectionRange: Range;
 }
@@ -459,8 +463,8 @@
     /**
      * Unused or unnecessary code.
      *
-     * Clients are allowed to render diagnostics with this tag faded out instead of having
-     * an error squiggle.
+     * Clients are allowed to render diagnostics with this tag faded out
+	 * instead of having an error squiggle.
      */
     export const Unnecessary: 1 = 1;
     /**
@@ -478,9 +482,9 @@
 
 ```typescript
 /**
- * Represents a related message and source code location for a diagnostic. This should be
- * used to point to code locations that cause or are related to a diagnostics, e.g when duplicating
- * a symbol in a scope.
+ * Represents a related message and source code location for a diagnostic.
+ * This should be used to point to code locations that cause or are related
+ * to a diagnostics, for example, when duplicating a symbol in a scope.
  */
 export interface DiagnosticRelatedInformation {
 	/**
@@ -681,18 +685,24 @@
 	changes?: { [uri: DocumentUri]: TextEdit[]; };
 
 	/**
-	 * Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes
-	 * are either an array of `TextDocumentEdit`s to express changes to n different text documents
-	 * where each text document edit addresses a specific version of a text document. Or it can contain
-	 * above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.
+	 * The client capability `workspace.workspaceEdit.resourceOperations`
+	 * determines whether document changes are either an array of
+	 * `TextDocumentEdit`s to express changes to different text documents,
+	 * where each text document edit addresses a specific version
+	 * of a text document, or it can contains the above `TextDocumentEdit`s
+	 * mixed with create, rename, and delete file / folder operations.
 	 *
 	 * Whether a client supports versioned document edits is expressed via
 	 * `workspace.workspaceEdit.documentChanges` client capability.
 	 *
-	 * If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then
-	 * only plain `TextEdit`s using the `changes` property are supported.
+	 * If a client doesn't support `documentChanges` or
+	 * `workspace.workspaceEdit.resourceOperations`, then only plain
+	 * `TextEdit`s using the `changes` property are supported.
 	 */
-	documentChanges?: (TextDocumentEdit[] | (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[]);
+	documentChanges?: (
+		TextDocumentEdit[] |
+		(TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[]
+	);
 }
 ```
 
@@ -753,13 +763,15 @@
 	export const Delete: ResourceOperationKind = 'delete';
 }
 
-export type FailureHandlingKind = 'abort' | 'transactional' | 'undo' | 'textOnlyTransactional';
+export type FailureHandlingKind = 'abort' | 'transactional' | 'undo'
+	| 'textOnlyTransactional';
 
 export namespace FailureHandlingKind {
 
 	/**
-	 * Applying the workspace change is simply aborted if one of the changes provided
-	 * fails. All operations executed before the failing operation stay executed.
+	 * Applying the workspace change is simply aborted if one of the changes
+	 * provided fails.
+	 * All operations executed before the failing operation stay executed.
 	 */
 	export const Abort: FailureHandlingKind = 'abort';
 
@@ -771,11 +783,13 @@
 
 
 	/**
-	 * If the workspace edit contains only textual file changes they are executed transactional.
-	 * If resource changes (create, rename or delete file) are part of the change the failure
-	 * handling strategy is abort.
+	 * If the workspace edit contains only textual file changes, they are
+	 * executed transactionally.
+	 * If resource changes (create, rename or delete file) are part of the
+	 * change, the failure handling strategy is abort.
 	 */
-	export const TextOnlyTransactional: FailureHandlingKind = 'textOnlyTransactional';
+	export const TextOnlyTransactional: FailureHandlingKind
+		= 'textOnlyTransactional';
 
 	/**
 	 * The client tries to undo the operations already executed. But there is no
@@ -894,14 +908,15 @@
 ```typescript
 interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
 	/**
-	 * The version number of this document. If a versioned text document identifier
-	 * is sent from the server to the client and the file is not open in the editor
-	 * (the server has not received an open notification before) the server can send
-	 * `null` to indicate that the version is known and the content on disk is the
-	 * master (as speced with document content ownership).
+	 * The version number of this document.
+	 * If a versioned text document identifier is sent from the server to the
+	 * client and the file is not open in the editor (the server has not
+	 * received an open notification before), the server can send `null` to
+	 * indicate that the version is known and the content on disk is the
+	 * master (as specified with document content ownership).
 	 *
-	 * The version number of a document will increase after each change, including
-	 * undo/redo. The number doesn't need to be consecutive.
+	 * The version number of a document will increase after each change,
+	 * including undo/redo. The number doesn't need to be consecutive.
 	 */
 	version: number | null;
 }
@@ -954,9 +969,13 @@
 	 * - `*` to match one or more characters in a path segment
 	 * - `?` to match on one character in a path segment
 	 * - `**` to match any number of path segments, including none
-	 * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
-	 * - `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-	 * - `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+	 * - `{}` to group conditions
+	 *   (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
+	 * - `[]` to declare a range of characters to match in a path segment
+	 *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+	 * - `[!...]` to negate a range of characters to match in a path segment
+	 *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`,
+	 *    but not `example.0`)
 	 */
 	pattern?: string;
 }
@@ -995,8 +1014,9 @@
  */
 export interface TextDocumentRegistrationOptions {
 	/**
-	 * A document selector to identify the scope of the registration. If set to null
-	 * the document selector provided on the client side will be used.
+	 * A document selector to identify the scope of the registration.
+	 * If set to null, the document selector provided on the client side
+	 * will be used.
 	 */
 	documentSelector: DocumentSelector | null;
 }
@@ -1004,7 +1024,7 @@
 
 #### <a href="#markupContent" name="markupContent" class="anchor"> MarkupContent </a>
 
- A `MarkupContent` literal represents a string value which content can be represented in different formats. Currently `plaintext` and `markdown` are supported formats. A `MarkupContent` is usually used in documentation properties of result literals like `CompletionItem` or `SignatureInformation`.
+ A `MarkupContent` literal represents a string value which content can be represented in different formats. Currently `plaintext` and `markdown` are supported formats. A `MarkupContent` is usually used in documentation properties of result literals like `CompletionItem` or `SignatureInformation`. If the format is `markdown` the content can contain fenced code blocks like in [GitHub issues](https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting)
 
 ```typescript
 /**
@@ -1028,13 +1048,14 @@
 export type MarkupKind = 'plaintext' | 'markdown';
 
 /**
- * A `MarkupContent` literal represents a string value which content is interpreted base on its
- * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
+ * A `MarkupContent` literal represents a string value, which content is
+ * interpreted base on its kind flag.
+ * Currently the protocol supports `plaintext` and `markdown` as markup kinds.
  *
- * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
- * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * If the kind is `markdown`, then the value can contain fenced code blocks
+ * like in GitHub issues.
  *
- * Here is an example how such a string can be constructed using JavaScript / TypeScript:
+ * An example how such a string is constructed using JavaScript / TypeScript:
  * ```typescript
  * let markdown: MarkdownContent = {
  *  kind: MarkupKind.Markdown,
@@ -1048,8 +1069,9 @@
  * };
  * ```
  *
- * *Please Note* that clients might sanitize the return markdown. A client could decide to
- * remove HTML from the markdown to avoid script execution.
+ * *Please Note* that clients might sanitize the returned Markdown.
+ * A client could decide to remove HTML from the Markdown to avoid
+ * script execution.
  */
 export interface MarkupContent {
 	/**
@@ -1089,8 +1111,8 @@
 
 	/**
 	 * Controls if a cancel button should show to allow the user to cancel the
-	 * long running operation. Clients that don't support cancellation are allowed
-	 * to ignore the setting.
+	 * long running operation.
+	 * Clients that don't support cancellation can ignore the setting.
 	 */
 	cancellable?: boolean;
 
@@ -1125,11 +1147,12 @@
 	kind: 'report';
 
 	/**
-	 * Controls enablement state of a cancel button. This property is only valid if a cancel
-	 * button got requested in the `WorkDoneProgressStart` payload.
+	 * Controls enablement state of a cancel button. T
+	 * This property is only valid if a cancel button is requested in
+	 * the `WorkDoneProgressStart` payload.
 	 *
-	 * Clients that don't support cancellation or don't support control the button's
-	 * enablement state are allowed to ignore the setting.
+	 * Clients that don't support cancellation or don't support controlling
+	 * the button's enablement state are allowed to ignore the setting.
 	 */
 	cancellable?: boolean;
 
@@ -1175,8 +1198,10 @@
 
 Work Done progress can be initiated in two different ways:
 
-1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal.
-1. by a server using the request `window/workDoneProgress/create`.
+1. by the sender of a request (mostly clients) using the predefined `workDoneToken` property in the requests parameter literal. The document will refer to this kind of progress as client initiated progress.
+1. by a server using the request `window/workDoneProgress/create`. The document will refer to this kind of progress as server initiated progress.
+
+###### <a href="#clientInitiatedProgress" name="clientInitiatedProgress" class="anchor">Client Initiated Progress </a>
 
 Consider a client sending a `textDocument/reference` request to a server and the client accepts work done progress reporting on that request. To signal this to the server the client would add a `workDoneToken` property to the reference request parameters. Something like this:
 
@@ -1197,6 +1222,17 @@
 }
 ```
 
+The corresponding type definition for the parameter property looks like this:
+
+```typescript
+export interface WorkDoneProgressParams {
+	/**
+	 * An optional token that a server can use to report work done progress.
+	 */
+	workDoneToken?: ProgressToken;
+}
+```
+
 A server uses the `workDoneToken` to report progress for the specific `textDocument/reference`. For the above request the `$/progress` notification params look like this:
 
 ```json
@@ -1212,13 +1248,9 @@
 }
 ```
 
-Server initiated work done progress works the same. The only difference is that the server requests a progress user interface using the `window/workDoneProgress/create` request providing a token that is afterwards used to report progress.
+There is no specific client capability signaling whether a client will send a progress token per request. The reason for this is that this is in many clients not a static aspect and might even change for every request instance for the same request type. So the capability is signal on every request instance by the presence of a `workDoneToken` property.
 
-##### <a href="#signalingWorkDoneProgressReporting" name="signalingWorkDoneProgressReporting" class="anchor"> Signaling Work Done Progress Reporting </a>
-
-To keep the protocol backwards compatible servers are only allowed to use work done progress reporting if the client signals corresponding support using the client capability `window.workDoneProgress`.
-
-To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal work done progress reporting in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows:
+To avoid that clients set up a progress monitor user interface before sending a request but the server doesn't actually report any progress a server needs to signal general work done progress reporting support in the corresponding server capability. For the above find references example a server would signal such a support by setting the `referencesProvider` property in the server capabilities as follows:
 
 ```json
 {
@@ -1228,28 +1260,31 @@
 }
 ```
 
-#### <a href="#workDoneProgressParams" name="workDoneProgressParams" class="anchor"> WorkDoneProgressParams </a>
-
-A parameter literal used to pass a work done progress token.
-
-```typescript
-export interface WorkDoneProgressParams {
-	/**
-	 * An optional token that a server can use to report work done progress.
-	 */
-	workDoneToken?: ProgressToken;
-}
-```
-
-#### <a href="#workDoneProgressOptions" name="workDoneProgressOptions" class="anchor"> WorkDoneProgressOptions </a>
-
-Options to signal work done progress support in server capabilities.
+The corresponding type definition for the server capability looks like this:
 
 ```typescript
 export interface WorkDoneProgressOptions {
 	workDoneProgress?: boolean;
 }
 ```
+###### <a href="#serverInitiatedProgress" name="serverInitiatedProgress" class="anchor">Server Initiated Progress </a>
+
+Servers can also initiate progress reporting using the `window/workDoneProgress/create` request. This is useful if the server needs to report progress outside of a request (for example the server needs to re-index a database). The returned token can then be used to report progress using the same notifications used as for client initiated progress.
+
+To keep the protocol backwards compatible servers are only allowed to use `window/workDoneProgress/create` request if the client signals corresponding support using the client capability `window.workDoneProgress` which is defined as follows:
+
+```typescript
+	/**
+	 * Window specific client capabilities.
+	 */
+	window?: {
+		/**
+		 * Whether client supports server initiated progress using the
+		 * `window/workDoneProgress/create` request.
+		 */
+		workDoneProgress?: boolean;
+	}
+```
 
 #### <a href="#partialResults" name="partialResults" class="anchor"> Partial Result Progress </a>
 
@@ -1292,8 +1327,8 @@
 ```typescript
 export interface PartialResultParams {
 	/**
-	 * An optional token that a server can use to report partial results (e.g. streaming) to
-	 * the client.
+	 * An optional token that a server can use to report partial results
+	 * (for example, streaming) to the client.
 	 */
 	partialResultToken?: ProgressToken;
 }
@@ -1307,7 +1342,7 @@
 * an optional _Client capability_ section describing the client capability of the request. This includes the client capabilities property path and JSON structure.
 * an optional _Server Capability_ section describing the server capability of the request. This includes the server capabilities property path and JSON structure.
 * a _Request_ section describing the format of the request sent. The method is a string identifying the request the params are documented using a TypeScript interface. It is also documented whether the request supports work done progress and partial result progress.
-* a _Response_ section describing the format of the response. The result item describes the returned data in case of a success. The optional partial result item describes the returned data of a partial result notification. The error.data describes the returned data in case of an error. Please remember that in case of a failure the response already contains an error.code and an error.message field. These fields are only spec'd if the protocol forces the use of certain error codes or messages. In cases where the server can decide on these values freely they aren't listed here.
+* a _Response_ section describing the format of the response. The result item describes the returned data in case of a success. The optional partial result item describes the returned data of a partial result notification. The error.data describes the returned data in case of an error. Please remember that in case of a failure the response already contains an error.code and an error.message field. These fields are only specified if the protocol forces the use of certain error codes or messages. In cases where the server can decide on these values freely they aren't listed here.
 * a _Registration Options_ section describing the registration option if the request or notification supports dynamic capability registration.
 
 #### Request, Notification and Response ordering
@@ -1338,9 +1373,10 @@
 ```typescript
 interface InitializeParams extends WorkDoneProgressParams {
 	/**
-	 * The process Id of the parent process that started
-	 * the server. Is null if the process has not been started by another process.
-	 * If the parent process is not alive then the server should exit (see exit notification) its process.
+	 * The process ID of the parent process that started the server.
+	 * Is null if the process has not been started by another process.
+	 * If the parent process is not alive, then the server should exit
+	 * (see exit notification) its process.
 	 */
 	processId: number | null;
 
@@ -1515,7 +1551,8 @@
 	rename?: RenameClientCapabilities;
 
 	/**
-	 * Capabilities specific to the `textDocument/publishDiagnostics` notification.
+	 * Capabilities specific to the `textDocument/publishDiagnostics`
+	 * notification.
 	 */
 	publishDiagnostics?: PublishDiagnosticsClientCapabilities;
 
@@ -1558,12 +1595,14 @@
 		workspaceEdit?: WorkspaceEditClientCapabilities;
 
 		/**
-		* Capabilities specific to the `workspace/didChangeConfiguration` notification.
+		* Capabilities specific to the `workspace/didChangeConfiguration`
+		* notification.
 		*/
 		didChangeConfiguration?: DidChangeConfigurationClientCapabilities;
 
 		/**
-		* Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+		* Capabilities specific to the `workspace/didChangeWatchedFiles`
+		* notification.
 		*/
 		didChangeWatchedFiles?: DidChangeWatchedFilesClientCapabilities;
 
@@ -1602,8 +1641,9 @@
 	 */
 	window?: {
 		/**
-		 * Whether client supports handling progress notifications. If set servers are allowed to
-		 * report in `workDoneProgress` property in the request specific server capabilities.
+		 * Whether client supports handling progress notifications.
+		 * If set, servers are allowed to report in `workDoneProgress` property
+		 * in the request specific server capabilities.
 		 *
 		 * Since 3.15.0
 		 */
@@ -1653,9 +1693,10 @@
  */
 export namespace InitializeError {
 	/**
-	 * If the protocol version provided by the client can't be handled by the server.
-	 * @deprecated This initialize error got replaced by client capabilities. There is
-	 * no version handshake in version 3.0x
+	 * If the protocol version provided by the client can't be handled by
+	 * the server.
+	 * @deprecated This initialize error was replaced by client capabilities.
+	 * There is no version handshake in version 3.0x
 	 */
 	export const unknownProtocolVersion: number = 1;
 }
@@ -1680,8 +1721,10 @@
 ```typescript
 interface ServerCapabilities {
 	/**
-	 * Defines how text documents are synced. Is either a detailed structure defining each notification or
-	 * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`.
+	 * Defines how text documents are synced.
+	 * Is either a detailed structure defining each notification
+	 * or for backwards compatibility, the TextDocumentSyncKind number.
+	 * If omitted, it defaults to `TextDocumentSyncKind.None`.
 	 */
 	textDocumentSync?: TextDocumentSyncOptions | number;
 
@@ -1705,7 +1748,8 @@
 	 *
 	 * @since 3.14.0
 	 */
-	declarationProvider?: boolean | DeclarationOptions | DeclarationRegistrationOptions;
+	declarationProvider?: boolean | DeclarationOptions
+		| DeclarationRegistrationOptions;
 
 	/**
 	 * The server provides goto definition support.
@@ -1717,14 +1761,16 @@
 	 *
 	 * @since 3.6.0
 	 */
-	typeDefinitionProvider?: boolean | TypeDefinitionOptions | TypeDefinitionRegistrationOptions;
+	typeDefinitionProvider?: boolean | TypeDefinitionOptions
+		| TypeDefinitionRegistrationOptions;
 
 	/**
 	 * The server provides goto implementation support.
 	 *
 	 * @since 3.6.0
 	 */
-	implementationProvider?: boolean | ImplementationOptions | ImplementationRegistrationOptions;
+	implementationProvider?: boolean | ImplementationOptions
+		| ImplementationRegistrationOptions;
 
 	/**
 	 * The server provides find references support.
@@ -1742,14 +1788,15 @@
 	documentSymbolProvider?: boolean | DocumentSymbolOptions;
 
 	/**
-	 * The server provides code actions. The `CodeActionOptions` return type is only
-	 * valid if the client signals code action literal support via the property
+	 * The server provides code actions.
+	 * The `CodeActionOptions` return type is only valid if the client signals
+	 * code action literal support via the property
 	 * `textDocument.codeAction.codeActionLiteralSupport`.
 	 */
 	codeActionProvider?: boolean | CodeActionOptions;
 
 	/**
-	 * The server provides code lens.
+	 * The server provides CodeLens.
 	 */
 	codeLensProvider?: CodeLensOptions;
 
@@ -1763,7 +1810,8 @@
 	 *
 	 * @since 3.6.0
 	 */
-	colorProvider?: boolean | DocumentColorOptions | DocumentColorRegistrationOptions;
+	colorProvider?: boolean | DocumentColorOptions
+		| DocumentColorRegistrationOptions;
 
 	/**
 	 * The server provides document formatting.
@@ -1792,7 +1840,8 @@
 	 *
 	 * @since 3.10.0
 	 */
-	foldingRangeProvider?: boolean | FoldingRangeOptions | FoldingRangeRegistrationOptions;
+	foldingRangeProvider?: boolean | FoldingRangeOptions
+		| FoldingRangeRegistrationOptions;
 
 	/**
 	 * The server provides execute command support.
@@ -1804,12 +1853,13 @@
 	 *
 	 * @since 3.15.0
 	 */
-	selectionRangeProvider?: boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions;
+	selectionRangeProvider?: boolean | SelectionRangeOptions
+		| SelectionRangeRegistrationOptions;
 
 	/**
 	 * The server provides workspace symbol support.
 	 */
-	workspaceSymbolProvider?: boolean;
+	workspaceSymbolProvider?: boolean | WorkspaceSymbolOptions;
 
 	/**
 	 * Workspace specific server capabilities
@@ -2279,7 +2329,7 @@
 
 The `workspace/configuration` request is sent from the server to the client to fetch configuration settings from the client. The request can fetch several configuration settings in one roundtrip. The order of the returned configuration settings correspond to the order of the passed `ConfigurationItems` (e.g. the first item in the response is the result for the first configuration item in the params).
 
-A `ConfigurationItem` consists of the configuration section to ask for and an additional scope URI. The configuration section ask for is defined by the server and doesn't necessarily need to correspond to the configuration store used be the client. So a server might ask for a configuration `cpp.formatterOptions` but the client stores the configuration in a XML store layout differently. It is up to the client to do the necessary conversion. If a scope URI is provided the client should return the setting scoped to the provided resource. If the client for example uses [EditorConfig](http://editorconfig.org/) to manage its settings the configuration should be returned for the passed resource URI. If the client can't provide a configuration setting for a given scope then `null` need to be present in the returned array.
+A `ConfigurationItem` consists of the configuration section to ask for and an additional scope URI. The configuration section asked for is defined by the server and doesn't necessarily need to correspond to the configuration store used by the client. So a server might ask for a configuration `cpp.formatterOptions` but the client stores the configuration in an XML store layout differently. It is up to the client to do the necessary conversion. If a scope URI is provided the client should return the setting scoped to the provided resource. If the client for example uses [EditorConfig](http://editorconfig.org/) to manage its settings the configuration should be returned for the passed resource URI. If the client can't provide a configuration setting for a given scope then `null` needs to be present in the returned array.
 
 _Client Capability_:
 * property path (optional): `workspace.configuration`
@@ -2329,9 +2379,9 @@
 ```typescript
 export interface DidChangeWatchedFilesClientCapabilities {
 	/**
-	 * Did change watched files notification supports dynamic registration. Please note
-	 * that the current protocol doesn't support static configuration for file changes
-	 * from the server side.
+	 * Did change watched files notification supports dynamic registration.
+	 * Please note that the current protocol doesn't support static
+	 * configuration for file changes from the server side.
 	 */
 	dynamicRegistration?: boolean;
 }
@@ -2357,9 +2407,13 @@
 	 * - `*` to match one or more characters in a path segment
 	 * - `?` to match on one character in a path segment
 	 * - `**` to match any number of path segments, including none
-	 * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files)
-	 * - `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-	 * - `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`)
+	 * - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
+	 *   and JavaScript files)
+	 * - `[]` to declare a range of characters to match in a path segment
+	 *   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+	 * - `[!...]` to negate a range of characters to match in a path segment
+	 *   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`,
+	 *    but not `example.0`)
 	 */
 	globPattern: string;
 
@@ -2454,7 +2508,8 @@
 	dynamicRegistration?: boolean;
 
 	/**
-	 * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
+	 * Specific capabilities for the `SymbolKind` in the
+	 * `workspace/symbol` request.
 	 */
 	symbolKind?: {
 		/**
@@ -2483,7 +2538,8 @@
 
 _Registration Options_: `WorkspaceSymbolRegistrationOptions` defined as follows:
 ```typescript
-export interface WorkspaceSymbolRegistrationOptions extends WorkspaceSymbolOptions {
+export interface WorkspaceSymbolRegistrationOptions
+	extends WorkspaceSymbolOptions {
 }
 ```
 
@@ -2495,7 +2551,8 @@
 /**
  * The parameters of a Workspace Symbol Request.
  */
-interface WorkspaceSymbolParams extends WorkDoneProgressParams, PartialResultParams {
+interface WorkspaceSymbolParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * A query string to filter symbols by. Clients may send an empty
 	 * string here to request all symbols.
@@ -2546,7 +2603,8 @@
 /**
  * Execute command registration options.
  */
-export interface ExecuteCommandRegistrationOptions extends ExecuteCommandOptions {
+export interface ExecuteCommandRegistrationOptions
+	extends ExecuteCommandOptions {
 }
 ```
 
@@ -2627,21 +2685,22 @@
 
 #### <a href="#textDocument_synchronization" name="textDocument_synchronization" class="anchor">Text Document Synchronization</a>
 
-Client support for `textDocument/open`, `textDocument/change` and `textDocument/close` notifications is mandatory in the protocol and clients can not opt out supporting them. This includes both full and incremental syncronization in the `textDocument/change` notification. In addition a server must either implement all three of them or none. Their capabilities are therefore controlled via a combined client and server capability.
+Client support for `textDocument/didOpen`, `textDocument/didChange` and `textDocument/didClose` notifications is mandatory in the protocol and clients can not opt out supporting them. This includes both full and incremental synchronization in the `textDocument/didChange` notification. In addition a server must either implement all three of them or none. Their capabilities are therefore controlled via a combined client and server capability.
 
-<a href="#textDocument_synchronization_cc" name="textDocument_synchronization_cc" class="anchor"></a>_Client Capability_:
+<a href="#textDocument_synchronization_cc" name="textDocument_synchronization_cc" class="anchor">_Client Capability_:</a>
 * property path (optional): `textDocument.synchronization.dynamicRegistration`
 * property type: `boolean`
 
 Controls whether text document synchronization supports dynamic registration.
 
-<a href="#textDocument_synchronization_sc" name="textDocument_synchronization_sc" class="anchor"></a>_Server Capability_:
+<a href="#textDocument_synchronization_sc" name="textDocument_synchronization_sc" class="anchor">_Server Capability_:</a>
 * property path (optional): `textDocumentSync`
 * property type: `TextDocumentSyncKind | TextDocumentSyncOptions`. The below definition of the `TextDocumentSyncOptions` only covers the properties specific to the open, change and close notifications. A complete definition covering all properties can be found [here](#textDocument_didClose):
 
 ```typescript
 /**
- * Defines how the host (editor) should sync document changes to the language server.
+ * Defines how the host (editor) should sync document changes
+ * to the language server.
  */
 export namespace TextDocumentSyncKind {
 	/**
@@ -2665,14 +2724,16 @@
 
 export interface TextDocumentSyncOptions {
 	/**
-	 * Open and close notifications are sent to the server. If omitted open close notification should not
-	 * be sent.
+	 * Open and close notifications are sent to the server.
+	 * If omitted open close notification should not be sent.
 	 */
 	openClose?: boolean;
 
 	/**
-	 * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
-	 * and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None.
+	 * Change notifications are sent to the server.
+	 * See TextDocumentSyncKind.None, TextDocumentSyncKind.Full,
+	 * and TextDocumentSyncKind.Incremental.
+	 * If omitted, it defaults to TextDocumentSyncKind.None.
 	 */
 	change?: TextDocumentSyncKind;
 }
@@ -2720,7 +2781,8 @@
 /**
  * Describe options to be used when registering for text document change events.
  */
-export interface TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {
+export interface TextDocumentChangeRegistrationOptions
+	extends TextDocumentRegistrationOptions {
 	/**
 	 * How documents are synced to the server. See TextDocumentSyncKind.Full
 	 * and TextDocumentSyncKind.Incremental.
@@ -2743,24 +2805,28 @@
 	textDocument: VersionedTextDocumentIdentifier;
 
 	/**
-	 * The actual content changes. The content changes describe single state changes
-	 * to the document. So if there are two content changes c1 (at array index 0) and
-	 * c2 (at array index 1) for a document in state S then c1 moves the document from
-	 * S to S' and c2 from S' to S''. So c1 is computed on the state S and c2 is computed
-	 * on the state S'.
+	 * The actual content changes.
+	 * The content changes describe single state changes to the document.
+	 * If there are two content changes c1 (at array index 0) and
+	 * c2 (at array index 1) for a document in state S, then c1 moves the
+	 * document from S to S' and c2 from S' to S''.
+	 * So c1 is computed on the state S and c2 is computed on the state S'.
 	 *
-	 * To mirror the content of a document using change events use the following approach:
+	 * To mirror the content of a document using change events,
+	 * use the following approach:
 	 * - start with the same initial content
-	 * - apply the 'textDocument/didChange' notifications in the order you recevie them.
-	 * - apply the `TextDocumentContentChangeEvent`s in a single notification in the order
-	 *   you receive them.
+	 * - apply the 'textDocument/didChange' notifications
+	 *     in the order you receive them.
+	 * - apply the `TextDocumentContentChangeEvent`s
+	 *     in a single notification in the order you receive them.
 	 */
 	contentChanges: TextDocumentContentChangeEvent[];
 }
 
 /**
- * An event describing a change to a text document. If range and rangeLength are omitted
- * the new text is considered to be the full content of the document.
+ * An event describing a change to a text document.
+ * If range and rangeLength are omitted, the new text is considered to be
+ * the full content of the document.
  */
 export type TextDocumentContentChangeEvent = {
 	/**
@@ -2831,8 +2897,8 @@
 export namespace TextDocumentSaveReason {
 
 	/**
-	 * Manually triggered, e.g. by the user pressing save, by starting debugging,
-	 * or by an API call.
+	 * Manually triggered, for example, by the user pressing save,
+	 * by starting debugging, or by an API call.
 	 */
 	export const Manual = 1;
 
@@ -2901,7 +2967,8 @@
 
 _Registration Options_: `TextDocumentSaveRegistrationOptions` defined as follows:
 ```typescript
-export interface TextDocumentSaveRegistrationOptions extends TextDocumentRegistrationOptions {
+export interface TextDocumentSaveRegistrationOptions
+	extends TextDocumentRegistrationOptions {
 	/**
 	 * The client is supposed to include the content on save.
 	 */
@@ -2981,7 +3048,8 @@
 }
 
 /**
- * Defines how the host (editor) should sync document changes to the language server.
+ * Defines how the host (editor) should sync document changes
+ * to the language server.
  */
 export namespace TextDocumentSyncKind {
 	/**
@@ -3005,28 +3073,30 @@
 
 export interface TextDocumentSyncOptions {
 	/**
-	 * Open and close notifications are sent to the server. If omitted open close notification should not
-	 * be sent.
+	 * Open and close notifications are sent to the server.
+	 * If omitted, open close notification should not be sent.
 	 */
 	openClose?: boolean;
 	/**
-	 * Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
-	 * and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None.
+	 * Change notifications are sent to the server.
+	 * See TextDocumentSyncKind.None, TextDocumentSyncKind.Full,
+	 * and TextDocumentSyncKind.Incremental.
+	 * If omitted, it defaults to TextDocumentSyncKind.None.
 	 */
 	change?: number;
 	/**
-	 * If present will save notifications are sent to the server. If omitted the notification should not be
-	 * sent.
+	 * If present will save notifications are sent to the server.
+	 * If omitted, the notification should not be sent.
 	 */
 	willSave?: boolean;
 	/**
-	 * If present will save wait until requests are sent to the server. If omitted the request should not be
-	 * sent.
+	 * If present will save wait until requests are sent to the server.
+	 * If omitted, the request should not be sent.
 	 */
 	willSaveWaitUntil?: boolean;
 	/**
-	 * If present save notifications are sent to the server. If omitted the notification should not be
-	 * sent.
+	 * If present save notifications are sent to the server.
+	 * If omitted, the notification should not be sent.
 	 */
 	save?: boolean | SaveOptions;
 }
@@ -3091,8 +3161,8 @@
 	uri: DocumentUri;
 
 	/**
-	 * Optional the version number of the document the diagnostics are published for.
-	 *
+	 * The version number of the document the diagnostics are published for.
+	 * Optional.
 	 * @since 3.15.0
 	 */
 	version?: number;
@@ -3106,7 +3176,7 @@
 
 #### <a href="#textDocument_completion" name="textDocument_completion" class="anchor">Completion Request (:leftwards_arrow_with_hook:)</a>
 
-The Completion request is sent from the client to the server to compute completion items at a given cursor position. Completion items are presented in the [IntelliSense](https://code.visualstudio.com/docs/editor/editingevolved#_intellisense) user interface. If computing full completion items is expensive, servers can additionally provide a handler for the completion item resolve request ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A typical use case is for example: the 'textDocument/completion' request doesn't fill in the `documentation` property for returned completion items since it is expensive to compute. When the item is selected in the user interface then a 'completionItem/resolve' request is sent with the selected completion item as a parameter. The returned completion item should have the documentation property filled in. The request can only delay the computation of the `detail` and `documentation` properties. Other properties like `sortText`, `filterText`, `insertText`, `textEdit` and `additionalTextEdits` must be provided in the `textDocument/completion` response and must not be changed during resolve.
+The Completion request is sent from the client to the server to compute completion items at a given cursor position. Completion items are presented in the [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense. If computing full completion items is expensive, servers can additionally provide a handler for the completion item resolve request ('completionItem/resolve'). This request is sent when a completion item is selected in the user interface. A typical use case is for example: the 'textDocument/completion' request doesn't fill in the `documentation` property for returned completion items since it is expensive to compute. When the item is selected in the user interface then a 'completionItem/resolve' request is sent with the selected completion item as a parameter. The returned completion item should have the documentation property filled in. The request can only delay the computation of the `detail` and `documentation` properties. Other properties like `sortText`, `filterText`, `insertText`, `textEdit` and `additionalTextEdits` must be provided in the `textDocument/completion` response and must not be changed during resolve.
 
 _Client Capability_:
 * property name (optional): `textDocument.completion`
@@ -3129,8 +3199,9 @@
 		 *
 		 * A snippet can define tab stops and placeholders with `$1`, `$2`
 		 * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
-		 * the end of the snippet. Placeholders with equal identifiers are linked,
-		 * that is typing in one will update others too.
+		 * the end of the snippet.
+		 * Placeholders with equal identifiers are linked, so that typing in
+		 * one will update others as well.
 		 */
 		snippetSupport?: boolean;
 
@@ -3156,10 +3227,10 @@
 		preselectSupport?: boolean;
 
 		/**
-		 * Client supports the tag property on a completion item. Clients supporting
-		 * tags have to handle unknown tags gracefully. Clients especially need to
-		 * preserve unknown tags when sending a completion item back to the server in
-		 * a resolve call.
+		 * Client supports the tag property on a completion item.
+		 * Clients supporting tags have to handle unknown tags gracefully.
+		 * Clients especially need to preserve unknown tags when sending
+		 * a completion item back to the server in a resolve call.
 		 *
 		 * @since 3.15.0
 		 */
@@ -3203,24 +3274,28 @@
  */
 export interface CompletionOptions extends WorkDoneProgressOptions {
 	/**
-	 * Most tools trigger completion request automatically without explicitly requesting
-	 * it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
-	 * starts to type an identifier. For example if the user types `c` in a JavaScript file
-	 * code complete will automatically pop up present `console` besides others as a
-	 * completion item. Characters that make up identifiers don't need to be listed here.
+	 * Most tools trigger completion request automatically without explicitly
+	 * requesting it using a keyboard shortcut (for example Ctrl+Space).
+	 * Typically they do so when the user starts to type an identifier.
+	 * For example, if the user types `c` in a JavaScript file, code complete
+	 * will automatically display `console` along with others as a
+	 * completion item.
+	 * Characters that make up identifiers don't need to be listed here.
 	 *
-	 * If code complete should automatically be trigger on characters not being valid inside
-	 * an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
+	 * If code complete should automatically be triggered on characters
+	 * not being valid inside an identifier (for example `.` in JavaScript),
+	 * list them in `triggerCharacters`.
 	 */
 	triggerCharacters?: string[];
 
 	/**
-	 * The list of all possible characters that commit a completion. This field can be used
-	 * if clients don't support individual commit characters per completion item. See
-	 * `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`.
+	 * The list of all possible characters that commit a completion.
+	 * This field can be used if clients don't support individual commit
+	 * characters per completion item. See `ClientCapabilities.`
+	 * `textDocument.completion.completionItem.commitCharactersSupport`.
 	 *
-	 * If a server provides both `allCommitCharacters` and commit characters on an individual
-	 * completion item the ones on the completion item win.
+	 * If a server provides both `allCommitCharacters` and commit characters
+	 * on an individual completion item, the ones on the completion item win.
 	 *
 	 * @since 3.2.0
 	 */
@@ -3236,7 +3311,8 @@
 
 _Registration Options_: `CompletionRegistrationOptions` options defined as follows:
 ```typescript
-export interface CompletionRegistrationOptions extends TextDocumentRegistrationOptions, CompletionOptions {
+export interface CompletionRegistrationOptions
+	extends TextDocumentRegistrationOptions, CompletionOptions {
 }
 ```
 
@@ -3245,10 +3321,13 @@
 * params: `CompletionParams` defined as follows:
 
 ```typescript
-export interface CompletionParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface CompletionParams
+	extends TextDocumentPositionParams, WorkDoneProgressParams,
+	PartialResultParams {
 	/**
-	 * The completion context. This is only available if the client specifies
-	 * to send this using `ClientCapabilities.textDocument.completion.contextSupport === true`
+	 * The completion context.
+	 * This is only available if the client specifies to send this using
+	 * `ClientCapabilities.textDocument.completion.contextSupport === true`
 	 */
 	context?: CompletionContext;
 }
@@ -3265,7 +3344,7 @@
 
 	/**
 	 * Completion was triggered by a trigger character specified by
-	 * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+	 * the `triggerCharacters` properties of `CompletionRegistrationOptions`.
 	 */
 	export const TriggerCharacter: 2 = 2;
 
@@ -3278,7 +3357,8 @@
 
 
 /**
- * Contains additional information about the context in which a completion request is triggered.
+ * Contains additional information about the context in which a completion
+ * request is triggered.
  */
 export interface CompletionContext {
 	/**
@@ -3287,7 +3367,7 @@
 	triggerKind: CompletionTriggerKind;
 
 	/**
-	 * The trigger character (a single character) that has trigger code complete.
+	 * The trigger character (single character) that has trigger code complete.
 	 * Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
 	 */
 	triggerCharacter?: string;
@@ -3299,8 +3379,8 @@
 
 ```typescript
 /**
- * Represents a collection of [completion items](#CompletionItem) to be presented
- * in the editor.
+ * Represents a collection of [completion items](#CompletionItem) to be
+ * presented in the editor.
  */
 export interface CompletionList {
 	/**
@@ -3339,8 +3419,8 @@
 export type InsertTextFormat = 1 | 2;
 
 /**
- * Completion item tags are extra annotations that tweak the rendering of a completion
- * item.
+ * Completion item tags are extra annotations that tweak the rendering of
+ * a completion item.
  *
  * @since 3.15.0
  */
@@ -3419,52 +3499,56 @@
 	 * this completion. When `falsy` the label is used.
 	 *
 	 * The `insertText` is subject to interpretation by the client side.
-	 * Some tools might not take the string literally. For example
-	 * VS Code when code complete is requested in this example `con<cursor position>`
-	 * and a completion item with an `insertText` of `console` is provided it
-	 * will only insert `sole`. Therefore it is recommended to use `textEdit` instead
-	 * since it avoids additional client side interpretation.
+	 * Some tools might not take the string literally.
+	 * For example, VS Code when code complete is requested in this example
+	 * `con<cursor position>` and a completion item with an `insertText` of
+	 * `console` is provided, it will only insert `sole`.
+	 * Therefore, it is recommended to use `textEdit` instead since it avoids
+	 * additional client side interpretation.
 	 */
 	insertText?: string;
 
 	/**
-	 * The format of the insert text. The format applies to both the `insertText` property
-	 * and the `newText` property of a provided `textEdit`. If omitted defaults to
-	 * `InsertTextFormat.PlainText`.
+	 * The format of the insert text.
+	 * The format applies to both the `insertText` property and the `newText`
+	 * property of a provided `textEdit`.
+	 * If omitted, defaults to `InsertTextFormat.PlainText`.
 	 */
 	insertTextFormat?: InsertTextFormat;
 
 	/**
-	 * An edit which is applied to a document when selecting this completion. When an edit is provided the value of
-	 * `insertText` is ignored.
+	 * An edit that is applied to a document when selecting this completion.
+	 * When an edit is provided, the value of `insertText` is ignored.
 	 *
-	 * *Note:* The range of the edit must be a single line range and it must contain the position at which completion
-	 * has been requested.
+	 * *Note:* The range of the edit must be a single line range and it must
+	 * contain the position at which completion has been requested.
 	 */
 	textEdit?: TextEdit;
 
 	/**
 	 * An optional array of additional text edits that are applied when
-	 * selecting this completion. Edits must not overlap (including the same insert position)
-	 * with the main edit nor with themselves.
+	 * selecting this completion.
+	 * Edits must not overlap (including the same insert position) with the
+	 * main edit nor with themselves.
 	 *
-	 * Additional text edits should be used to change text unrelated to the current cursor position
-	 * (for example adding an import statement at the top of the file if the completion item will
-	 * insert an unqualified type).
+	 * Additional text edits should be used to change text unrelated to the
+	 * current cursor position (for example adding an import statement at the
+	 * top of the file if the completion item will insert an unqualified type).
 	 */
 	additionalTextEdits?: TextEdit[];
 
 	/**
-	 * An optional set of characters that when pressed while this completion is active will accept it first and
-	 * then type that character. *Note* that all commit characters should have `length=1` and that superfluous
-	 * characters will be ignored.
+	 * An optional set of characters that when pressed, while this completion
+	 * is active, will accept it first and then type that character.
+	 * *Note* that all commit characters should have `length=1` and that
+	 * superfluous characters will be ignored.
 	 */
 	commitCharacters?: string[];
 
 	/**
-	 * An optional command that is executed *after* inserting this completion. *Note* that
-	 * additional modifications to the current document should be described with the
-	 * additionalTextEdits-property.
+	 * An optional command that is executed *after* inserting this completion.
+	 * *Note* that additional modifications to the current document should be
+	 * described with the additionalTextEdits-property.
 	 */
 	command?: Command;
 
@@ -3637,7 +3721,8 @@
 
 _Registration Options_: `HoverRegistrationOptions` defined as follows:
 ```typescript
-export interface HoverRegistrationOptions extends TextDocumentRegistrationOptions, HoverOptions {
+export interface HoverRegistrationOptions
+	extends TextDocumentRegistrationOptions, HoverOptions {
 }
 ```
 
@@ -3646,7 +3731,8 @@
 * params: `HoverParams` defined as follows:
 
 ```typescript
-export interface HoverParams extends TextDocumentPositionParams, WorkDoneProgressParams {
+export interface HoverParams
+	extends TextDocumentPositionParams, WorkDoneProgressParams {
 }
 ```
 
@@ -3675,17 +3761,17 @@
 
 ```typescript
 /**
- * MarkedString can be used to render human readable text. It is either a markdown string
- * or a code-block that provides a language and a code snippet. The language identifier
- * is semantically equal to the optional language identifier in fenced code blocks in GitHub
- * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ * MarkedString can be used to render human readable text.
+ * It is either a Markdown string or a code-block that provides a language
+ * and a code snippet. The language identifier is semantically equal to the
+ * optional language identifier in fenced code blocks in GitHub issues.
  *
- * The pair of a language and a value is an equivalent to markdown:
+ * The pair of a language and a value is an equivalent to Markdown:
  * ```${language}
  * ${value}
  * ```
  *
- * Note that markdown strings will be sanitized - that means html will be escaped.
+ * Note that Markdown strings will be sanitized, meaning HTML will be escaped.
 * @deprecated use MarkupContent instead.
 */
 type MarkedString = string | { language: string; value: string };
@@ -3760,8 +3846,9 @@
 	/**
 	 * List of characters that re-trigger signature help.
 	 *
-	 * These trigger characters are only active when signature help is already showing. All trigger characters
-	 * are also counted as re-trigger characters.
+	 * These trigger characters are only active when signature help is already
+	 * showing.
+	 * All trigger characters are also counted as re-trigger characters.
 	 *
 	 * @since 3.15.0
 	 */
@@ -3771,7 +3858,8 @@
 
 _Registration Options_: `SignatureHelpRegistrationOptions` defined as follows:
 ```typescript
-export interface SignatureHelpRegistrationOptions extends TextDocumentRegistrationOptions, SignatureHelpOptions {
+export interface SignatureHelpRegistrationOptions
+	extends TextDocumentRegistrationOptions, SignatureHelpOptions {
 }
 ```
 
@@ -3780,10 +3868,12 @@
 * params: `SignatureHelpParams` defined as follows:
 
 ```typescript
-export interface SignatureHelpParams extends TextDocumentPositionParams, WorkDoneProgressParams {
+export interface SignatureHelpParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams {
 	/**
-	 * The signature help context. This is only available if the client specifies
-	 * to send this using the client capability  `textDocument.signatureHelp.contextSupport === true`
+	 * The signature help context.
+	 * This is only available if the client specifies to send this using the
+	 * client capability `textDocument.signatureHelp.contextSupport === true`.
 	 *
 	 * @since 3.15.0
 	 */
@@ -3805,14 +3895,16 @@
 	 */
 	export const TriggerCharacter: 2 = 2;
 	/**
-	 * Signature help was triggered by the cursor moving or by the document content changing.
+	 * Signature help was triggered by the cursor moving or
+	 * by the document content changing.
 	 */
 	export const ContentChange: 3 = 3;
 }
 export type SignatureHelpTriggerKind = 1 | 2 | 3;
 
 /**
- * Additional information about the context in which a signature help request was triggered.
+ * Additional information about the context in which a
+ * signature help request was triggered.
  *
  * @since 3.15.0
  */
@@ -3825,23 +3917,25 @@
 	/**
 	 * Character that caused signature help to be triggered.
 	 *
-	 * This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`
+	 * This is undefined when
+	 * `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`.
 	 */
 	triggerCharacter?: string;
 
 	/**
 	 * `true` if signature help was already showing when it was triggered.
 	 *
-	 * Retriggers occur when the signature help is already active and can be caused by actions such as
-	 * typing a trigger character, a cursor move, or document content changes.
+	 * Retriggers occur when the signature help is already active and can be
+	 * caused by actions such as typing a trigger character, a cursor move,
+	 * or document content changes.
 	 */
 	isRetrigger: boolean;
 
 	/**
 	 * The currently active `SignatureHelp`.
 	 *
-	 * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on
-	 * the user navigating through available signatures.
+	 * The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field
+	 * updated based on the user navigating through available signatures.
 	 */
 	activeSignatureHelp?: SignatureHelp;
 }
@@ -3858,7 +3952,7 @@
  */
 export interface SignatureHelp {
 	/**
-	 * One or more signatures. If no signaures are availabe the signature help
+	 * One or more signatures. If no signatures are available the signature help
 	 * request should return `null`.
 	 */
 	signatures: SignatureInformation[];
@@ -3921,12 +4015,14 @@
 	/**
 	 * The label of this parameter information.
 	 *
-	 * Either a string or an inclusive start and exclusive end offsets within its containing
-	 * signature label. (see SignatureInformation.label). The offsets are based on a UTF-16
-	 * string representation as `Position` and `Range` does.
+	 * Either a string or an inclusive start and exclusive end offsets within
+	 * its containing signature label. (see SignatureInformation.label).
+	 * The offsets are based on a UTF-16 string representation
+	 * as `Position` and `Range` does.
 	 *
-	 * *Note*: a label of type string should be a substring of its containing signature label.
-	 * Its intended use case is to highlight the parameter label part in the `SignatureInformation.label`.
+	 * *Note*: a label of type string should be a substring of its containing
+	 * signature label. Its intended use case is to highlight the
+	 * parameter label part in the `SignatureInformation.label`.
 	 */
 	label: string | [number, number];
 
@@ -3955,9 +4051,10 @@
 ```typescript
 export interface DeclarationClientCapabilities {
 	/**
-	 * Whether declaration supports dynamic registration. If this is set to `true`
-	 * the client supports the new `DeclarationRegistrationOptions` return value
-	 * for the corresponding server capability as well.
+	 * Whether declaration supports dynamic registration.
+	 * If this is set to `true`, the client supports the new
+	 * `DeclarationRegistrationOptions` return value for the
+	 * corresponding server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 
@@ -3979,7 +4076,8 @@
 
 _Registration Options_: `DeclarationRegistrationOptions` defined as follows:
 ```typescript
-export interface DeclarationRegistrationOptions extends DeclarationOptions, TextDocumentRegistrationOptions, StaticRegistrationOptions  {
+export interface DeclarationRegistrationOptions extends DeclarationOptions,
+	TextDocumentRegistrationOptions, StaticRegistrationOptions  {
 }
 ```
 
@@ -3988,7 +4086,8 @@
 * params: `DeclarationParams` defined as follows:
 
 ```typescript
-export interface DeclarationParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface DeclarationParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
 }
 ```
 
@@ -4034,7 +4133,8 @@
 
 _Registration Options_: `DefinitionRegistrationOptions` defined as follows:
 ```typescript
-export interface DefinitionRegistrationOptions extends TextDocumentRegistrationOptions, DefinitionOptions {
+export interface DefinitionRegistrationOptions
+	extends TextDocumentRegistrationOptions, DefinitionOptions {
 }
 ```
 
@@ -4043,7 +4143,9 @@
 * params: `DefinitionParams` defined as follows:
 
 ```typescript
-export interface DefinitionParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface DefinitionParams
+	extends TextDocumentPositionParams, WorkDoneProgressParams,
+		PartialResultParams {
 }
 ```
 
@@ -4067,9 +4169,10 @@
 ```typescript
 export interface TypeDefinitionClientCapabilities {
 	/**
-	 * Whether implementation supports dynamic registration. If this is set to `true`
-	 * the client supports the new `TypeDefinitionRegistrationOptions` return value
-	 * for the corresponding server capability as well.
+	 * Whether implementation supports dynamic registration.
+	 * If this is set to `true`, the client supports the new `
+	 * TypeDefinitionRegistrationOptions` return value for the
+	 * corresponding server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 
@@ -4093,7 +4196,9 @@
 
 _Registration Options_: `TypeDefinitionRegistrationOptions` defined as follows:
 ```typescript
-export interface TypeDefinitionRegistrationOptions extends TextDocumentRegistrationOptions, TypeDefinitionOptions, StaticRegistrationOptions {
+export interface TypeDefinitionRegistrationOptions
+	extends TextDocumentRegistrationOptions, TypeDefinitionOptions,
+		StaticRegistrationOptions {
 }
 ```
 
@@ -4102,7 +4207,9 @@
 * params: `TypeDefinitionParams` defined as follows:
 
 ```typescript
-export interface TypeDefinitionParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface TypeDefinitionParams
+	extends TextDocumentPositionParams, WorkDoneProgressParams,
+		PartialResultParams {
 }
 ```
 
@@ -4126,9 +4233,10 @@
 ```typescript
 export interface ImplementationClientCapabilities {
 	/**
-	 * Whether implementation supports dynamic registration. If this is set to `true`
-	 * the client supports the new `ImplementationRegistrationOptions` return value
-	 * for the corresponding server capability as well.
+	 * Whether implementation supports dynamic registration.
+	 * If this is set to `true`, the client supports the new
+	 * `ImplementationRegistrationOptions` return value for the
+	 * corresponding server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 
@@ -4152,7 +4260,9 @@
 
 _Registration Options_: `ImplementationRegistrationOptions` defined as follows:
 ```typescript
-export interface ImplementationRegistrationOptions extends TextDocumentRegistrationOptions, ImplementationOptions, StaticRegistrationOptions {
+export interface ImplementationRegistrationOptions
+	extends TextDocumentRegistrationOptions, ImplementationOptions,
+		StaticRegistrationOptions {
 }
 ```
 
@@ -4161,7 +4271,8 @@
 * params: `ImplementationParams` defined as follows:
 
 ```typescript
-export interface ImplementationParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface ImplementationParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
 }
 ```
 
@@ -4198,7 +4309,8 @@
 
 _Registration Options_: `ReferenceRegistrationOptions` defined as follows:
 ```typescript
-export interface ReferenceRegistrationOptions extends TextDocumentRegistrationOptions, ReferenceOptions {
+export interface ReferenceRegistrationOptions
+	extends TextDocumentRegistrationOptions, ReferenceOptions {
 }
 ```
 
@@ -4207,7 +4319,8 @@
 * params: `ReferenceParams` defined as follows:
 
 ```typescript
-export interface ReferenceParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface ReferenceParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
 	context: ReferenceContext
 }
 
@@ -4254,7 +4367,8 @@
 
 _Registration Options_: `DocumentHighlightRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentHighlightRegistrationOptions extends TextDocumentRegistrationOptions, DocumentHighlightOptions {
+export interface DocumentHighlightRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentHighlightOptions {
 }
 ```
 
@@ -4263,7 +4377,8 @@
 * params: `DocumentHighlightParams` defined as follows:
 
 ```typescript
-export interface DocumentHighlightParams extends TextDocumentPositionParams, WorkDoneProgressParams, PartialResultParams {
+export interface DocumentHighlightParams extends TextDocumentPositionParams,
+	WorkDoneProgressParams, PartialResultParams {
 }
 ```
 
@@ -4332,7 +4447,8 @@
 	dynamicRegistration?: boolean;
 
 	/**
-	 * Specific capabilities for the `SymbolKind` in the `textDocument/documentSymbol` request.
+	 * Specific capabilities for the `SymbolKind` in the
+	 * `textDocument/documentSymbol` request.
 	 */
 	symbolKind?: {
 		/**
@@ -4366,7 +4482,8 @@
 
 _Registration Options_: `DocumentSymbolRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentSymbolRegistrationOptions extends TextDocumentRegistrationOptions, DocumentSymbolOptions {
+export interface DocumentSymbolRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentSymbolOptions {
 }
 ```
 
@@ -4375,7 +4492,8 @@
 * params: `DocumentSymbolParams` defined as follows:
 
 ```typescript
-export interface DocumentSymbolParams extends WorkDoneProgressParams, PartialResultParams {
+export interface DocumentSymbolParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The text document.
 	 */
@@ -4420,14 +4538,16 @@
 }
 
 /**
- * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document symbols can be
- * hierarchical and they have two ranges: one that encloses its definition and one that points to its most interesting range,
- * e.g. the range of an identifier.
+ * Represents programming constructs like variables, classes, interfaces etc.
+ * that appear in a document. Document symbols can be hierarchical and they
+ * have two ranges: one that encloses its definition and one that points to
+ * its most interesting range, for example, the range of an identifier.
  */
 export interface DocumentSymbol {
 
 	/**
-	 * The name of this symbol. Will be displayed in the user interface and therefore must not be
+	 * The name of this symbol.
+	 * Will be displayed in the user interface and therefore must not be
 	 * an empty string or a string only consisting of white spaces.
 	 */
 	name: string;
@@ -4448,14 +4568,16 @@
 	deprecated?: boolean;
 
 	/**
-	 * The range enclosing this symbol not including leading/trailing whitespace but everything else
-	 * like comments. This information is typically used to determine if the clients cursor is
-	 * inside the symbol to reveal in the symbol in the UI.
+	 * The range enclosing this symbol not including leading/trailing
+	 * whitespace but everything else like comments.
+	 * This information is typically used to determine if the client's cursor
+	 * is inside the symbol to reveal in the symbol in the UI.
 	 */
 	range: Range;
 
 	/**
-	 * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
+	 * The range that should be selected and revealed when this symbol
+	 * is being picked, for example, the name of a function.
 	 * Must be contained by the `range`.
 	 */
 	selectionRange: Range;
@@ -4576,8 +4698,8 @@
 	/**
 	 * CodeActionKinds that this server may return.
 	 *
-	 * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
-	 * may list out every specific kind they provide.
+	 * The list of kinds may be generic, such as `CodeActionKind.Refactor`,
+	 * or the server may list out every specific kind they provide.
 	 */
 	codeActionKinds?: CodeActionKind[];
 }
@@ -4585,7 +4707,8 @@
 
 _Registration Options_: `CodeActionRegistrationOptions` defined as follows:
 ```typescript
-export interface CodeActionRegistrationOptions extends TextDocumentRegistrationOptions, CodeActionOptions {
+export interface CodeActionRegistrationOptions
+	extends TextDocumentRegistrationOptions, CodeActionOptions {
 }
 ```
 
@@ -4597,7 +4720,8 @@
 /**
  * Params for the CodeActionRequest
  */
-export interface CodeActionParams extends WorkDoneProgressParams, PartialResultParams {
+export interface CodeActionParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The document in which the command was invoked.
 	 */
@@ -4617,10 +4741,11 @@
 /**
  * The kind of a code action.
  *
- * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`.
+ * Kinds are a hierarchical list of identifiers separated by `.`,
+ * e.g. `"refactor.extract.function"`.
  *
- * The set of kinds is open and client needs to announce the kinds it supports to the server during
- * initialization.
+ * The set of kinds is open and the client needs to announce the kinds it
+ * supports to the server during initialization.
  */
 export type CodeActionKind = string;
 
@@ -4691,9 +4816,10 @@
 	export const Source: CodeActionKind = 'source';
 
 	/**
-	 * Base kind for an organize imports source action: `source.organizeImports`.
+	 * Base kind for an organize imports source action `source.organizeImports`.
 	 */
-	export const SourceOrganizeImports: CodeActionKind = 'source.organizeImports';
+	export const SourceOrganizeImports: CodeActionKind
+		= 'source.organizeImports';
 }
 
 /**
@@ -4702,19 +4828,20 @@
  */
 export interface CodeActionContext {
 	/**
-	 * An array of diagnostics known on the client side overlapping the range provided to the
-	 * `textDocument/codeAction` request. They are provided so that the server knows which
-	 * errors are currently presented to the user for the given range. There is no guarantee
-	 * that these accurately reflect the error state of the resource. The primary parameter
-	 * to compute code actions is the provided range.
+	 * An array of diagnostics known on the client side overlapping the range
+	 * provided to the `textDocument/codeAction` request.
+	 * They are provided so that the server knows which errors are currently
+	 * presented to the user for the given range. There is no guarantee that
+	 * these accurately reflect the error state of the resource.
+	 * The primary parameter to compute code actions is the provided range.
 	 */
 	diagnostics: Diagnostic[];
 
 	/**
 	 * Requested kind of actions to return.
 	 *
-	 * Actions not of this kind are filtered out by the client before being shown. So servers
-	 * can omit computing them.
+	 * Actions not of this kind are filtered out by the client before
+	 * being shown, so servers can omit computing them.
 	 */
 	only?: CodeActionKind[];
 }
@@ -4725,10 +4852,12 @@
 
 ```typescript
 /**
- * A code action represents a change that can be performed in code, e.g. to fix a problem or
- * to refactor code.
+ * A code action represents a change that can be performed in code.
+ * For example, to fix a problem or to refactor code.
  *
- * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed.
+ * A CodeAction must set either `edit` and/or a `command`.
+ * If both are supplied, the `edit` is applied first, then the `command`
+ * is executed.
  */
 export interface CodeAction {
 
@@ -4750,11 +4879,14 @@
 	diagnostics?: Diagnostic[];
 
 	/**
-	 * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
-	 * by keybindings.
+	 * Marks this as a preferred action.
+	 * Preferred actions are used by the `auto fix` command and can be
+	 * targeted by keybindings.
 	 *
-	 * A quick fix should be marked preferred if it properly addresses the underlying error.
-	 * A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
+	 * A quick fix should be marked preferred if it properly addresses the
+	 * underlying error.
+	 * A refactoring should be marked preferred if it is the most reasonable
+	 * choice of actions to take.
 	 *
 	 * @since 3.15.0
 	 */
@@ -4778,7 +4910,7 @@
 
 #### <a href="#textDocument_codeLens" name="textDocument_codeLens" class="anchor">Code Lens Request (:leftwards_arrow_with_hook:)</a>
 
-The code lens request is sent from the client to the server to compute code lenses for a given text document.
+The CodeLens request is sent from the client to the server to compute CodeLens for a given text document.
 
 _Client Capability_:
 * property name (optional): `textDocument.codeLens`
@@ -4787,7 +4919,7 @@
 ```typescript
 export interface CodeLensClientCapabilities {
 	/**
-	 * Whether code lens supports dynamic registration.
+	 * Whether CodeLens supports dynamic registration.
 	 */
 	dynamicRegistration?: boolean;
 }
@@ -4808,7 +4940,8 @@
 
 _Registration Options_: `CodeLensRegistrationOptions` defined as follows:
 ```typescript
-export interface CodeLensRegistrationOptions extends TextDocumentRegistrationOptions, CodeLensOptions {
+export interface CodeLensRegistrationOptions
+	extends TextDocumentRegistrationOptions, CodeLensOptions {
 }
 ```
 
@@ -4819,7 +4952,7 @@
 ```typescript
 interface CodeLensParams extends WorkDoneProgressParams, PartialResultParams {
 	/**
-	 * The document to request code lens for.
+	 * The document to request CodeLens for.
 	 */
 	textDocument: TextDocumentIdentifier;
 }
@@ -4830,36 +4963,37 @@
 
 ```typescript
 /**
- * A code lens represents a command that should be shown along with
+ * A CodeLense represents a command that should be shown along with
  * source text, like the number of references, a way to run tests, etc.
  *
- * A code lens is _unresolved_ when no command is associated to it. For performance
- * reasons the creation of a code lens and resolving should be done in two stages.
+ * A CodeLens is _unresolved_ when no command is associated to it.
+ * For performance reasons, the creation of a CodeLens and resolving should
+ * be done in two stages.
  */
 interface CodeLens {
 	/**
-	 * The range in which this code lens is valid. Should only span a single line.
+	 * The range in which the CodeLens is valid. Should only span a single line.
 	 */
 	range: Range;
 
 	/**
-	 * The command this code lens represents.
+	 * The command this CodeLens represents.
 	 */
 	command?: Command;
 
 	/**
-	 * A data entry field that is preserved on a code lens item between
-	 * a code lens and a code lens resolve request.
+	 * A data entry field that is preserved on a CodeLens item between
+	 * a CodeLens and a CodeLens resolve request.
 	 */
 	data?: any
 }
 ```
 * partial result: `CodeLens[]`
-* error: code and message set in case an exception happens during the code lens request.
+* error: code and message set in case an exception happens during the CodeLens request.
 
 #### <a href="#codeLens_resolve" name="codeLens_resolve" class="anchor">Code Lens Resolve Request (:leftwards_arrow_with_hook:)</a>
 
-The code lens resolve request is sent from the client to the server to resolve the command for a given code lens item.
+The CodeLens resolve request is sent from the client to the server to resolve the command for a given CodeLens item.
 
 _Request_:
 * method: 'codeLens/resolve'
@@ -4867,7 +5001,7 @@
 
 _Response_:
 * result: `CodeLens`
-* error: code and message set in case an exception happens during the code lens resolve request.
+* error: code and message set in case an exception happens during the CodeLens resolve request.
 
 #### <a href="#textDocument_documentLink" name="textDocument_documentLink" class="anchor">Document Link Request (:leftwards_arrow_with_hook:)</a>
 
@@ -4908,7 +5042,8 @@
 
 _Registration Options_: `DocumentLinkRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentLinkRegistrationOptions extends TextDocumentRegistrationOptions, DocumentLinkOptions {
+export interface DocumentLinkRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentLinkOptions {
 }
 ```
 
@@ -4917,7 +5052,8 @@
 * params: `DocumentLinkParams` defined as follows:
 
 ```typescript
-interface DocumentLinkParams extends WorkDoneProgressParams, PartialResultParams {
+interface DocumentLinkParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The document to provide document links for.
 	 */
@@ -4930,8 +5066,8 @@
 
 ```typescript
 /**
- * A document link is a range in a text document that links to an internal or external resource, like another
- * text document or a web site.
+ * A document link is a range in a text document that links to an internal
+ * or external resource, like another text document or a web site.
  */
 interface DocumentLink {
 	/**
@@ -4947,9 +5083,11 @@
 	/**
 	 * The tooltip text when you hover over this link.
 	 *
-	 * If a tooltip is provided, is will be displayed in a string that includes instructions on how to
-	 * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
-	 * user settings, and localization.
+	 * If a tooltip is provided, it will be displayed in a string that
+	 * includes instructions on how to trigger the link,
+	 * such as `{0} (ctrl + click)`.
+	 * The specific instructions vary depending on OS, user settings,
+	 * and localization.
 	 *
 	 * @since 3.15.0
 	 */
@@ -5011,7 +5149,9 @@
 
 _Registration Options_: `DocumentColorRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentColorRegistrationOptions extends TextDocumentRegistrationOptions, StaticRegistrationOptions, DocumentColorOptions {
+export interface DocumentColorRegistrationOptions
+	extends TextDocumentRegistrationOptions, StaticRegistrationOptions,
+		DocumentColorOptions {
 }
 ```
 
@@ -5021,7 +5161,8 @@
 * params: `DocumentColorParams` defined as follows
 
 ```typescript
-interface DocumentColorParams extends WorkDoneProgressParams, PartialResultParams {
+interface DocumentColorParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The text document.
 	 */
@@ -5090,7 +5231,8 @@
 * params: `ColorPresentationParams` defined as follows
 
 ```typescript
-interface ColorPresentationParams extends WorkDoneProgressParams, PartialResultParams {
+interface ColorPresentationParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The text document.
 	 */
@@ -5115,19 +5257,22 @@
 interface ColorPresentation {
 	/**
 	 * The label of this color presentation. It will be shown on the color
-	 * picker header. By default this is also the text that is inserted when selecting
+	 * picker header.
+	 * By default, this is also the text that is inserted when selecting
 	 * this color presentation.
 	 */
 	label: string;
 	/**
 	 * An [edit](#TextEdit) which is applied to a document when selecting
-	 * this presentation for the color.  When `falsy` the [label](#ColorPresentation.label)
-	 * is used.
+	 * this presentation for the color.
+	 * When `falsy`, the [label](#ColorPresentation.label) is used.
 	 */
 	textEdit?: TextEdit;
 	/**
-	 * An optional array of additional [text edits](#TextEdit) that are applied when
-	 * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves.
+	 * An optional array of additional [text edits](#TextEdit) that are
+	 * applied when selecting this color presentation.
+	 * Edits must not overlap with the main [edit](#ColorPresentation.textEdit)
+	 * nor with themselves.
 	 */
 	additionalTextEdits?: TextEdit[];
 }
@@ -5164,7 +5309,8 @@
 
 _Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentFormattingRegistrationOptions extends TextDocumentRegistrationOptions, DocumentFormattingOptions {
+export interface DocumentFormattingRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentFormattingOptions {
 }
 ```
 
@@ -5253,13 +5399,15 @@
 * property type: `boolean | DocumentRangeFormattingOptions` where `DocumentRangeFormattingOptions` is defined as follows:
 
 ```typescript
-export interface DocumentRangeFormattingOptions extends WorkDoneProgressOptions {
+export interface DocumentRangeFormattingOptions
+	extends WorkDoneProgressOptions {
 }
 ```
 
 _Registration Options_: `DocumentFormattingRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentRangeFormattingRegistrationOptions extends TextDocumentRegistrationOptions, DocumentRangeFormattingOptions {
+export interface DocumentRangeFormattingRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentRangeFormattingOptions {
 }
 ```
 
@@ -5327,7 +5475,8 @@
 
 _Registration Options_: `DocumentOnTypeFormattingRegistrationOptions` defined as follows:
 ```typescript
-export interface DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions {
+export interface DocumentOnTypeFormattingRegistrationOptions
+	extends TextDocumentRegistrationOptions, DocumentOnTypeFormattingOptions {
 }
 ```
 
@@ -5395,7 +5544,8 @@
 
 _Registration Options_: `RenameRegistrationOptions` defined as follows:
 ```typescript
-export interface RenameRegistrationOptions extends TextDocumentRegistrationOptions, RenameOptions {
+export interface RenameRegistrationOptions
+	extends TextDocumentRegistrationOptions, RenameOptions {
 }
 ```
 
@@ -5404,7 +5554,8 @@
 * params: `RenameParams` defined as follows
 
 ```typescript
-interface RenameParams extends TextDocumentPositionParams, WorkDoneProgressParams {
+interface RenameParams
+	extends TextDocumentPositionParams, WorkDoneProgressParams {
 	/**
 	 * The new name of the symbol. If the given name is not valid the
 	 * request must return a [ResponseError](#ResponseError) with an
@@ -5449,19 +5600,23 @@
 ```typescript
 export interface FoldingRangeClientCapabilities {
 	/**
-	 * Whether implementation supports dynamic registration for folding range providers. If this is set to `true`
-	 * the client supports the new `FoldingRangeRegistrationOptions` return value for the corresponding server
-	 * capability as well.
+	 * Whether the implementation supports dynamic registration for
+	 * folding range providers.
+	 * If this is set to `true`, the client supports the new
+	 * `FoldingRangeRegistrationOptions` return value for the corresponding
+	 * server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 	/**
-	 * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
-	 * hint, servers are free to follow the limit.
+	 * The maximum number of folding ranges that the client prefers to
+	 * receive per document.
+	 * The value serves as a hint, servers are free to follow the limit.
 	 */
 	rangeLimit?: number;
 	/**
-	 * If set, the client signals that it only supports folding complete lines. If set, client will
-	 * ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
+	 * If set, the client signals that it only supports folding complete lines.
+	 * If set, the client will ignore specified `startCharacter` and
+	 * `endCharacter` properties in a FoldingRange.
 	 */
 	lineFoldingOnly?: boolean;
 }
@@ -5478,7 +5633,9 @@
 
 _Registration Options_: `FoldingRangeRegistrationOptions` defined as follows:
 ```typescript
-export interface FoldingRangeRegistrationOptions extends TextDocumentRegistrationOptions, FoldingRangeOptions, StaticRegistrationOptions {
+export interface FoldingRangeRegistrationOptions
+	extends TextDocumentRegistrationOptions, FoldingRangeOptions,
+		StaticRegistrationOptions {
 }
 ```
 
@@ -5488,7 +5645,8 @@
 * params: `FoldingRangeParams` defined as follows
 
 ```typescript
-export interface FoldingRangeParams extends WorkDoneProgressParams, PartialResultParams {
+export interface FoldingRangeParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The text document.
 	 */
@@ -5529,7 +5687,8 @@
 	startLine: number;
 
 	/**
-	 * The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
+	 * The zero-based character offset from where the folded range starts.
+	 * If not defined, defaults to the length of the start line.
 	 */
 	startCharacter?: number;
 
@@ -5539,14 +5698,17 @@
 	endLine: number;
 
 	/**
-	 * The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
+	 * The zero-based character offset before the folded range ends.
+	 * If not defined, defaults to the length of the end line.
 	 */
 	endCharacter?: number;
 
 	/**
-	 * Describes the kind of the folding range such as `comment` or `region`. The kind
-	 * is used to categorize folding ranges and used by commands like 'Fold all comments'. See
-	 * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.
+	 * Describes the kind of the folding range such as `comment` or `region`.
+	 * The kind is used to categorize folding ranges and used by commands
+	 * like 'Fold all comments'.
+	 * See [FoldingRangeKind](#FoldingRangeKind) for an enumeration of
+	 * standardized kinds.
 	 */
 	kind?: string;
 }
@@ -5572,9 +5734,11 @@
 ```typescript
 export interface SelectionRangeClientCapabilities {
 	/**
-	 * Whether implementation supports dynamic registration for selection range providers. If this is set to `true`
-	 * the client supports the new `SelectionRangeRegistrationOptions` return value for the corresponding server
-	 * capability as well.
+	 * Whether implementation supports dynamic registration for selection
+	 * range providers.
+	 * If set to `true`, the client supports the new
+	 * `SelectionRangeRegistrationOptions` return value for the corresponding
+	 * server capability as well.
 	 */
 	dynamicRegistration?: boolean;
 }
@@ -5591,7 +5755,9 @@
 
 _Registration Options_: `SelectionRangeRegistrationOptions` defined as follows:
 ```typescript
-export interface SelectionRangeRegistrationOptions extends SelectionRangeOptions, TextDocumentRegistrationOptions, StaticRegistrationOptions {
+export interface SelectionRangeRegistrationOptions
+	extends SelectionRangeOptions, TextDocumentRegistrationOptions,
+		StaticRegistrationOptions {
 }
 ```
 
@@ -5601,7 +5767,8 @@
 * params: `SelectionRangeParams` defined as follows
 
 ```typescript
-export interface SelectionRangeParams extends WorkDoneProgressParams, PartialResultParams {
+export interface SelectionRangeParams
+	extends WorkDoneProgressParams, PartialResultParams {
 	/**
 	 * The text document.
 	 */
@@ -5619,14 +5786,17 @@
 
 ```typescript
 export interface SelectionRange {
-    /**
-     * The [range](#Range) of this selection range.
-     */
-    range: Range;
-    /**
-     * The parent selection range containing this range. Therefore `parent.range` must contain `this.range`.
-     */
-    parent?: SelectionRange;
+	/**
+	 * The [range](#Range) of this selection range.
+	 */
+	range: Range;
+
+	/**
+	 * The parent selection range containing this range.
+	 * Therefore `parent.range` must
+	 * contain `this.range`.
+	 */
+	parent?: SelectionRange;
 }
 ```
 
diff --git a/pkg/analysis_server/tool/lsp_spec/markdown.dart b/pkg/analysis_server/tool/lsp_spec/markdown.dart
index 5b222d9..3104598 100644
--- a/pkg/analysis_server/tool/lsp_spec/markdown.dart
+++ b/pkg/analysis_server/tool/lsp_spec/markdown.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 final _methodNamesPattern = RegExp(
-    r'''_(?:Notification|Request):?_:?(?:\r?\n)+\* method: '(.*?)',?\r?\n''',
+    r'''_(?:Notification|Request):?_:?(?:\r?\n)+\* method: ['`](.*?)[`'],?\r?\n''',
     multiLine: true);
 final _typeScriptBlockPattern =
     RegExp(r'\B```typescript([\S\s]*?)\n```', multiLine: true);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 157bfc3..007051d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:pub_semver/pub_semver.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -74,10 +75,15 @@
 /// applied to a class implementing [ResynthesizeTestStrategy], along with the
 /// mixin [ResynthesizeTestHelpers].
 mixin ResynthesizeTestCases implements ResynthesizeTestHelpers {
-  FeatureSet get disableNnbd => FeatureSet.forTesting(sdkVersion: '2.2.2');
+  static final FeatureSet featureSetLegacy = FeatureSet.fromEnableFlags2(
+    sdkLanguageVersion: Version.parse('2.9.0'),
+    flags: [],
+  );
 
-  FeatureSet get enableNnbd =>
-      FeatureSet.forTesting(additionalFeatures: [Feature.non_nullable]);
+  static final FeatureSet featureSetNullSafe = FeatureSet.fromEnableFlags2(
+    sdkLanguageVersion: Version.parse('2.12.0'),
+    flags: [],
+  );
 
   test_class_abstract() async {
     var library = await checkLibrary('abstract class C {}');
@@ -913,7 +919,7 @@
   }
 
   test_class_field_const_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library =
         await checkLibrary('class C { static late const int i = 0; }');
     checkElementText(library, r'''
@@ -933,7 +939,7 @@
   }
 
   test_class_field_implicit_type_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('class C { late var x; }');
     checkElementText(library, r'''
 class C {
@@ -952,7 +958,7 @@
   }
 
   test_class_field_static_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('class C { static late int i; }');
     checkElementText(library, r'''
 class C {
@@ -972,7 +978,7 @@
   }
 
   test_class_fields_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C {
   late int foo;
@@ -991,7 +997,7 @@
   }
 
   test_class_fields_late_final() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C {
   late final int foo;
@@ -1010,7 +1016,7 @@
   }
 
   test_class_fields_late_final_initialized() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C {
   late final int foo = 0;
@@ -1455,7 +1461,7 @@
   }
 
   test_class_ref_nullability_none() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C {}
 C c;
@@ -1471,7 +1477,7 @@
   }
 
   test_class_ref_nullability_question() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C {}
 C? c;
@@ -1487,7 +1493,7 @@
   }
 
   test_class_ref_nullability_star() async {
-    featureSet = disableNnbd;
+    featureSet = featureSetLegacy;
     var library = await checkLibrary('''
 class C {}
 C c;
@@ -1783,7 +1789,7 @@
   }
 
   test_class_typeParameters_defaultType_functionTypeAlias_contravariant_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 typedef F<X> = void Function(X);
 
@@ -1816,7 +1822,7 @@
   }
 
   test_class_typeParameters_defaultType_functionTypeAlias_invariant_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 typedef F<X> = X Function(X);
 
@@ -1843,7 +1849,7 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_both_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 class A<X extends X Function(X)> {}
 ''');
@@ -1864,7 +1870,7 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_contravariant_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 class A<X extends void Function(X)> {}
 ''');
@@ -1885,7 +1891,7 @@
   }
 
   test_class_typeParameters_defaultType_genericFunctionType_covariant_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 class A<X extends X Function()> {}
 ''');
@@ -2700,7 +2706,7 @@
   }
 
   test_compilationUnit_nnbd_disabled_via_dart_directive() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 // @dart=2.2
 ''');
@@ -2708,19 +2714,19 @@
   }
 
   test_compilationUnit_nnbd_disabled_via_feature_set() async {
-    featureSet = disableNnbd;
+    featureSet = featureSetLegacy;
     var library = await checkLibrary('');
     expect(library.isNonNullableByDefault, isFalse);
   }
 
   test_compilationUnit_nnbd_enabled() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('');
     expect(library.isNonNullableByDefault, isTrue);
   }
 
   test_const_asExpression() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 const num a = 0;
 const b = a as int;
@@ -2734,7 +2740,7 @@
   }
 
   test_const_assignmentExpression() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const a = 0;
 const b = (a += 1);
@@ -2773,7 +2779,7 @@
   }
 
   test_const_cascadeExpression() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const a = 0..isEven..abs();
 ''');
@@ -2883,7 +2889,7 @@
   }
 
   test_const_indexExpression() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const a = [0];
 const b = 0;
@@ -3389,7 +3395,7 @@
   }
 
   test_const_isExpression() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 const a = 0;
 const b = a is int;
@@ -3677,7 +3683,7 @@
   }
 
   test_const_methodInvocation() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 T f<T>(T a) => a;
 const b = f<int>(0);
@@ -3786,7 +3792,7 @@
   }
 
   test_const_postfixExpression_increment() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const a = 0;
 const b = a++;
@@ -3820,7 +3826,7 @@
   }
 
   test_const_postfixExpression_nullCheck() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const int? a = 0;
 const b = a!;
@@ -3850,7 +3856,7 @@
   }
 
   test_const_prefixExpression_increment() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const a = 0;
 const b = ++a;
@@ -4445,7 +4451,7 @@
   }
 
   test_const_topLevel_nullSafe_nullAware_propertyAccess() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 const String? a = '';
 
@@ -5512,7 +5518,7 @@
   }
 
   test_defaultValue_eliminateTypeParameters() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class A<T> {
   const X({List<T> a = const []});
@@ -6519,7 +6525,7 @@
   }
 
   test_field_abstract() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 abstract class C {
   abstract int i;
@@ -6563,7 +6569,7 @@
   }
 
   test_field_external() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 abstract class C {
   external int i;
@@ -6804,7 +6810,7 @@
   }
 
   test_field_type_inferred_Never() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 class C {
   var a = throw 42;
@@ -6822,7 +6828,7 @@
   }
 
   test_field_type_inferred_nonNullify() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
 
     addSource('/a.dart', '''
 // @dart = 2.7
@@ -7317,7 +7323,7 @@
   }
 
   test_generic_function_type_nullability_none() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 void Function() f;
 ''');
@@ -7330,7 +7336,7 @@
   }
 
   test_generic_function_type_nullability_question() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 void Function()? f;
 ''');
@@ -7343,7 +7349,7 @@
   }
 
   test_generic_function_type_nullability_star() async {
-    featureSet = disableNnbd;
+    featureSet = featureSetLegacy;
     var library = await checkLibrary('''
 void Function() f;
 ''');
@@ -8198,7 +8204,7 @@
   }
 
   test_inferred_type_functionExpressionInvocation_oppositeOrder() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class A {
   static final foo = bar(1.2);
@@ -8247,7 +8253,7 @@
   }
 
   test_inferred_type_nullability_class_ref_none() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addSource('/a.dart', 'int f() => 0;');
     var library = await checkLibrary('''
 import 'a.dart';
@@ -8263,7 +8269,7 @@
   }
 
   test_inferred_type_nullability_class_ref_question() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addSource('/a.dart', 'int? f() => 0;');
     var library = await checkLibrary('''
 import 'a.dart';
@@ -8279,7 +8285,7 @@
   }
 
   test_inferred_type_nullability_function_type_none() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addSource('/a.dart', 'void Function() f() => () {};');
     var library = await checkLibrary('''
 import 'a.dart';
@@ -8295,7 +8301,7 @@
   }
 
   test_inferred_type_nullability_function_type_question() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addSource('/a.dart', 'void Function()? f() => () {};');
     var library = await checkLibrary('''
 import 'a.dart';
@@ -8662,7 +8668,7 @@
   }
 
   test_instanceInference_operator_equal_legacy_from_legacy_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addLibrarySource('/legacy.dart', r'''
 // @dart = 2.7
 class LegacyDefault {
@@ -8719,7 +8725,7 @@
   }
 
   test_instanceInference_operator_equal_nullSafe_from_nullSafe() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addLibrarySource('/nullSafe.dart', r'''
 class NullSafeDefault {
   bool operator==(other) => false;
@@ -10359,7 +10365,7 @@
   }
 
   test_mixin_inference_nullSafety() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 class A<T> {}
 mixin M<U> on A<U> {}
@@ -10380,7 +10386,7 @@
   }
 
   test_mixin_inference_nullSafety2() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addLibrarySource('/a.dart', r'''
 class A<T> {}
 
@@ -10405,7 +10411,7 @@
   }
 
   test_mixin_inference_nullSafety_mixed_inOrder() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addLibrarySource('/a.dart', r'''
 class A<T> {}
 mixin M<U> on A<U> {}
@@ -10428,7 +10434,7 @@
 
   @FailingTest(reason: 'Out-of-order inference is not specified yet')
   test_mixin_inference_nullSafety_mixed_outOfOrder() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     addLibrarySource('/a.dart', r'''
 // @dart = 2.8
 class A<T> {}
@@ -11256,7 +11262,7 @@
   }
 
   test_top_level_variable_external() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 external int i;
 ''');
@@ -11543,7 +11549,7 @@
   }
 
   test_type_never_disableNnbd() async {
-    featureSet = disableNnbd;
+    featureSet = featureSetLegacy;
     var library = await checkLibrary('Never d;');
     checkElementText(
         library,
@@ -11554,7 +11560,7 @@
   }
 
   test_type_never_enableNnbd() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('Never d;');
     checkElementText(
         library,
@@ -11565,7 +11571,7 @@
   }
 
   test_type_param_ref_nullability_none() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C<T> {
   T t;
@@ -11582,7 +11588,7 @@
   }
 
   test_type_param_ref_nullability_question() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('''
 class C<T> {
   T? t;
@@ -11599,7 +11605,7 @@
   }
 
   test_type_param_ref_nullability_star() async {
-    featureSet = disableNnbd;
+    featureSet = featureSetLegacy;
     var library = await checkLibrary('''
 class C<T> {
   T t;
@@ -12475,7 +12481,7 @@
   }
 
   test_variable_const_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('late const int i = 0;');
     checkElementText(library, r'''
 late const int i = 0;
@@ -12641,7 +12647,7 @@
   }
 
   test_variable_late() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('late int x = 0;');
     checkElementText(
         library,
@@ -12654,7 +12660,7 @@
   }
 
   test_variable_late_final() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('late final int x;');
     checkElementText(
         library,
@@ -12667,7 +12673,7 @@
   }
 
   test_variable_late_final_initialized() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary('late final int x = 0;');
     checkElementText(
         library,
@@ -12748,7 +12754,7 @@
   }
 
   test_variable_type_inferred_Never() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
     var library = await checkLibrary(r'''
 var a = throw 42;
 ''');
@@ -12772,7 +12778,7 @@
   }
 
   test_variable_type_inferred_nonNullify() async {
-    featureSet = enableNnbd;
+    featureSet = featureSetNullSafe;
 
     addSource('/a.dart', '''
 // @dart = 2.7
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 6f66e9c..d6bff45 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -81,7 +81,8 @@
   // must be locked since mutator and background compiler can
   // access the array at the same time.
   {
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+    SafepointMutexLocker ml(
+        H.thread()->isolate_group()->kernel_constants_mutex());
     KernelConstantsMap constant_map(H.info().constants());
     result_ ^= constant_map.GetOrNull(constant_offset);
     ASSERT(constant_map.Release().raw() == H.info().constants());
@@ -90,7 +91,8 @@
   // On miss, evaluate, and insert value.
   if (result_.IsNull()) {
     result_ = ReadConstantInternal(constant_offset);
-    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+    SafepointMutexLocker ml(
+        H.thread()->isolate_group()->kernel_constants_mutex());
     KernelConstantsMap constant_map(H.info().constants());
     auto insert = constant_map.InsertNewOrGetValue(constant_offset, result_);
     ASSERT(insert == result_.raw());
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1e46ce8..6f83c62 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -671,7 +671,7 @@
     memset(field_values, 0, (num_fields * sizeof(field_values[0])));
     return true;
   }
-  ASSERT(class_num_fields == Smi::Value(native_fields->ptr()->length_));
+  ASSERT(class_num_fields == Smi::Value(native_fields->ptr()->length()));
   intptr_t* native_values =
       reinterpret_cast<intptr_t*>(native_fields->ptr()->data());
   memmove(field_values, native_values, (num_fields * sizeof(field_values[0])));
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 6debb13..7c3e3de 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -331,7 +331,7 @@
 Dart_CObject* ApiMessageReader::CreateDartCObjectString(ObjectPtr raw) {
   ASSERT(IsOneByteStringClassId(raw->GetClassId()));
   OneByteStringPtr raw_str = static_cast<OneByteStringPtr>(raw);
-  intptr_t len = Smi::Value(raw_str->ptr()->length_);
+  intptr_t len = Smi::Value(raw_str->ptr()->length());
   Dart_CObject* object = AllocateDartCObjectString(len);
   char* p = object->value.as_string;
   memmove(p, raw_str->ptr()->data(), len);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3f9b43f..52ce79c 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -367,6 +367,14 @@
           NOT_IN_PRODUCT("IsolateGroup::type_feedback_mutex_")),
       patchable_call_mutex_(
           NOT_IN_PRODUCT("IsolateGroup::patchable_call_mutex_")),
+      constant_canonicalization_mutex_(
+          NOT_IN_PRODUCT("IsolateGroup::constant_canonicalization_mutex_")),
+      kernel_data_lib_cache_mutex_(
+          NOT_IN_PRODUCT("IsolateGroup::kernel_data_lib_cache_mutex_")),
+      kernel_data_class_cache_mutex_(
+          NOT_IN_PRODUCT("IsolateGroup::kernel_data_class_cache_mutex_")),
+      kernel_constants_mutex_(
+          NOT_IN_PRODUCT("IsolateGroup::kernel_constants_mutex_")),
       program_lock_(new SafepointRwLock()),
       active_mutators_monitor_(new Monitor()),
       max_active_mutators_(Scavenger::MaxMutatorThreadCount()) {
@@ -1652,14 +1660,6 @@
       on_cleanup_callback_(Isolate::CleanupCallback()),
       random_(),
       mutex_(NOT_IN_PRODUCT("Isolate::mutex_")),
-      constant_canonicalization_mutex_(
-          NOT_IN_PRODUCT("Isolate::constant_canonicalization_mutex_")),
-      kernel_data_lib_cache_mutex_(
-          NOT_IN_PRODUCT("Isolate::kernel_data_lib_cache_mutex_")),
-      kernel_data_class_cache_mutex_(
-          NOT_IN_PRODUCT("Isolate::kernel_data_class_cache_mutex_")),
-      kernel_constants_mutex_(
-          NOT_IN_PRODUCT("Isolate::kernel_constants_mutex_")),
       pending_deopts_(new MallocGrowableArray<PendingLazyDeopt>()),
       tag_table_(GrowableObjectArray::null()),
       deoptimized_code_array_(GrowableObjectArray::null()),
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index a98d48b..3a3cbf8 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -427,6 +427,14 @@
   Mutex* megamorphic_table_mutex() { return &megamorphic_table_mutex_; }
   Mutex* type_feedback_mutex() { return &type_feedback_mutex_; }
   Mutex* patchable_call_mutex() { return &patchable_call_mutex_; }
+  Mutex* constant_canonicalization_mutex() {
+    return &constant_canonicalization_mutex_;
+  }
+  Mutex* kernel_data_lib_cache_mutex() { return &kernel_data_lib_cache_mutex_; }
+  Mutex* kernel_data_class_cache_mutex() {
+    return &kernel_data_class_cache_mutex_;
+  }
+  Mutex* kernel_constants_mutex() { return &kernel_constants_mutex_; }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   Mutex* unlinked_call_map_mutex() { return &unlinked_call_map_mutex_; }
@@ -728,6 +736,10 @@
   Mutex megamorphic_table_mutex_;
   Mutex type_feedback_mutex_;
   Mutex patchable_call_mutex_;
+  Mutex constant_canonicalization_mutex_;
+  Mutex kernel_data_lib_cache_mutex_;
+  Mutex kernel_data_class_cache_mutex_;
+  Mutex kernel_constants_mutex_;
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   Mutex unlinked_call_map_mutex_;
@@ -967,17 +979,6 @@
   }
 
   Mutex* mutex() { return &mutex_; }
-  Mutex* constant_canonicalization_mutex() {
-    return &constant_canonicalization_mutex_;
-  }
-  Mutex* kernel_data_lib_cache_mutex() { return &kernel_data_lib_cache_mutex_; }
-  Mutex* kernel_data_class_cache_mutex() {
-    return &kernel_data_class_cache_mutex_;
-  }
-
-  // Any access to constants arrays must be locked since mutator and
-  // background compiler can access the arrays at the same time.
-  Mutex* kernel_constants_mutex() { return &kernel_constants_mutex_; }
 
 #if !defined(PRODUCT)
   Debugger* debugger() const { return debugger_; }
@@ -1603,10 +1604,6 @@
   Random random_;
   Simulator* simulator_ = nullptr;
   Mutex mutex_;                            // Protects compiler stats.
-  Mutex constant_canonicalization_mutex_;  // Protects const canonicalization.
-  Mutex kernel_data_lib_cache_mutex_;
-  Mutex kernel_data_class_cache_mutex_;
-  Mutex kernel_constants_mutex_;
   MessageHandler* message_handler_ = nullptr;
   intptr_t defer_finalization_count_ = 0;
   MallocGrowableArray<PendingLazyDeopt>* pending_deopts_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 56e839d..fe94596 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -919,7 +919,7 @@
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0));
     Array::initializeHandle(empty_array_,
                             static_cast<ArrayPtr>(address + kHeapObjectTag));
-    empty_array_->StoreSmi(&empty_array_->raw_ptr()->length_, Smi::New(0));
+    empty_array_->raw_ptr()->set_length(Smi::New(0));
     empty_array_->SetCanonical();
   }
 
@@ -930,7 +930,7 @@
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1));
     Array::initializeHandle(zero_array_,
                             static_cast<ArrayPtr>(address + kHeapObjectTag));
-    zero_array_->StoreSmi(&zero_array_->raw_ptr()->length_, Smi::New(1));
+    zero_array_->raw_ptr()->set_length(Smi::New(1));
     smi = Smi::New(0);
     zero_array_->SetAt(0, smi);
     zero_array_->SetCanonical();
@@ -1026,10 +1026,8 @@
     TypeArguments::initializeHandle(
         empty_type_arguments_,
         static_cast<TypeArgumentsPtr>(address + kHeapObjectTag));
-    empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->length_,
-                                    Smi::New(0));
-    empty_type_arguments_->StoreSmi(&empty_type_arguments_->raw_ptr()->hash_,
-                                    Smi::New(0));
+    empty_type_arguments_->raw_ptr()->set_length(Smi::New(0));
+    empty_type_arguments_->raw_ptr()->set_hash(Smi::New(0));
     empty_type_arguments_->ComputeHash();
     empty_type_arguments_->SetCanonical();
   }
@@ -1480,7 +1478,7 @@
 
       intptr_t leftover_len = (leftover_size - TypedData::InstanceSize(0));
       ASSERT(TypedData::InstanceSize(leftover_len) == leftover_size);
-      raw->ptr()->StoreSmi(&(raw->ptr()->length_), Smi::New(leftover_len));
+      raw->ptr()->set_length(Smi::New(leftover_len));
       raw->ptr()->RecomputeDataField();
     } else {
       // Update the leftover space as a basic object.
@@ -2669,7 +2667,7 @@
 }
 
 StringPtr Class::Name() const {
-  return raw_ptr()->name_;
+  return raw_ptr()->name();
 }
 
 StringPtr Class::ScrubbedName() const {
@@ -2682,8 +2680,8 @@
 
 StringPtr Class::UserVisibleName() const {
 #if !defined(PRODUCT)
-  ASSERT(raw_ptr()->user_name_ != String::null());
-  return raw_ptr()->user_name_;
+  ASSERT(raw_ptr()->user_name() != String::null());
+  return raw_ptr()->user_name();
 #endif  // !defined(PRODUCT)
   // No caching in PRODUCT, regenerate.
   return Symbols::New(Thread::Current(), GenerateUserVisibleName());
@@ -2691,8 +2689,8 @@
 
 const char* Class::UserVisibleNameCString() const {
 #if !defined(PRODUCT)
-  ASSERT(raw_ptr()->user_name_ != String::null());
-  return String::Handle(raw_ptr()->user_name_).ToCString();
+  ASSERT(raw_ptr()->user_name() != String::null());
+  return String::Handle(raw_ptr()->user_name()).ToCString();
 #endif                               // !defined(PRODUCT)
   return GenerateUserVisibleName();  // No caching in PRODUCT, regenerate.
 }
@@ -2728,7 +2726,7 @@
 bool Class::IsInFullSnapshot() const {
   NoSafepointScope no_safepoint;
   return LibraryLayout::InFullSnapshotBit::decode(
-      raw_ptr()->library_->ptr()->flags_);
+      raw_ptr()->library()->ptr()->flags_);
 }
 
 AbstractTypePtr Class::RareType() const {
@@ -2815,15 +2813,15 @@
     // The empty array has not been initialized yet.
     return;
   }
-  StorePointer(&raw_ptr()->interfaces_, Object::empty_array().raw());
-  StorePointer(&raw_ptr()->constants_, Object::null_array().raw());
+  raw_ptr()->set_interfaces(Object::empty_array().raw());
+  raw_ptr()->set_constants(Object::null_array().raw());
   set_functions(Object::empty_array());
   set_fields(Object::empty_array());
   set_invocation_dispatcher_cache(Object::empty_array());
 }
 
 ArrayPtr Class::OffsetToFieldMap(bool original_classes) const {
-  if (raw_ptr()->offset_in_words_to_field_ == Array::null()) {
+  if (raw_ptr()->offset_in_words_to_field() == Array::null()) {
     ASSERT(is_finalized());
     const intptr_t length = raw_ptr()->host_instance_size_in_words_;
     const Array& array = Array::Handle(Array::New(length, Heap::kOld));
@@ -2840,9 +2838,9 @@
       }
       cls = cls.SuperClass(original_classes);
     }
-    StorePointer(&raw_ptr()->offset_in_words_to_field_, array.raw());
+    raw_ptr()->set_offset_in_words_to_field(array.raw());
   }
-  return raw_ptr()->offset_in_words_to_field_;
+  return raw_ptr()->offset_in_words_to_field();
 }
 
 bool Class::HasInstanceFields() const {
@@ -2916,9 +2914,9 @@
       ASSERT(func.Owner() == raw());
       set.Insert(func);
     }
-    StorePointer(&raw_ptr()->functions_hash_table_, set.Release().raw());
+    raw_ptr()->set_functions_hash_table(set.Release().raw());
   } else {
-    StorePointer(&raw_ptr()->functions_hash_table_, Array::null());
+    raw_ptr()->set_functions_hash_table(Array::null());
   }
 }
 
@@ -2939,9 +2937,9 @@
     // Transition to using hash table.
     SetFunctions(new_array);
   } else if (new_len > kFunctionLookupHashTreshold) {
-    ClassFunctionsSet set(raw_ptr()->functions_hash_table_);
+    ClassFunctionsSet set(raw_ptr()->functions_hash_table());
     set.Insert(function);
-    StorePointer(&raw_ptr()->functions_hash_table_, set.Release().raw());
+    raw_ptr()->set_functions_hash_table(set.Release().raw());
   }
 }
 
@@ -3044,7 +3042,7 @@
 
 void Class::set_signature_function(const Function& value) const {
   ASSERT(value.IsClosureFunction() || value.IsSignatureFunction());
-  StorePointer(&raw_ptr()->signature_function_, value.raw());
+  raw_ptr()->set_signature_function(value.raw());
 }
 
 void Class::set_state_bits(intptr_t bits) const {
@@ -3053,34 +3051,32 @@
 }
 
 void Class::set_library(const Library& value) const {
-  StorePointer(&raw_ptr()->library_, value.raw());
+  raw_ptr()->set_library(value.raw());
 }
 
 void Class::set_type_parameters(const TypeArguments& value) const {
   ASSERT((num_type_arguments() == kUnknownNumTypeArguments) ||
          is_prefinalized());
-  StorePointer(&raw_ptr()->type_parameters_, value.raw());
+  raw_ptr()->set_type_parameters(value.raw());
 }
 
 void Class::set_functions(const Array& value) const {
   // Ensure all writes to the [Function]s are visible by the time the array
   // is visible.
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->functions_,
-                                                    value.raw());
+  raw_ptr()->set_functions<std::memory_order_release>(value.raw());
 }
 
 void Class::set_fields(const Array& value) const {
   // Ensure all writes to the [Field]s are visible by the time the array
   // is visible.
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->fields_,
-                                                    value.raw());
+  raw_ptr()->set_fields<std::memory_order_release>(value.raw());
 }
 
 void Class::set_invocation_dispatcher_cache(const Array& cache) const {
   // Ensure all writes to the cache are visible by the time the array
   // is visible.
-  StorePointer<ArrayPtr, std::memory_order_release>(
-      &raw_ptr()->invocation_dispatcher_cache_, cache.raw());
+  raw_ptr()->set_invocation_dispatcher_cache<std::memory_order_release>(
+      cache.raw());
 }
 
 intptr_t Class::NumTypeParameters(Thread* thread) const {
@@ -3234,7 +3230,7 @@
 
 void Class::set_super_type(const AbstractType& value) const {
   ASSERT(value.IsNull() || (value.IsType() && !value.IsDynamicType()));
-  StorePointer(&raw_ptr()->super_type_, value.raw());
+  raw_ptr()->set_super_type(value.raw());
 }
 
 TypeParameterPtr Class::LookupTypeParameter(const String& type_name) const {
@@ -3782,7 +3778,7 @@
 }
 
 ArrayPtr Class::invocation_dispatcher_cache() const {
-  return raw_ptr()->invocation_dispatcher_cache_;
+  return raw_ptr()->invocation_dispatcher_cache();
 }
 
 void Class::Finalize() const {
@@ -3929,13 +3925,13 @@
 ArrayPtr Class::dependent_code() const {
   DEBUG_ASSERT(
       IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
-  return raw_ptr()->dependent_code_;
+  return raw_ptr()->dependent_code();
 }
 
 void Class::set_dependent_code(const Array& array) const {
   DEBUG_ASSERT(
       IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
-  StorePointer(&raw_ptr()->dependent_code_, array.raw());
+  raw_ptr()->set_dependent_code(array.raw());
 }
 
 // Conventions:
@@ -4644,11 +4640,11 @@
 }
 
 void Class::set_name(const String& value) const {
-  ASSERT(raw_ptr()->name_ == String::null());
+  ASSERT(raw_ptr()->name() == String::null());
   ASSERT(value.IsSymbol());
-  StorePointer(&raw_ptr()->name_, value.raw());
+  raw_ptr()->set_name(value.raw());
 #if !defined(PRODUCT)
-  if (raw_ptr()->user_name_ == String::null()) {
+  if (raw_ptr()->user_name() == String::null()) {
     // TODO(johnmccutchan): Eagerly set user name for VM isolate classes,
     // lazily set user name for the other classes.
     // Generate and set user_name.
@@ -4661,7 +4657,7 @@
 
 #if !defined(PRODUCT)
 void Class::set_user_name(const String& value) const {
-  StorePointer(&raw_ptr()->user_name_, value.raw());
+  raw_ptr()->set_user_name(value.raw());
 }
 #endif  // !defined(PRODUCT)
 
@@ -4824,7 +4820,7 @@
 }
 
 void Class::set_script(const Script& value) const {
-  StorePointer(&raw_ptr()->script_, value.raw());
+  raw_ptr()->set_script(value.raw());
 }
 
 void Class::set_token_pos(TokenPosition token_pos) const {
@@ -4915,7 +4911,7 @@
 
 void Class::set_interfaces(const Array& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->interfaces_, value.raw());
+  raw_ptr()->set_interfaces(value.raw());
 }
 
 void Class::AddDirectImplementor(const Class& implementor,
@@ -4924,10 +4920,10 @@
   ASSERT(is_implemented());
   ASSERT(!implementor.IsNull());
   GrowableObjectArray& direct_implementors =
-      GrowableObjectArray::Handle(raw_ptr()->direct_implementors_);
+      GrowableObjectArray::Handle(raw_ptr()->direct_implementors());
   if (direct_implementors.IsNull()) {
     direct_implementors = GrowableObjectArray::New(4, Heap::kOld);
-    StorePointer(&raw_ptr()->direct_implementors_, direct_implementors.raw());
+    raw_ptr()->set_direct_implementors(direct_implementors.raw());
   }
 #if defined(DEBUG)
   // Verify that the same class is not added twice.
@@ -4946,7 +4942,7 @@
 
 void Class::ClearDirectImplementors() const {
   ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
-  StorePointer(&raw_ptr()->direct_implementors_, GrowableObjectArray::null());
+  raw_ptr()->set_direct_implementors(GrowableObjectArray::null());
 }
 
 void Class::AddDirectSubclass(const Class& subclass) const {
@@ -4956,10 +4952,10 @@
   // Do not keep track of the direct subclasses of class Object.
   ASSERT(!IsObjectClass());
   GrowableObjectArray& direct_subclasses =
-      GrowableObjectArray::Handle(raw_ptr()->direct_subclasses_);
+      GrowableObjectArray::Handle(raw_ptr()->direct_subclasses());
   if (direct_subclasses.IsNull()) {
     direct_subclasses = GrowableObjectArray::New(4, Heap::kOld);
-    StorePointer(&raw_ptr()->direct_subclasses_, direct_subclasses.raw());
+    raw_ptr()->set_direct_subclasses(direct_subclasses.raw());
   }
 #if defined(DEBUG)
   // Verify that the same class is not added twice.
@@ -4972,15 +4968,15 @@
 
 void Class::ClearDirectSubclasses() const {
   ASSERT(IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
-  StorePointer(&raw_ptr()->direct_subclasses_, GrowableObjectArray::null());
+  raw_ptr()->set_direct_subclasses(GrowableObjectArray::null());
 }
 
 ArrayPtr Class::constants() const {
-  return raw_ptr()->constants_;
+  return raw_ptr()->constants();
 }
 
 void Class::set_constants(const Array& value) const {
-  StorePointer(&raw_ptr()->constants_, value.raw());
+  raw_ptr()->set_constants(value.raw());
 }
 
 void Class::set_declaration_type(const Type& value) const {
@@ -4993,7 +4989,7 @@
   // The exception is DeclarationType of Null which is kNullable.
   ASSERT(value.type_class_id() != kNullCid || value.IsNullable());
   ASSERT(value.type_class_id() == kNullCid || value.IsNonNullable());
-  StorePointer(&raw_ptr()->declaration_type_, value.raw());
+  raw_ptr()->set_declaration_type(value.raw());
 }
 
 TypePtr Class::DeclarationType() const {
@@ -5026,8 +5022,8 @@
   // Never clear the stub as it may still be a target, but will be GC-d if
   // not referenced.
   ASSERT(!value.IsNull());
-  ASSERT(raw_ptr()->allocation_stub_ == Code::null());
-  StorePointer(&raw_ptr()->allocation_stub_, value.raw());
+  ASSERT(raw_ptr()->allocation_stub() == Code::null());
+  raw_ptr()->set_allocation_stub(value.raw());
 }
 
 void Class::DisableAllocationStub() const {
@@ -5039,7 +5035,7 @@
   // Change the stub so that the next caller will regenerate the stub.
   existing_stub.DisableStubCode();
   // Disassociate the existing stub from class.
-  StorePointer(&raw_ptr()->allocation_stub_, Code::null());
+  raw_ptr()->set_allocation_stub(Code::null());
 }
 
 bool Class::IsDartFunctionClass() const {
@@ -5354,7 +5350,7 @@
     // If we want to increase resolver speed by avoiding the need for read lock,
     // we could make change this hash table to be lock-free for the reader.
     const Array& hash_table =
-        Array::Handle(thread->zone(), raw_ptr()->functions_hash_table_);
+        Array::Handle(thread->zone(), raw_ptr()->functions_hash_table());
     if (!hash_table.IsNull()) {
       ClassFunctionsSet set(hash_table.raw());
       REUSABLE_STRING_HANDLESCOPE(thread);
@@ -5863,7 +5859,7 @@
 }
 
 void TypeArguments::set_nullability(intptr_t value) const {
-  StoreSmi(&raw_ptr()->nullability_, Smi::New(value));
+  raw_ptr()->set_nullability(Smi::New(value));
 }
 
 intptr_t TypeArguments::HashForRange(intptr_t from_index, intptr_t len) const {
@@ -5987,7 +5983,7 @@
   if (IsNull()) {
     return buffer->AddString("null");
   }
-  buffer->Printf("(H%" Px ")", Smi::Value(raw_ptr()->hash_));
+  buffer->Printf("(H%" Px ")", Smi::Value(raw_ptr()->hash()));
   auto& type_at = AbstractType::Handle();
   for (intptr_t i = 0; i < Length(); i++) {
     type_at = TypeAt(i);
@@ -6088,7 +6084,7 @@
 ArrayPtr TypeArguments::instantiations() const {
   // We rely on the fact that any loads from the array are dependent loads and
   // avoid the load-acquire barrier here.
-  return raw_ptr()->instantiations_;
+  return raw_ptr()->instantiations();
 }
 
 void TypeArguments::set_instantiations(const Array& value) const {
@@ -6096,8 +6092,7 @@
   // when releasing the pointer to the array pointer.
   // => We have to use store-release here.
   ASSERT(!value.IsNull());
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->instantiations_,
-                                                    value.raw());
+  raw_ptr()->set_instantiations<std::memory_order_release>(value.raw());
 }
 
 bool TypeArguments::HasCount(intptr_t count) const {
@@ -6111,19 +6106,20 @@
   if (IsNull()) {
     return 0;
   }
-  return Smi::Value(raw_ptr()->length_);
+  return Smi::Value(raw_ptr()->length());
 }
 
 intptr_t TypeArguments::nullability() const {
   if (IsNull()) {
     return 0;
   }
-  return Smi::Value(raw_ptr()->nullability_);
+  return Smi::Value(raw_ptr()->nullability());
 }
 
 AbstractTypePtr TypeArguments::TypeAt(intptr_t index) const {
   ASSERT(!IsNull());
-  return *TypeAddr(index);
+  ASSERT((index >= 0) && (index < Length()));
+  return raw_ptr()->element(index);
 }
 
 AbstractTypePtr TypeArguments::TypeAtNullSafe(intptr_t index) const {
@@ -6137,7 +6133,8 @@
 
 void TypeArguments::SetTypeAt(intptr_t index, const AbstractType& value) const {
   ASSERT(!IsCanonical());
-  StorePointer(TypeAddr(index), value.raw());
+  ASSERT((index >= 0) && (index < Length()));
+  return raw_ptr()->set_element(index, value.raw());
 }
 
 bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index,
@@ -6487,16 +6484,11 @@
   return result.raw();
 }
 
-AbstractTypePtr const* TypeArguments::TypeAddr(intptr_t index) const {
-  ASSERT((index >= 0) && (index < Length()));
-  return &raw_ptr()->types()[index];
-}
-
 void TypeArguments::SetLength(intptr_t value) const {
   ASSERT(!IsCanonical());
   // This is only safe because we create a new Smi, which does not cause
   // heap allocation.
-  StoreSmi(&raw_ptr()->length_, Smi::New(value));
+  raw_ptr()->set_length(Smi::New(value));
 }
 
 TypeArgumentsPtr TypeArguments::Canonicalize(Thread* thread,
@@ -6627,19 +6619,19 @@
 }
 
 void PatchClass::set_patched_class(const Class& value) const {
-  StorePointer(&raw_ptr()->patched_class_, value.raw());
+  raw_ptr()->set_patched_class(value.raw());
 }
 
 void PatchClass::set_origin_class(const Class& value) const {
-  StorePointer(&raw_ptr()->origin_class_, value.raw());
+  raw_ptr()->set_origin_class(value.raw());
 }
 
 void PatchClass::set_script(const Script& value) const {
-  StorePointer(&raw_ptr()->script_, value.raw());
+  raw_ptr()->set_script(value.raw());
 }
 
 void PatchClass::set_library_kernel_data(const ExternalTypedData& data) const {
-  StorePointer(&raw_ptr()->library_kernel_data_, data.raw());
+  raw_ptr()->set_library_kernel_data(data.raw());
 }
 
 intptr_t Function::Hash() const {
@@ -6671,7 +6663,7 @@
 }
 
 void Function::SetInstructionsSafe(const Code& value) const {
-  StorePointer(&raw_ptr()->code_, value.raw());
+  raw_ptr()->set_code(value.raw());
   StoreNonPointer(&raw_ptr()->entry_point_, value.EntryPoint());
   StoreNonPointer(&raw_ptr()->unchecked_entry_point_,
                   value.UncheckedEntryPoint());
@@ -6688,14 +6680,14 @@
 
 bool Function::HasCode() const {
   NoSafepointScope no_safepoint;
-  ASSERT(raw_ptr()->code_ != Code::null());
-  return raw_ptr()->code_ != StubCode::LazyCompile().raw();
+  ASSERT(raw_ptr()->code() != Code::null());
+  return raw_ptr()->code() != StubCode::LazyCompile().raw();
 }
 
 bool Function::HasCode(FunctionPtr function) {
   NoSafepointScope no_safepoint;
-  ASSERT(function->ptr()->code_ != Code::null());
-  return function->ptr()->code_ != StubCode::LazyCompile().raw();
+  ASSERT(function->ptr()->code() != Code::null());
+  return function->ptr()->code() != StubCode::LazyCompile().raw();
 }
 
 void Function::ClearCode() const {
@@ -6704,7 +6696,7 @@
 #else
   ASSERT(Thread::Current()->IsMutatorThread());
 
-  StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
+  raw_ptr()->set_unoptimized_code(Code::null());
 
   SetInstructions(StubCode::LazyCompile());
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
@@ -6786,13 +6778,13 @@
 #else
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(value.IsNull() || !value.is_optimized());
-  StorePointer(&raw_ptr()->unoptimized_code_, value.raw());
+  raw_ptr()->set_unoptimized_code(value.raw());
 #endif
 }
 
 ContextScopePtr Function::context_scope() const {
   if (IsClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
+    const Object& obj = Object::Handle(raw_ptr()->data());
     ASSERT(!obj.IsNull());
     return ClosureData::Cast(obj).context_scope();
   }
@@ -6801,7 +6793,7 @@
 
 void Function::set_context_scope(const ContextScope& value) const {
   if (IsClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
+    const Object& obj = Object::Handle(raw_ptr()->data());
     ASSERT(!obj.IsNull());
     ClosureData::Cast(obj).set_context_scope(value);
     return;
@@ -6811,7 +6803,7 @@
 
 InstancePtr Function::implicit_static_closure() const {
   if (IsImplicitStaticClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
+    const Object& obj = Object::Handle(raw_ptr()->data());
     ASSERT(!obj.IsNull());
     return ClosureData::Cast(obj).implicit_static_closure();
   }
@@ -6820,7 +6812,7 @@
 
 void Function::set_implicit_static_closure(const Instance& closure) const {
   if (IsImplicitStaticClosureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
+    const Object& obj = Object::Handle(raw_ptr()->data());
     ASSERT(!obj.IsNull());
     ClosureData::Cast(obj).set_implicit_static_closure(closure);
     return;
@@ -6829,7 +6821,7 @@
 }
 
 ScriptPtr Function::eval_script() const {
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   if (obj.IsScript()) {
     return Script::Cast(obj).raw();
   }
@@ -6838,27 +6830,27 @@
 
 void Function::set_eval_script(const Script& script) const {
   ASSERT(token_pos() == TokenPosition::kMinSource);
-  ASSERT(raw_ptr()->data_ == Object::null());
+  ASSERT(raw_ptr()->data() == Object::null());
   set_data(script);
 }
 
 FunctionPtr Function::extracted_method_closure() const {
   ASSERT(kind() == FunctionLayout::kMethodExtractor);
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(obj.IsFunction());
   return Function::Cast(obj).raw();
 }
 
 void Function::set_extracted_method_closure(const Function& value) const {
   ASSERT(kind() == FunctionLayout::kMethodExtractor);
-  ASSERT(raw_ptr()->data_ == Object::null());
+  ASSERT(raw_ptr()->data() == Object::null());
   set_data(value);
 }
 
 ArrayPtr Function::saved_args_desc() const {
   ASSERT(kind() == FunctionLayout::kNoSuchMethodDispatcher ||
          kind() == FunctionLayout::kInvokeFieldDispatcher);
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(obj.IsArray());
   return Array::Cast(obj).raw();
 }
@@ -6866,7 +6858,7 @@
 void Function::set_saved_args_desc(const Array& value) const {
   ASSERT(kind() == FunctionLayout::kNoSuchMethodDispatcher ||
          kind() == FunctionLayout::kInvokeFieldDispatcher);
-  ASSERT(raw_ptr()->data_ == Object::null());
+  ASSERT(raw_ptr()->data() == Object::null());
   set_data(value);
 }
 
@@ -6875,7 +6867,7 @@
          kind() == FunctionLayout::kImplicitSetter ||
          kind() == FunctionLayout::kImplicitStaticGetter ||
          kind() == FunctionLayout::kFieldInitializer);
-  return Field::RawCast(raw_ptr()->data_);
+  return Field::RawCast(raw_ptr()->data());
 }
 
 void Function::set_accessor_field(const Field& value) const {
@@ -6884,13 +6876,14 @@
          kind() == FunctionLayout::kImplicitStaticGetter ||
          kind() == FunctionLayout::kFieldInitializer);
   // Top level classes may be finalized multiple times.
-  ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
+  ASSERT(raw_ptr()->data() == Object::null() ||
+         raw_ptr()->data() == value.raw());
   set_data(value);
 }
 
 FunctionPtr Function::parent_function() const {
   if (IsClosureFunction() || IsSignatureFunction()) {
-    const Object& obj = Object::Handle(raw_ptr()->data_);
+    const Object& obj = Object::Handle(raw_ptr()->data());
     ASSERT(!obj.IsNull());
     if (IsClosureFunction()) {
       return ClosureData::Cast(obj).parent_function();
@@ -6902,7 +6895,7 @@
 }
 
 void Function::set_parent_function(const Function& value) const {
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   if (IsClosureFunction()) {
     ClosureData::Cast(obj).set_parent_function(value);
@@ -6986,7 +6979,7 @@
     UNREACHABLE();
   }
   const auto& closure_data =
-      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data()));
   ASSERT(!closure_data.IsNull());
   if (kind_out != nullptr) {
     *kind_out = DefaultTypeArgumentsKindField::decode(
@@ -7000,7 +6993,7 @@
     UNREACHABLE();
   }
   const auto& closure_data =
-      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data()));
   ASSERT(!closure_data.IsNull());
   intptr_t updated_info = closure_data.default_type_arguments_info();
   auto kind = DefaultTypeArgumentsKindFor(value);
@@ -7084,7 +7077,7 @@
       IsDispatcherOrImplicitAccessor() || IsFieldInitializer()) {
     return Function::null();
   }
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(obj.IsNull() || obj.IsScript() || obj.IsFunction() || obj.IsArray());
   if (obj.IsNull() || obj.IsScript()) {
     return Function::null();
@@ -7100,7 +7093,7 @@
 
 void Function::set_implicit_closure_function(const Function& value) const {
   ASSERT(!IsClosureFunction() && !IsSignatureFunction());
-  const Object& old_data = Object::Handle(raw_ptr()->data_);
+  const Object& old_data = Object::Handle(raw_ptr()->data());
   if (is_native()) {
     ASSERT(old_data.IsArray());
     ASSERT((Array::Cast(old_data).At(1) == Object::null()) || value.IsNull());
@@ -7118,7 +7111,7 @@
 }
 
 TypePtr Function::ExistingSignatureType() const {
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
     return SignatureData::Cast(obj).signature_type();
@@ -7132,14 +7125,14 @@
 
 void Function::SetFfiCSignature(const Function& sig) const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_c_signature(sig);
 }
 
 FunctionPtr Function::FfiCSignature() const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).c_signature();
 }
@@ -7162,42 +7155,42 @@
 
 int32_t Function::FfiCallbackId() const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).callback_id();
 }
 
 void Function::SetFfiCallbackId(int32_t value) const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_callback_id(value);
 }
 
 FunctionPtr Function::FfiCallbackTarget() const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).callback_target();
 }
 
 void Function::SetFfiCallbackTarget(const Function& target) const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_callback_target(target);
 }
 
 InstancePtr Function::FfiCallbackExceptionalReturn() const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).callback_exceptional_return();
 }
 
 void Function::SetFfiCallbackExceptionalReturn(const Instance& value) const {
   ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_callback_exceptional_return(value);
 }
@@ -7245,7 +7238,7 @@
 }
 
 void Function::SetSignatureType(const Type& value) const {
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(!obj.IsNull());
   if (IsSignatureFunction()) {
     SignatureData::Cast(obj).set_signature_type(value);
@@ -7265,7 +7258,7 @@
 FunctionPtr Function::ForwardingTarget() const {
   ASSERT(kind() == FunctionLayout::kDynamicInvocationForwarder);
   Array& checks = Array::Handle();
-  checks ^= raw_ptr()->data_;
+  checks ^= raw_ptr()->data();
   return Function::RawCast(checks.At(0));
 }
 
@@ -7299,7 +7292,7 @@
 //   dyn inv forwarder:       Array[0] = Function target
 //                            Array[1] = TypeArguments default type args
 void Function::set_data(const Object& value) const {
-  StorePointer(&raw_ptr()->data_, value.raw());
+  raw_ptr()->set_data(value.raw());
 }
 
 bool Function::IsInFactoryScope() const {
@@ -7315,17 +7308,17 @@
 
 void Function::set_name(const String& value) const {
   ASSERT(value.IsSymbol());
-  StorePointer(&raw_ptr()->name_, value.raw());
+  raw_ptr()->set_name(value.raw());
 }
 
 void Function::set_owner(const Object& value) const {
   ASSERT(!value.IsNull() || IsSignatureFunction());
-  StorePointer(&raw_ptr()->owner_, value.raw());
+  raw_ptr()->set_owner(value.raw());
 }
 
 RegExpPtr Function::regexp() const {
   ASSERT(kind() == FunctionLayout::kIrregexpFunction);
-  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
+  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data()));
   return RegExp::RawCast(pair.At(0));
 }
 
@@ -7335,13 +7328,13 @@
 
 intptr_t Function::string_specialization_cid() const {
   ASSERT(kind() == FunctionLayout::kIrregexpFunction);
-  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
+  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data()));
   return StringSpecializationCid::decode(Smi::Value(Smi::RawCast(pair.At(1))));
 }
 
 bool Function::is_sticky_specialization() const {
   ASSERT(kind() == FunctionLayout::kIrregexpFunction);
-  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data_));
+  const Array& pair = Array::Cast(Object::Handle(raw_ptr()->data()));
   return StickySpecialization::decode(Smi::Value(Smi::RawCast(pair.At(1))));
 }
 
@@ -7350,7 +7343,7 @@
                              bool sticky) const {
   ASSERT(kind() == FunctionLayout::kIrregexpFunction);
   ASSERT(IsStringClassId(string_specialization_cid));
-  ASSERT(raw_ptr()->data_ == Object::null());
+  ASSERT(raw_ptr()->data() == Object::null());
   const Array& pair = Array::Handle(Array::New(2, Heap::kOld));
   pair.SetAt(0, regexp);
   pair.SetAt(1, Smi::Handle(Smi::New(StickySpecialization::encode(sticky) |
@@ -7361,7 +7354,7 @@
 
 StringPtr Function::native_name() const {
   ASSERT(is_native());
-  const Object& obj = Object::Handle(raw_ptr()->data_);
+  const Object& obj = Object::Handle(raw_ptr()->data());
   ASSERT(obj.IsArray());
   return String::RawCast(Array::Cast(obj).At(0));
 }
@@ -7378,7 +7371,7 @@
   // closure function.
   //
   // We therefore handle both cases.
-  const Object& old_data = Object::Handle(zone, raw_ptr()->data_);
+  const Object& old_data = Object::Handle(zone, raw_ptr()->data());
   ASSERT(old_data.IsNull() ||
          (old_data.IsFunction() &&
           Function::Handle(zone, Function::RawCast(old_data.raw()))
@@ -7392,11 +7385,11 @@
 
 void Function::set_result_type(const AbstractType& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->result_type_, value.raw());
+  raw_ptr()->set_result_type(value.raw());
 }
 
 AbstractTypePtr Function::ParameterTypeAt(intptr_t index) const {
-  const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
+  const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types());
   return AbstractType::RawCast(parameter_types.At(index));
 }
 
@@ -7405,27 +7398,27 @@
   ASSERT(!value.IsNull());
   // Method extractor parameters are shared and are in the VM heap.
   ASSERT(kind() != FunctionLayout::kMethodExtractor);
-  const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
+  const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types());
   parameter_types.SetAt(index, value);
 }
 
 void Function::set_parameter_types(const Array& value) const {
-  StorePointer(&raw_ptr()->parameter_types_, value.raw());
+  raw_ptr()->set_parameter_types(value.raw());
 }
 
 StringPtr Function::ParameterNameAt(intptr_t index) const {
-  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
+  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names());
   return String::RawCast(parameter_names.At(index));
 }
 
 void Function::SetParameterNameAt(intptr_t index, const String& value) const {
   ASSERT(!value.IsNull() && value.IsSymbol());
-  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
+  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names());
   parameter_names.SetAt(index, value);
 }
 
 void Function::set_parameter_names(const Array& value) const {
-  StorePointer(&raw_ptr()->parameter_names_, value.raw());
+  raw_ptr()->set_parameter_names(value.raw());
 }
 
 void Function::CreateNameArrayIncludingFlags(Heap::Space space) const {
@@ -7470,7 +7463,7 @@
   }
   intptr_t flag_mask;
   const intptr_t flag_index = GetRequiredFlagIndex(index, &flag_mask);
-  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
+  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names());
   if (flag_index >= parameter_names.Length()) {
     return false;
   }
@@ -7482,7 +7475,7 @@
 void Function::SetIsRequiredAt(intptr_t index) const {
   intptr_t flag_mask;
   const intptr_t flag_index = GetRequiredFlagIndex(index, &flag_mask);
-  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
+  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names());
   ASSERT(flag_index < parameter_names.Length());
   const intptr_t flags =
       Smi::Value(Smi::RawCast(parameter_names.At(flag_index)));
@@ -7490,7 +7483,7 @@
 }
 
 void Function::TruncateUnusedParameterFlags() const {
-  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
+  const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names());
   const intptr_t num_params = NumParameters();
   if (parameter_names.Length() == num_params) {
     // No flag slots to truncate.
@@ -7507,7 +7500,7 @@
 }
 
 void Function::set_type_parameters(const TypeArguments& value) const {
-  StorePointer(&raw_ptr()->type_parameters_, value.raw());
+  raw_ptr()->set_type_parameters(value.raw());
 }
 
 intptr_t Function::NumTypeParameters(Thread* thread) const {
@@ -9058,27 +9051,27 @@
 }
 
 ClassPtr Function::Owner() const {
-  if (raw_ptr()->owner_ == Object::null()) {
+  if (raw_ptr()->owner() == Object::null()) {
     ASSERT(IsSignatureFunction());
     return Class::null();
   }
-  if (raw_ptr()->owner_->IsClass()) {
-    return Class::RawCast(raw_ptr()->owner_);
+  if (raw_ptr()->owner()->IsClass()) {
+    return Class::RawCast(raw_ptr()->owner());
   }
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   ASSERT(obj.IsPatchClass());
   return PatchClass::Cast(obj).patched_class();
 }
 
 ClassPtr Function::origin() const {
-  if (raw_ptr()->owner_ == Object::null()) {
+  if (raw_ptr()->owner() == Object::null()) {
     ASSERT(IsSignatureFunction());
     return Class::null();
   }
-  if (raw_ptr()->owner_->IsClass()) {
-    return Class::RawCast(raw_ptr()->owner_);
+  if (raw_ptr()->owner()->IsClass()) {
+    return Class::RawCast(raw_ptr()->owner());
   }
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   ASSERT(obj.IsPatchClass());
   return PatchClass::Cast(obj).origin_class();
 }
@@ -9112,7 +9105,7 @@
 ScriptPtr Function::script() const {
   // NOTE(turnidge): If you update this function, you probably want to
   // update Class::PatchFieldsAndFunctions() at the same time.
-  const Object& data = Object::Handle(raw_ptr()->data_);
+  const Object& data = Object::Handle(raw_ptr()->data());
   if (IsDynamicInvocationForwarder()) {
     const auto& forwarding_target = Function::Handle(ForwardingTarget());
     return forwarding_target.script();
@@ -9135,7 +9128,7 @@
       return script.raw();
     }
   }
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsPatchClass()) {
     return PatchClass::Cast(obj).script();
   }
@@ -9151,7 +9144,7 @@
 }
 
 ExternalTypedDataPtr Function::KernelData() const {
-  Object& data = Object::Handle(raw_ptr()->data_);
+  Object& data = Object::Handle(raw_ptr()->data());
   if (data.IsArray()) {
     Object& script = Object::Handle(Array::Cast(data).At(0));
     if (script.IsScript()) {
@@ -9164,7 +9157,7 @@
     return parent.KernelData();
   }
 
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
     return lib.kernel_data();
@@ -9178,7 +9171,7 @@
       IsFfiTrampoline()) {
     return 0;
   }
-  Object& data = Object::Handle(raw_ptr()->data_);
+  Object& data = Object::Handle(raw_ptr()->data());
   if (data.IsArray()) {
     Object& script = Object::Handle(Array::Cast(data).At(0));
     if (script.IsScript()) {
@@ -9191,7 +9184,7 @@
     return parent.KernelDataProgramOffset();
   }
 
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
     return lib.kernel_offset();
@@ -9482,13 +9475,11 @@
 }
 
 void Function::set_ic_data_array(const Array& value) const {
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->ic_data_array_,
-                                                    value.raw());
+  raw_ptr()->set_ic_data_array<std::memory_order_release>(value.raw());
 }
 
 ArrayPtr Function::ic_data_array() const {
-  return LoadPointer<ArrayPtr, std::memory_order_acquire>(
-      &raw_ptr()->ic_data_array_);
+  return raw_ptr()->ic_data_array<std::memory_order_acquire>();
 }
 
 void Function::ClearICDataArray() const {
@@ -9728,41 +9719,41 @@
 }
 
 void ClosureData::set_context_scope(const ContextScope& value) const {
-  StorePointer(&raw_ptr()->context_scope_, value.raw());
+  raw_ptr()->set_context_scope(value.raw());
 }
 
 void ClosureData::set_implicit_static_closure(const Instance& closure) const {
   ASSERT(!closure.IsNull());
-  ASSERT(raw_ptr()->closure_ == Instance::null());
-  StorePointer(&raw_ptr()->closure_, closure.raw());
+  ASSERT(raw_ptr()->closure() == Instance::null());
+  raw_ptr()->set_closure(closure.raw());
 }
 
 void ClosureData::set_parent_function(const Function& value) const {
-  StorePointer(&raw_ptr()->parent_function_, value.raw());
+  raw_ptr()->set_parent_function(value.raw());
 }
 
 void ClosureData::set_signature_type(const Type& value) const {
-  StorePointer(&raw_ptr()->signature_type_, value.raw());
+  raw_ptr()->set_signature_type(value.raw());
 }
 
 void ClosureData::set_default_type_arguments(const TypeArguments& value) const {
-  StorePointer(&raw_ptr()->default_type_arguments_, value.raw());
+  raw_ptr()->set_default_type_arguments(value.raw());
 }
 
 intptr_t ClosureData::default_type_arguments_info() const {
-  const SmiPtr value = raw_ptr()->default_type_arguments_info_;
+  const SmiPtr value = raw_ptr()->default_type_arguments_info();
   if (value == Smi::null()) {
     static_assert(Function::DefaultTypeArgumentsKindField::decode(0) ==
                       Function::DefaultTypeArgumentsKind::kInvalid,
                   "Returning valid value for null Smi");
     return 0;
   }
-  return Smi::Value(raw_ptr()->default_type_arguments_info_);
+  return Smi::Value(raw_ptr()->default_type_arguments_info());
 }
 
 void ClosureData::set_default_type_arguments_info(intptr_t value) const {
   ASSERT(Smi::IsValid(value));
-  StorePointer(&raw_ptr()->default_type_arguments_info_, Smi::New(value));
+  raw_ptr()->set_default_type_arguments_info(Smi::New(value));
 }
 
 ClosureDataPtr ClosureData::New() {
@@ -9805,11 +9796,11 @@
 }
 
 void SignatureData::set_parent_function(const Function& value) const {
-  StorePointer(&raw_ptr()->parent_function_, value.raw());
+  raw_ptr()->set_parent_function(value.raw());
 }
 
 void SignatureData::set_signature_type(const Type& value) const {
-  StorePointer(&raw_ptr()->signature_type_, value.raw());
+  raw_ptr()->set_signature_type(value.raw());
 }
 
 SignatureDataPtr SignatureData::New(Heap::Space space) {
@@ -9832,15 +9823,15 @@
 }
 
 void FfiTrampolineData::set_signature_type(const Type& value) const {
-  StorePointer(&raw_ptr()->signature_type_, value.raw());
+  raw_ptr()->set_signature_type(value.raw());
 }
 
 void FfiTrampolineData::set_c_signature(const Function& value) const {
-  StorePointer(&raw_ptr()->c_signature_, value.raw());
+  raw_ptr()->set_c_signature(value.raw());
 }
 
 void FfiTrampolineData::set_callback_target(const Function& value) const {
-  StorePointer(&raw_ptr()->callback_target_, value.raw());
+  raw_ptr()->set_callback_target(value.raw());
 }
 
 void FfiTrampolineData::set_callback_id(int32_t callback_id) const {
@@ -9849,7 +9840,7 @@
 
 void FfiTrampolineData::set_callback_exceptional_return(
     const Instance& value) const {
-  StorePointer(&raw_ptr()->callback_exceptional_return_, value.raw());
+  raw_ptr()->set_callback_exceptional_return(value.raw());
 }
 
 FfiTrampolineDataPtr FfiTrampolineData::New() {
@@ -9884,7 +9875,7 @@
   if (IsNull()) {
     return Field::null();
   }
-  Object& obj = Object::Handle(raw_ptr()->owner_);
+  Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsField()) {
     return Field::RawCast(obj.raw());
   } else {
@@ -9910,7 +9901,7 @@
 void Field::SetOriginal(const Field& value) const {
   ASSERT(value.IsOriginal());
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
+  raw_ptr()->set_owner(static_cast<ObjectPtr>(value.raw()));
 }
 
 StringPtr Field::GetterName(const String& field_name) {
@@ -9967,24 +9958,24 @@
 void Field::set_name(const String& value) const {
   ASSERT(value.IsSymbol());
   ASSERT(IsOriginal());
-  StorePointer(&raw_ptr()->name_, value.raw());
+  raw_ptr()->set_name(value.raw());
 }
 
 ObjectPtr Field::RawOwner() const {
   if (IsOriginal()) {
-    return raw_ptr()->owner_;
+    return raw_ptr()->owner();
   } else {
     const Field& field = Field::Handle(Original());
     ASSERT(field.IsOriginal());
-    ASSERT(!Object::Handle(field.raw_ptr()->owner_).IsField());
-    return field.raw_ptr()->owner_;
+    ASSERT(!Object::Handle(field.raw_ptr()->owner()).IsField());
+    return field.raw_ptr()->owner();
   }
 }
 
 ClassPtr Field::Owner() const {
   const Field& field = Field::Handle(Original());
   ASSERT(field.IsOriginal());
-  const Object& obj = Object::Handle(field.raw_ptr()->owner_);
+  const Object& obj = Object::Handle(field.raw_ptr()->owner());
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9995,7 +9986,7 @@
 ClassPtr Field::Origin() const {
   const Field& field = Field::Handle(Original());
   ASSERT(field.IsOriginal());
-  const Object& obj = Object::Handle(field.raw_ptr()->owner_);
+  const Object& obj = Object::Handle(field.raw_ptr()->owner());
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -10008,7 +9999,7 @@
   // update Class::PatchFieldsAndFunctions() at the same time.
   const Field& field = Field::Handle(Original());
   ASSERT(field.IsOriginal());
-  const Object& obj = Object::Handle(field.raw_ptr()->owner_);
+  const Object& obj = Object::Handle(field.raw_ptr()->owner());
   if (obj.IsClass()) {
     return Class::Cast(obj).script();
   }
@@ -10017,7 +10008,7 @@
 }
 
 ExternalTypedDataPtr Field::KernelData() const {
-  const Object& obj = Object::Handle(this->raw_ptr()->owner_);
+  const Object& obj = Object::Handle(this->raw_ptr()->owner());
   // During background JIT compilation field objects are copied
   // and copy points to the original field via the owner field.
   if (obj.IsField()) {
@@ -10039,7 +10030,7 @@
 }
 
 intptr_t Field::KernelDataProgramOffset() const {
-  const Object& obj = Object::Handle(raw_ptr()->owner_);
+  const Object& obj = Object::Handle(raw_ptr()->owner());
   // During background JIT compilation field objects are copied
   // and copy points to the original field via the owner field.
   if (obj.IsField()) {
@@ -10058,7 +10049,7 @@
   ASSERT(IsOriginal());
   ASSERT(!value.IsNull());
   if (value.raw() != type()) {
-    StorePointer(&raw_ptr()->type_, value.raw());
+    raw_ptr()->set_type(value.raw());
   }
 }
 
@@ -10210,13 +10201,13 @@
 }
 
 intptr_t Field::guarded_list_length() const {
-  return Smi::Value(raw_ptr()->guarded_list_length_);
+  return Smi::Value(raw_ptr()->guarded_list_length());
 }
 
 void Field::set_guarded_list_length_unsafe(intptr_t list_length) const {
   ASSERT(Thread::Current()->IsMutatorThread());
   ASSERT(IsOriginal());
-  StoreSmi(&raw_ptr()->guarded_list_length_, Smi::New(list_length));
+  raw_ptr()->set_guarded_list_length(Smi::New(list_length));
 }
 
 intptr_t Field::guarded_list_length_in_object_offset() const {
@@ -10325,14 +10316,14 @@
 ArrayPtr Field::dependent_code() const {
   DEBUG_ASSERT(
       IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
-  return raw_ptr()->dependent_code_;
+  return raw_ptr()->dependent_code();
 }
 
 void Field::set_dependent_code(const Array& array) const {
   ASSERT(IsOriginal());
   DEBUG_ASSERT(
       IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
-  StorePointer(&raw_ptr()->dependent_code_, array.raw());
+  raw_ptr()->set_dependent_code(array.raw());
 }
 
 class FieldDependentArray : public WeakCodeReferences {
@@ -10389,8 +10380,8 @@
 bool Field::IsConsistentWith(const Field& other) const {
   return (raw_ptr()->guarded_cid_ == other.raw_ptr()->guarded_cid_) &&
          (raw_ptr()->is_nullable_ == other.raw_ptr()->is_nullable_) &&
-         (raw_ptr()->guarded_list_length_ ==
-          other.raw_ptr()->guarded_list_length_) &&
+         (raw_ptr()->guarded_list_length() ==
+          other.raw_ptr()->guarded_list_length()) &&
          (is_unboxing_candidate() == other.is_unboxing_candidate()) &&
          (static_type_exactness_state().Encode() ==
           other.static_type_exactness_state().Encode());
@@ -10437,13 +10428,13 @@
   // We have to ensure that all stores into the initializer function object
   // happen before releasing the pointer to the initializer as it may be
   // accessed without grabbing the lock.
-  StorePointer<FunctionPtr, std::memory_order_release>(
-      &raw_ptr()->initializer_function_, initializer.raw());
+  raw_ptr()->set_initializer_function<std::memory_order_release>(
+      initializer.raw());
 #endif
 }
 
 bool Field::HasInitializerFunction() const {
-  return raw_ptr()->initializer_function_ != Function::null();
+  return raw_ptr()->initializer_function() != Function::null();
 }
 
 ErrorPtr Field::InitializeInstance(const Instance& instance) const {
@@ -11010,16 +11001,16 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 void Field::set_type_test_cache(const SubtypeTestCache& cache) const {
-  StorePointer(&raw_ptr()->type_test_cache_, cache.raw());
+  raw_ptr()->set_type_test_cache(cache.raw());
 }
 #endif
 
 bool Script::HasSource() const {
-  return raw_ptr()->source_ != String::null();
+  return raw_ptr()->source() != String::null();
 }
 
 StringPtr Script::Source() const {
-  return raw_ptr()->source_;
+  return raw_ptr()->source();
 }
 
 bool Script::IsPartOfDartColonLibrary() const {
@@ -11039,11 +11030,11 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 void Script::set_compile_time_constants(const Array& value) const {
-  StorePointer(&raw_ptr()->compile_time_constants_, value.raw());
+  raw_ptr()->set_compile_time_constants(value.raw());
 }
 
 void Script::set_kernel_program_info(const KernelProgramInfo& info) const {
-  StorePointer(&raw_ptr()->kernel_program_info_, info.raw());
+  raw_ptr()->set_kernel_program_info(info.raw());
 }
 
 void Script::set_kernel_script_index(const intptr_t kernel_script_index) const {
@@ -11144,38 +11135,38 @@
 }
 
 void Script::set_url(const String& value) const {
-  StorePointer(&raw_ptr()->url_, value.raw());
+  raw_ptr()->set_url(value.raw());
 }
 
 void Script::set_resolved_url(const String& value) const {
-  StorePointer(&raw_ptr()->resolved_url_, value.raw());
+  raw_ptr()->set_resolved_url(value.raw());
 }
 
 void Script::set_source(const String& value) const {
-  StorePointer(&raw_ptr()->source_, value.raw());
+  raw_ptr()->set_source(value.raw());
 }
 
 void Script::set_line_starts(const TypedData& value) const {
-  StorePointer(&raw_ptr()->line_starts_, value.raw());
+  raw_ptr()->set_line_starts(value.raw());
 }
 
 void Script::set_debug_positions(const Array& value) const {
-  StorePointer(&raw_ptr()->debug_positions_, value.raw());
+  raw_ptr()->set_debug_positions(value.raw());
 }
 
 TypedDataPtr Script::line_starts() const {
-  return raw_ptr()->line_starts_;
+  return raw_ptr()->line_starts();
 }
 
 ArrayPtr Script::debug_positions() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions_);
+  Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions());
   if (debug_positions_array.IsNull()) {
     // This is created lazily. Now we need it.
     kernel::CollectTokenPositionsFor(*this);
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  return raw_ptr()->debug_positions_;
+  return raw_ptr()->debug_positions();
 }
 
 void Script::set_flags(uint8_t value) const {
@@ -11554,19 +11545,19 @@
 
 void Library::set_name(const String& name) const {
   ASSERT(name.IsSymbol());
-  StorePointer(&raw_ptr()->name_, name.raw());
+  raw_ptr()->set_name(name.raw());
 }
 
 void Library::set_url(const String& name) const {
-  StorePointer(&raw_ptr()->url_, name.raw());
+  raw_ptr()->set_url(name.raw());
 }
 
 void Library::set_kernel_data(const ExternalTypedData& data) const {
-  StorePointer(&raw_ptr()->kernel_data_, data.raw());
+  raw_ptr()->set_kernel_data(data.raw());
 }
 
 void Library::set_loading_unit(const LoadingUnit& value) const {
-  StorePointer(&raw_ptr()->loading_unit_, value.raw());
+  raw_ptr()->set_loading_unit(value.raw());
 }
 
 void Library::SetName(const String& name) const {
@@ -11884,7 +11875,7 @@
   }
   ResolvedNamesMap cache(resolved_names());
   cache.UpdateOrInsert(name, obj);
-  StorePointer(&raw_ptr()->resolved_names_, cache.Release().raw());
+  raw_ptr()->set_resolved_names(cache.Release().raw());
 }
 
 bool Library::LookupExportedNamesCache(const String& name, Object* obj) const {
@@ -11919,7 +11910,7 @@
   }
   ResolvedNamesMap cache(exported_names());
   cache.UpdateOrInsert(name, obj);
-  StorePointer(&raw_ptr()->exported_names_, cache.Release().raw());
+  raw_ptr()->set_exported_names(cache.Release().raw());
 }
 
 void Library::InvalidateResolvedName(const String& name) const {
@@ -11992,7 +11983,7 @@
   new_entry = Smi::New(used);
   new_dict.SetAt(new_dict_size, new_entry);
   // Remember the new dictionary now.
-  StorePointer(&raw_ptr()->dictionary_, new_dict.raw());
+  raw_ptr()->set_dictionary(new_dict.raw());
 }
 
 void Library::AddObject(const Object& obj, const String& name) const {
@@ -12028,7 +12019,7 @@
 
   // Invalidate the cache of loaded scripts.
   if (loaded_scripts() != Array::null()) {
-    StorePointer(&raw_ptr()->loaded_scripts_, Array::null());
+    raw_ptr()->set_loaded_scripts(Array::null());
   }
 }
 
@@ -12190,7 +12181,7 @@
 
     // Create the array of scripts and cache it in loaded_scripts_.
     const Array& scripts_array = Array::Handle(Array::MakeFixedLength(scripts));
-    StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw());
+    raw_ptr()->set_loaded_scripts(scripts_array.raw());
   }
   return loaded_scripts();
 }
@@ -12456,16 +12447,16 @@
 }
 
 void Library::set_toplevel_class(const Class& value) const {
-  ASSERT(raw_ptr()->toplevel_class_ == Class::null());
-  StorePointer(&raw_ptr()->toplevel_class_, value.raw());
+  ASSERT(raw_ptr()->toplevel_class() == Class::null());
+  raw_ptr()->set_toplevel_class(value.raw());
 }
 
 void Library::set_dependencies(const Array& deps) const {
-  StorePointer(&raw_ptr()->dependencies_, deps.raw());
+  raw_ptr()->set_dependencies(deps.raw());
 }
 
 void Library::set_metadata(const GrowableObjectArray& value) const {
-  StorePointer(&raw_ptr()->metadata_, value.raw());
+  raw_ptr()->set_metadata(value.raw());
 }
 
 LibraryPtr Library::ImportLibraryAt(intptr_t index) const {
@@ -12488,7 +12479,7 @@
   // We need to preserve the "dart-ext:" imports because they are used by
   // Loader::ReloadNativeExtensions().
   intptr_t native_import_count = 0;
-  Array& imports = Array::Handle(raw_ptr()->imports_);
+  Array& imports = Array::Handle(raw_ptr()->imports());
   Namespace& ns = Namespace::Handle();
   Library& lib = Library::Handle();
   String& url = String::Handle();
@@ -12513,13 +12504,13 @@
     }
   }
 
-  StorePointer(&raw_ptr()->imports_, new_imports.raw());
-  StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
+  raw_ptr()->set_imports(new_imports.raw());
+  raw_ptr()->set_exports(Object::empty_array().raw());
   StoreNonPointer(&raw_ptr()->num_imports_, 0);
-  StorePointer(&raw_ptr()->resolved_names_, Array::null());
-  StorePointer(&raw_ptr()->exported_names_, Array::null());
-  StorePointer(&raw_ptr()->loaded_scripts_, Array::null());
-  StorePointer(&raw_ptr()->dependencies_, Array::null());
+  raw_ptr()->set_resolved_names(Array::null());
+  raw_ptr()->set_exported_names(Array::null());
+  raw_ptr()->set_loaded_scripts(Array::null());
+  raw_ptr()->set_dependencies(Array::null());
 }
 
 void Library::AddImport(const Namespace& ns) const {
@@ -12528,7 +12519,7 @@
   if (num_imports() == capacity) {
     capacity = capacity + kImportsCapacityIncrement + (capacity >> 2);
     imports = Array::Grow(imports, capacity);
-    StorePointer(&raw_ptr()->imports_, imports.raw());
+    raw_ptr()->set_imports(imports.raw());
   }
   intptr_t index = num_imports();
   imports.SetAt(index, ns);
@@ -12548,7 +12539,7 @@
   Array& exports = Array::Handle(this->exports());
   intptr_t num_exports = exports.Length();
   exports = Array::Grow(exports, num_exports + 1);
-  StorePointer(&raw_ptr()->exports_, exports.raw());
+  raw_ptr()->set_exports(exports.raw());
   exports.SetAt(num_exports, ns);
 }
 
@@ -12565,12 +12556,12 @@
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   Array& cache = thread->ArrayHandle();
   cache = HashTables::New<ResolvedNamesMap>(64);
-  StorePointer(&raw_ptr()->resolved_names_, cache.raw());
+  raw_ptr()->set_resolved_names(cache.raw());
 }
 
 void Library::ClearResolvedNamesCache() const {
   ASSERT(Thread::Current()->IsMutatorThread());
-  StorePointer(&raw_ptr()->resolved_names_, Array::null());
+  raw_ptr()->set_resolved_names(Array::null());
 }
 
 void Library::InitExportedNamesCache() const {
@@ -12579,11 +12570,11 @@
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   Array& cache = thread->ArrayHandle();
   cache = HashTables::New<ResolvedNamesMap>(16);
-  StorePointer(&raw_ptr()->exported_names_, cache.raw());
+  raw_ptr()->set_exported_names(cache.raw());
 }
 
 void Library::ClearExportedNamesCache() const {
-  StorePointer(&raw_ptr()->exported_names_, Array::null());
+  raw_ptr()->set_exported_names(Array::null());
 }
 
 void Library::InitClassDictionary() const {
@@ -12594,13 +12585,13 @@
   // TODO(iposva): Find reasonable initial size.
   const int kInitialElementCount = 16;
   dictionary = NewDictionary(kInitialElementCount);
-  StorePointer(&raw_ptr()->dictionary_, dictionary.raw());
+  raw_ptr()->set_dictionary(dictionary.raw());
 }
 
 void Library::InitImportList() const {
   const Array& imports =
       Array::Handle(Array::New(kInitialImportsCapacity, Heap::kOld));
-  StorePointer(&raw_ptr()->imports_, imports.raw());
+  raw_ptr()->set_imports(imports.raw());
   StoreNonPointer(&raw_ptr()->num_imports_, 0);
 }
 
@@ -12619,21 +12610,20 @@
   url.Hash();
   const bool dart_scheme = url.StartsWith(Symbols::DartScheme());
   const Library& result = Library::Handle(zone, Library::New());
-  result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw());
-  result.StorePointer(&result.raw_ptr()->url_, url.raw());
-  result.StorePointer(&result.raw_ptr()->resolved_names_, Array::null());
-  result.StorePointer(&result.raw_ptr()->exported_names_, Array::null());
-  result.StorePointer(&result.raw_ptr()->dictionary_,
-                      Object::empty_array().raw());
+  result.raw_ptr()->set_name(Symbols::Empty().raw());
+  result.raw_ptr()->set_url(url.raw());
+  result.raw_ptr()->set_resolved_names(Array::null());
+  result.raw_ptr()->set_exported_names(Array::null());
+  result.raw_ptr()->set_dictionary(Object::empty_array().raw());
   GrowableObjectArray& list = GrowableObjectArray::Handle(zone);
   list = GrowableObjectArray::New(4, Heap::kOld);
-  result.StorePointer(&result.raw_ptr()->metadata_, list.raw());
-  result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null());
+  result.raw_ptr()->set_metadata(list.raw());
+  result.raw_ptr()->set_toplevel_class(Class::null());
   list = GrowableObjectArray::New(Object::empty_array(), Heap::kOld);
-  result.StorePointer(&result.raw_ptr()->used_scripts_, list.raw());
-  result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
-  result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
-  result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null());
+  result.raw_ptr()->set_used_scripts(list.raw());
+  result.raw_ptr()->set_imports(Object::empty_array().raw());
+  result.raw_ptr()->set_exports(Object::empty_array().raw());
+  result.raw_ptr()->set_loaded_scripts(Array::null());
   result.set_native_entry_resolver(NULL);
   result.set_native_entry_symbol_resolver(NULL);
   result.set_flags(0);
@@ -13085,7 +13075,7 @@
     const String& original_key =
         String::Handle(reload_context->FindLibraryPrivateKey(*this));
     if (!original_key.IsNull()) {
-      StorePointer(&raw_ptr()->private_key_, original_key.raw());
+      raw_ptr()->set_private_key(original_key.raw());
       return;
     }
   }
@@ -13107,7 +13097,7 @@
   const String& key =
       String::Handle(zone, String::New(private_key, Heap::kOld));
   key.Hash();  // This string may end up in the VM isolate.
-  StorePointer(&raw_ptr()->private_key_, key.raw());
+  raw_ptr()->set_private_key(key.raw());
 }
 
 const String& Library::PrivateCoreLibName(const String& member) {
@@ -13332,11 +13322,11 @@
 
 void LibraryPrefix::set_name(const String& value) const {
   ASSERT(value.IsSymbol());
-  StorePointer(&raw_ptr()->name_, value.raw());
+  raw_ptr()->set_name(value.raw());
 }
 
 void LibraryPrefix::set_imports(const Array& value) const {
-  StorePointer(&raw_ptr()->imports_, value.raw());
+  raw_ptr()->set_imports(value.raw());
 }
 
 void LibraryPrefix::set_num_imports(intptr_t value) const {
@@ -13347,7 +13337,7 @@
 }
 
 void LibraryPrefix::set_importer(const Library& value) const {
-  StorePointer(&raw_ptr()->importer_, value.raw());
+  raw_ptr()->set_importer(value.raw());
 }
 
 const char* LibraryPrefix::ToCString() const {
@@ -13356,7 +13346,7 @@
 }
 
 void Namespace::set_metadata_field(const Field& value) const {
-  StorePointer(&raw_ptr()->metadata_field_, value.raw());
+  raw_ptr()->set_metadata_field(value.raw());
 }
 
 void Namespace::AddMetadata(const Object& owner,
@@ -13528,9 +13518,9 @@
   ASSERT(show_names.IsNull() || (show_names.Length() > 0));
   ASSERT(hide_names.IsNull() || (hide_names.Length() > 0));
   const Namespace& result = Namespace::Handle(Namespace::New());
-  result.StorePointer(&result.raw_ptr()->library_, library.raw());
-  result.StorePointer(&result.raw_ptr()->show_names_, show_names.raw());
-  result.StorePointer(&result.raw_ptr()->hide_names_, hide_names.raw());
+  result.raw_ptr()->set_library(library.raw());
+  result.raw_ptr()->set_show_names(show_names.raw());
+  result.raw_ptr()->set_hide_names(hide_names.raw());
   return result.raw();
 }
 
@@ -13555,19 +13545,16 @@
     const uint32_t binary_version) {
   const KernelProgramInfo& info =
       KernelProgramInfo::Handle(KernelProgramInfo::New());
-  info.StorePointer(&info.raw_ptr()->string_offsets_, string_offsets.raw());
-  info.StorePointer(&info.raw_ptr()->string_data_, string_data.raw());
-  info.StorePointer(&info.raw_ptr()->canonical_names_, canonical_names.raw());
-  info.StorePointer(&info.raw_ptr()->metadata_payloads_,
-                    metadata_payloads.raw());
-  info.StorePointer(&info.raw_ptr()->metadata_mappings_,
-                    metadata_mappings.raw());
-  info.StorePointer(&info.raw_ptr()->scripts_, scripts.raw());
-  info.StorePointer(&info.raw_ptr()->constants_table_, constants_table.raw());
-  info.StorePointer(&info.raw_ptr()->libraries_cache_, libraries_cache.raw());
-  info.StorePointer(&info.raw_ptr()->classes_cache_, classes_cache.raw());
-  info.StorePointer(&info.raw_ptr()->retained_kernel_blob_,
-                    retained_kernel_blob.raw());
+  info.raw_ptr()->set_string_offsets(string_offsets.raw());
+  info.raw_ptr()->set_string_data(string_data.raw());
+  info.raw_ptr()->set_canonical_names(canonical_names.raw());
+  info.raw_ptr()->set_metadata_payloads(metadata_payloads.raw());
+  info.raw_ptr()->set_metadata_mappings(metadata_mappings.raw());
+  info.raw_ptr()->set_scripts(scripts.raw());
+  info.raw_ptr()->set_constants_table(constants_table.raw());
+  info.raw_ptr()->set_libraries_cache(libraries_cache.raw());
+  info.raw_ptr()->set_classes_cache(classes_cache.raw());
+  info.raw_ptr()->set_retained_kernel_blob(retained_kernel_blob.raw());
   info.set_kernel_binary_version(binary_version);
   return info.raw();
 }
@@ -13583,11 +13570,11 @@
 }
 
 void KernelProgramInfo::set_scripts(const Array& scripts) const {
-  StorePointer(&raw_ptr()->scripts_, scripts.raw());
+  raw_ptr()->set_scripts(scripts.raw());
 }
 
 void KernelProgramInfo::set_constants(const Array& constants) const {
-  StorePointer(&raw_ptr()->constants_, constants.raw());
+  raw_ptr()->set_constants(constants.raw());
 }
 
 void KernelProgramInfo::set_kernel_binary_version(uint32_t version) const {
@@ -13596,21 +13583,21 @@
 
 void KernelProgramInfo::set_constants_table(
     const ExternalTypedData& value) const {
-  StorePointer(&raw_ptr()->constants_table_, value.raw());
+  raw_ptr()->set_constants_table(value.raw());
 }
 
 void KernelProgramInfo::set_potential_natives(
     const GrowableObjectArray& candidates) const {
-  StorePointer(&raw_ptr()->potential_natives_, candidates.raw());
+  raw_ptr()->set_potential_natives(candidates.raw());
 }
 
 void KernelProgramInfo::set_potential_pragma_functions(
     const GrowableObjectArray& candidates) const {
-  StorePointer(&raw_ptr()->potential_pragma_functions_, candidates.raw());
+  raw_ptr()->set_potential_pragma_functions(candidates.raw());
 }
 
 void KernelProgramInfo::set_libraries_cache(const Array& cache) const {
-  StorePointer(&raw_ptr()->libraries_cache_, cache.raw());
+  raw_ptr()->set_libraries_cache(cache.raw());
 }
 
 typedef UnorderedHashMap<SmiTraits> IntHashMap;
@@ -13626,8 +13613,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    Isolate* isolate = thread->isolate();
-    SafepointMutexLocker ml(isolate->kernel_data_lib_cache_mutex());
+    SafepointMutexLocker ml(
+        thread->isolate_group()->kernel_data_lib_cache_mutex());
     data = libraries_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -13649,8 +13636,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    Isolate* isolate = thread->isolate();
-    SafepointMutexLocker ml(isolate->kernel_data_lib_cache_mutex());
+    SafepointMutexLocker ml(
+        thread->isolate_group()->kernel_data_lib_cache_mutex());
     data = libraries_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -13661,7 +13648,7 @@
 }
 
 void KernelProgramInfo::set_classes_cache(const Array& cache) const {
-  StorePointer(&raw_ptr()->classes_cache_, cache.raw());
+  raw_ptr()->set_classes_cache(cache.raw());
 }
 
 ClassPtr KernelProgramInfo::LookupClass(Thread* thread,
@@ -13675,8 +13662,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    Isolate* isolate = thread->isolate();
-    SafepointMutexLocker ml(isolate->kernel_data_class_cache_mutex());
+    SafepointMutexLocker ml(
+        thread->isolate_group()->kernel_data_class_cache_mutex());
     data = classes_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -13698,8 +13685,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    Isolate* isolate = thread->isolate();
-    SafepointMutexLocker ml(isolate->kernel_data_class_cache_mutex());
+    SafepointMutexLocker ml(
+        thread->isolate_group()->kernel_data_class_cache_mutex());
     data = classes_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -14667,19 +14654,19 @@
   ASSERT((try_index >= 0) && (try_index < num_entries()));
   ASSERT(!handled_types.IsNull());
   const Array& handled_types_data =
-      Array::Handle(raw_ptr()->handled_types_data_);
+      Array::Handle(raw_ptr()->handled_types_data());
   handled_types_data.SetAt(try_index, handled_types);
 }
 
 ArrayPtr ExceptionHandlers::GetHandledTypes(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
-  Array& array = Array::Handle(raw_ptr()->handled_types_data_);
+  Array& array = Array::Handle(raw_ptr()->handled_types_data());
   array ^= array.At(try_index);
   return array.raw();
 }
 
 void ExceptionHandlers::set_handled_types_data(const Array& value) const {
-  StorePointer(&raw_ptr()->handled_types_data_, value.raw());
+  raw_ptr()->set_handled_types_data(value.raw());
 }
 
 ExceptionHandlersPtr ExceptionHandlers::New(intptr_t num_handlers) {
@@ -14781,7 +14768,7 @@
 }
 
 void SingleTargetCache::set_target(const Code& value) const {
-  StorePointer(&raw_ptr()->target_, value.raw());
+  raw_ptr()->set_target(value.raw());
 }
 
 const char* SingleTargetCache::ToCString() const {
@@ -14837,7 +14824,7 @@
   result ^=
       Object::Allocate(MonomorphicSmiableCall::kClassId,
                        MonomorphicSmiableCall::InstanceSize(), Heap::kOld);
-  result.StorePointer(&result.raw_ptr()->target_, target.raw());
+  result.raw_ptr()->set_target(target.raw());
   result.StoreNonPointer(&result.raw_ptr()->expected_cid_, expected_cid);
   result.StoreNonPointer(&result.raw_ptr()->entrypoint_, target.EntryPoint());
   return result.raw();
@@ -14855,17 +14842,17 @@
 
 void CallSiteData::set_target_name(const String& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->target_name_, value.raw());
+  raw_ptr()->set_target_name(value.raw());
 }
 
 void CallSiteData::set_arguments_descriptor(const Array& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->args_descriptor_, value.raw());
+  raw_ptr()->set_args_descriptor(value.raw());
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 void ICData::SetReceiversStaticType(const AbstractType& type) const {
-  StorePointer(&raw_ptr()->receivers_static_type_, type.raw());
+  raw_ptr()->set_receivers_static_type(type.raw());
 
 #if defined(TARGET_ARCH_X64)
   if (!type.IsNull() && type.HasTypeClass() && (NumArgsTested() == 1) &&
@@ -14909,7 +14896,7 @@
 }
 
 FunctionPtr ICData::Owner() const {
-  Object& obj = Object::Handle(raw_ptr()->owner_);
+  Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsNull()) {
     ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
     return Function::null();
@@ -14926,7 +14913,7 @@
   if (IsNull()) {
     return ICData::null();
   }
-  Object& obj = Object::Handle(raw_ptr()->owner_);
+  Object& obj = Object::Handle(raw_ptr()->owner());
   if (obj.IsFunction()) {
     return this->raw();
   } else {
@@ -14937,11 +14924,11 @@
 void ICData::SetOriginal(const ICData& value) const {
   ASSERT(value.IsOriginal());
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
+  raw_ptr()->set_owner(static_cast<ObjectPtr>(value.raw()));
 }
 
 void ICData::set_owner(const Function& value) const {
-  StorePointer(&raw_ptr()->owner_, static_cast<ObjectPtr>(value.raw()));
+  raw_ptr()->set_owner(static_cast<ObjectPtr>(value.raw()));
 }
 
 void ICData::set_deopt_id(intptr_t value) const {
@@ -14955,8 +14942,7 @@
 
 void ICData::set_entries(const Array& value) const {
   ASSERT(!value.IsNull());
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->entries_,
-                                                    value.raw());
+  raw_ptr()->set_entries<std::memory_order_release>(value.raw());
 }
 
 intptr_t ICData::NumArgsTested() const {
@@ -15065,7 +15051,7 @@
 }
 
 intptr_t ICData::Length() const {
-  return (Smi::Value(entries()->ptr()->length_) / TestEntryLength());
+  return (Smi::Value(entries()->ptr()->length()) / TestEntryLength());
 }
 
 intptr_t ICData::NumberOfChecks() const {
@@ -15990,7 +15976,7 @@
     NoSafepointScope no_safepoint;
 
     result ^= raw;
-    result.StorePointer(&result.raw_ptr()->target_, target.raw());
+    result.raw_ptr()->set_target(target.raw());
   }
   return result.raw();
 }
@@ -16091,7 +16077,7 @@
   ASSERT(unwrapped_owner.IsFunction() || unwrapped_owner.IsClass() ||
          unwrapped_owner.IsAbstractType());
 #endif
-  StorePointer(&raw_ptr()->owner_, owner.raw());
+  raw_ptr()->set_owner(owner.raw());
 }
 
 void Code::set_state_bits(intptr_t bits) const {
@@ -16112,31 +16098,28 @@
 
 void Code::set_compressed_stackmaps(const CompressedStackMaps& maps) const {
   ASSERT(maps.IsOld());
-  StorePointer(&raw_ptr()->compressed_stackmaps_, maps.raw());
+  raw_ptr()->set_compressed_stackmaps(maps.raw());
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 intptr_t Code::num_variables() const {
   ASSERT(!FLAG_precompiled_mode);
-  return Smi::Value(Smi::RawCast(raw_ptr()->catch_entry_));
+  return Smi::Value(Smi::RawCast(raw_ptr()->catch_entry()));
 }
 void Code::set_num_variables(intptr_t num_variables) const {
   ASSERT(!FLAG_precompiled_mode);
-  // Object::RawCast is needed for StorePointer template argument resolution.
-  StorePointer(&raw_ptr()->catch_entry_,
-               Object::RawCast(Smi::New(num_variables)));
+  raw_ptr()->set_catch_entry(Smi::New(num_variables));
 }
 #endif
 
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
 TypedDataPtr Code::catch_entry_moves_maps() const {
   ASSERT(FLAG_precompiled_mode);
-  return TypedData::RawCast(raw_ptr()->catch_entry_);
+  return TypedData::RawCast(raw_ptr()->catch_entry());
 }
 void Code::set_catch_entry_moves_maps(const TypedData& maps) const {
   ASSERT(FLAG_precompiled_mode);
-  // Object::RawCast is needed for StorePointer template argument resolution.
-  StorePointer(&raw_ptr()->catch_entry_, Object::RawCast(maps.raw()));
+  raw_ptr()->set_catch_entry(maps.raw());
 }
 #endif
 
@@ -16145,7 +16128,7 @@
   UNREACHABLE();
 #else
   ASSERT(array.IsOld());
-  StorePointer(&raw_ptr()->deopt_info_array_, array.raw());
+  raw_ptr()->set_deopt_info_array(array.raw());
 #endif
 }
 
@@ -16153,7 +16136,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  StorePointer(&raw_ptr()->static_calls_target_table_, value.raw());
+  raw_ptr()->set_static_calls_target_table(value.raw());
 #endif
 #if defined(DEBUG)
   // Check that the table is sorted by pc offsets.
@@ -16226,7 +16209,7 @@
   UNREACHABLE();
 #else
   NoSafepointScope no_safepoint;
-  const Array& table = Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& table = Array::Handle(raw_ptr()->static_calls_target_table());
   StaticCallsTable entries(table);
   const intptr_t pc_offset = pc - PayloadStart();
   intptr_t imin = 0;
@@ -16256,7 +16239,7 @@
   if (i < 0) {
     return Function::null();
   }
-  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table());
   StaticCallsTable entries(array);
   return entries[i].Get<kSCallTableFunctionTarget>();
 #endif
@@ -16268,7 +16251,7 @@
 #else
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
-  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table());
   StaticCallsTable entries(array);
   ASSERT(code.IsNull() ||
          (code.function() == entries[i].Get<kSCallTableFunctionTarget>()));
@@ -16282,7 +16265,7 @@
 #else
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
-  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
+  const Array& array = Array::Handle(raw_ptr()->static_calls_target_table());
   StaticCallsTable entries(array);
 #if defined(DEBUG)
   if (entries[i].Get<kSCallTableFunctionTarget>() == Function::null()) {
@@ -16314,7 +16297,7 @@
 #if defined(PRODUCT)
   Comments* comments = new Code::Comments(Array::Handle());
 #else
-  Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_));
+  Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments()));
 #endif
   return *comments;
 }
@@ -16324,7 +16307,7 @@
   UNREACHABLE();
 #else
   ASSERT(comments.comments_.IsOld());
-  StorePointer(&raw_ptr()->comments_, comments.comments_.raw());
+  raw_ptr()->set_comments(comments.comments_.raw());
 #endif
 }
 
@@ -16333,9 +16316,7 @@
   UNREACHABLE();
 #else
   ASSERT(offset >= 0);
-  StoreSmi(
-      reinterpret_cast<SmiPtr const*>(&raw_ptr()->return_address_metadata_),
-      Smi::New(offset));
+  raw_ptr()->set_return_address_metadata(Smi::New(offset));
 #endif
 }
 
@@ -16344,7 +16325,7 @@
   UNREACHABLE();
   return -1;
 #else
-  const Object& object = Object::Handle(raw_ptr()->return_address_metadata_);
+  const Object& object = Object::Handle(raw_ptr()->return_address_metadata());
   // In the future we may put something other than a smi in
   // |return_address_metadata_|.
   if (object.IsNull() || !object.IsSmi()) {
@@ -16355,12 +16336,12 @@
 }
 
 ArrayPtr Code::inlined_id_to_function() const {
-  return raw_ptr()->inlined_id_to_function_;
+  return raw_ptr()->inlined_id_to_function();
 }
 
 void Code::set_inlined_id_to_function(const Array& value) const {
   ASSERT(value.IsOld());
-  StorePointer(&raw_ptr()->inlined_id_to_function_, value.raw());
+  raw_ptr()->set_inlined_id_to_function(value.raw());
 }
 
 CodePtr Code::New(intptr_t pointer_offsets_length) {
@@ -16801,7 +16782,7 @@
   DEBUG_ASSERT(IsMutatorOrAtSafepoint() || !is_alive());
   // RawInstructions are never allocated in New space and hence a
   // store buffer update is not needed here.
-  StorePointer(&raw_ptr()->active_instructions_, instructions.raw());
+  raw_ptr()->set_active_instructions(instructions.raw());
   Code::InitializeCachedEntryPointsFrom(raw(), instructions.raw(),
                                         unchecked_offset);
 #endif
@@ -17109,22 +17090,22 @@
 }
 
 ArrayPtr MegamorphicCache::buckets() const {
-  return raw_ptr()->buckets_;
+  return raw_ptr()->buckets();
 }
 
 void MegamorphicCache::set_buckets(const Array& buckets) const {
-  StorePointer(&raw_ptr()->buckets_, buckets.raw());
+  raw_ptr()->set_buckets(buckets.raw());
 }
 
 // Class IDs in the table are smi-tagged, so we use a smi-tagged mask
 // and target class ID to avoid untagging (on each iteration of the
 // test loop) in generated code.
 intptr_t MegamorphicCache::mask() const {
-  return Smi::Value(raw_ptr()->mask_);
+  return Smi::Value(raw_ptr()->mask());
 }
 
 void MegamorphicCache::set_mask(intptr_t mask) const {
-  StoreSmi(&raw_ptr()->mask_, Smi::New(mask));
+  raw_ptr()->set_mask(Smi::New(mask));
 }
 
 intptr_t MegamorphicCache::filled_entry_count() const {
@@ -17351,21 +17332,20 @@
 ArrayPtr SubtypeTestCache::cache() const {
   // We rely on the fact that any loads from the array are dependent loads and
   // avoid the load-acquire barrier here.
-  return raw_ptr()->cache_;
+  return raw_ptr()->cache<std::memory_order_relaxed>();
 }
 
 void SubtypeTestCache::set_cache(const Array& value) const {
   // We have to ensure that initializing stores to the array are available
   // when releasing the pointer to the array pointer.
   // => We have to use store-release here.
-  StorePointer<ArrayPtr, std::memory_order_release>(&raw_ptr()->cache_,
-                                                    value.raw());
+  raw_ptr()->set_cache<std::memory_order_release>(value.raw());
 }
 
 intptr_t SubtypeTestCache::NumberOfChecks() const {
   NoSafepointScope no_safepoint;
   // Do not count the sentinel;
-  return (Smi::Value(cache()->ptr()->length_) / kTestEntryLength) - 1;
+  return (Smi::Value(cache()->ptr()->length()) / kTestEntryLength) - 1;
 }
 
 void SubtypeTestCache::AddCheck(
@@ -17632,17 +17612,17 @@
 }
 
 LoadingUnitPtr LoadingUnit::parent() const {
-  return raw_ptr()->parent_;
+  return raw_ptr()->parent();
 }
 void LoadingUnit::set_parent(const LoadingUnit& value) const {
-  StorePointer(&raw_ptr()->parent_, value.raw());
+  raw_ptr()->set_parent(value.raw());
 }
 
 ArrayPtr LoadingUnit::base_objects() const {
-  return raw_ptr()->base_objects_;
+  return raw_ptr()->base_objects();
 }
 void LoadingUnit::set_base_objects(const Array& value) const {
-  StorePointer(&raw_ptr()->base_objects_, value.raw());
+  raw_ptr()->set_base_objects(value.raw());
 }
 
 const char* LoadingUnit::ToCString() const {
@@ -17724,7 +17704,7 @@
 }
 
 void ApiError::set_message(const String& message) const {
-  StorePointer(&raw_ptr()->message_, message.raw());
+  raw_ptr()->set_message(message.raw());
 }
 
 const char* ApiError::ToErrorCString() const {
@@ -17804,11 +17784,11 @@
 }
 
 void LanguageError::set_previous_error(const Error& value) const {
-  StorePointer(&raw_ptr()->previous_error_, value.raw());
+  raw_ptr()->set_previous_error(value.raw());
 }
 
 void LanguageError::set_script(const Script& value) const {
-  StorePointer(&raw_ptr()->script_, value.raw());
+  raw_ptr()->set_script(value.raw());
 }
 
 void LanguageError::set_token_pos(TokenPosition token_pos) const {
@@ -17825,11 +17805,11 @@
 }
 
 void LanguageError::set_message(const String& value) const {
-  StorePointer(&raw_ptr()->message_, value.raw());
+  raw_ptr()->set_message(value.raw());
 }
 
 void LanguageError::set_formatted_message(const String& value) const {
-  StorePointer(&raw_ptr()->formatted_message_, value.raw());
+  raw_ptr()->set_formatted_message(value.raw());
 }
 
 StringPtr LanguageError::FormatMessage() const {
@@ -17891,11 +17871,11 @@
 }
 
 void UnhandledException::set_exception(const Instance& exception) const {
-  StorePointer(&raw_ptr()->exception_, exception.raw());
+  raw_ptr()->set_exception(exception.raw());
 }
 
 void UnhandledException::set_stacktrace(const Instance& stacktrace) const {
-  StorePointer(&raw_ptr()->stacktrace_, stacktrace.raw());
+  raw_ptr()->set_stacktrace(stacktrace.raw());
 }
 
 const char* UnhandledException::ToErrorCString() const {
@@ -17948,7 +17928,7 @@
 }
 
 void UnwindError::set_message(const String& message) const {
-  StorePointer(&raw_ptr()->message_, message.raw());
+  raw_ptr()->set_message(message.raw());
 }
 
 void UnwindError::set_is_user_initiated(bool value) const {
@@ -18300,7 +18280,8 @@
 }
 
 InstancePtr Instance::Canonicalize(Thread* thread) const {
-  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  SafepointMutexLocker ml(
+      thread->isolate_group()->constant_canonicalization_mutex());
   return CanonicalizeLocked(thread);
 }
 
@@ -18332,10 +18313,10 @@
 #if defined(DEBUG)
 bool Instance::CheckIsCanonical(Thread* thread) const {
   Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
   Instance& result = Instance::Handle(zone);
   const Class& cls = Class::Handle(zone, this->clazz());
-  SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+  SafepointMutexLocker ml(
+      thread->isolate_group()->constant_canonicalization_mutex());
   result ^= cls.LookupCanonicalInstance(zone, *this);
   return (result.raw() == this->raw());
 }
@@ -19621,7 +19602,7 @@
   } else {
     StoreNonPointer(&raw_ptr()->type_test_stub_entry_point_, stub.EntryPoint());
   }
-  StorePointer(&raw_ptr()->type_test_stub_, stub.raw());
+  raw_ptr()->set_type_test_stub(stub.raw());
 }
 
 TypePtr Type::NullType() {
@@ -19783,20 +19764,20 @@
 }
 
 FunctionPtr Type::signature() const {
-  intptr_t cid = raw_ptr()->signature_->GetClassId();
+  intptr_t cid = raw_ptr()->signature()->GetClassId();
   if (cid == kNullCid) {
     return Function::null();
   }
   ASSERT(cid == kFunctionCid);
-  return Function::RawCast(raw_ptr()->signature_);
+  return Function::RawCast(raw_ptr()->signature());
 }
 
 void Type::set_signature(const Function& value) const {
-  StorePointer(&raw_ptr()->signature_, value.raw());
+  raw_ptr()->set_signature(value.raw());
 }
 
 classid_t Type::type_class_id() const {
-  return Smi::Value(raw_ptr()->type_class_id_);
+  return Smi::Value(raw_ptr()->type_class_id());
 }
 
 ClassPtr Type::type_class() const {
@@ -20374,12 +20355,12 @@
 
 void Type::set_type_class(const Class& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->type_class_id_, Smi::New(value.id()));
+  raw_ptr()->set_type_class_id(Smi::New(value.id()));
 }
 
 void Type::set_arguments(const TypeArguments& value) const {
   ASSERT(!IsCanonical());
-  StorePointer(&raw_ptr()->arguments_, value.raw());
+  raw_ptr()->set_arguments(value.raw());
 }
 
 TypePtr Type::New(Heap::Space space) {
@@ -20526,7 +20507,7 @@
 void TypeRef::set_type(const AbstractType& value) const {
   ASSERT(value.IsNull() || value.IsFunctionType() || value.HasTypeClass());
   ASSERT(!value.IsTypeRef());
-  StorePointer(&raw_ptr()->type_, value.raw());
+  raw_ptr()->set_type(value.raw());
 }
 
 // A TypeRef cannot be canonical by definition. Only its referenced type can be.
@@ -20781,7 +20762,7 @@
 }
 
 void TypeParameter::set_parameterized_function(const Function& value) const {
-  StorePointer(&raw_ptr()->parameterized_function_, value.raw());
+  raw_ptr()->set_parameterized_function(value.raw());
 }
 
 void TypeParameter::set_index(intptr_t value) const {
@@ -20792,15 +20773,15 @@
 
 void TypeParameter::set_name(const String& value) const {
   ASSERT(value.IsSymbol());
-  StorePointer(&raw_ptr()->name_, value.raw());
+  raw_ptr()->set_name(value.raw());
 }
 
 void TypeParameter::set_bound(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->bound_, value.raw());
+  raw_ptr()->set_bound(value.raw());
 }
 
 void TypeParameter::set_default_argument(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->default_argument_, value.raw());
+  raw_ptr()->set_default_argument(value.raw());
 }
 
 AbstractTypePtr TypeParameter::GetFromTypeArguments(
@@ -21462,7 +21443,8 @@
 
 MintPtr Mint::NewCanonical(int64_t value) {
   Thread* thread = Thread::Current();
-  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  SafepointMutexLocker ml(
+      thread->isolate_group()->constant_canonicalization_mutex());
   return NewCanonicalLocked(thread, value);
 }
 
@@ -21589,7 +21571,8 @@
 
 DoublePtr Double::NewCanonical(double value) {
   Thread* thread = Thread::Current();
-  SafepointMutexLocker ml(thread->isolate()->constant_canonicalization_mutex());
+  SafepointMutexLocker ml(
+      thread->isolate_group()->constant_canonicalization_mutex());
   return NewCanonicalLocked(thread, value);
 }
 
@@ -21687,7 +21670,7 @@
 
 intptr_t String::Hash(StringPtr raw) {
   StringHasher hasher;
-  uword length = Smi::Value(raw->ptr()->length_);
+  uword length = Smi::Value(raw->ptr()->length());
   if (raw->IsOneByteString() || raw->IsExternalOneByteString()) {
     const uint8_t* data;
     if (raw->IsOneByteString()) {
@@ -22684,9 +22667,9 @@
                                      OneByteString::InstanceSize(len), space);
     NoSafepointScope no_safepoint;
     OneByteStringPtr result = static_cast<OneByteStringPtr>(raw);
-    result->ptr()->StoreSmi(&(result->ptr()->length_), Smi::New(len));
+    result->ptr()->set_length(Smi::New(len));
 #if !defined(HASH_IN_OBJECT_HEADER)
-    result->ptr()->StoreSmi(&(result->ptr()->hash_), Smi::New(0));
+    result->ptr()->set_hash(Smi::New(0));
 #endif
     return result;
   }
@@ -23196,7 +23179,7 @@
     ArrayPtr raw = static_cast<ArrayPtr>(
         Object::Allocate(class_id, Array::InstanceSize(len), space));
     NoSafepointScope no_safepoint;
-    raw->ptr()->StoreSmi(&(raw->ptr()->length_), Smi::New(len));
+    raw->ptr()->set_length(Smi::New(len));
     return raw;
   }
 }
@@ -23383,7 +23366,7 @@
   const Array& contents = Array::Handle(data());
   const Array& new_contents =
       Array::Handle(Array::Grow(contents, new_capacity, space));
-  StorePointer(&(raw_ptr()->data_), new_contents.raw());
+  raw_ptr()->set_data(new_contents.raw());
 }
 
 ObjectPtr GrowableObjectArray::RemoveLast() const {
@@ -24000,11 +23983,10 @@
                                      ReceivePort::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
-    result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
+    result.raw_ptr()->set_send_port(send_port.raw());
 #if !defined(PRODUCT)
-    result.StorePointer(&result.raw_ptr()->debug_name_, debug_name.raw());
-    result.StorePointer(&result.raw_ptr()->allocation_location_,
-                        allocation_location_.raw());
+    result.raw_ptr()->set_debug_name(debug_name.raw());
+    result.raw_ptr()->set_allocation_location(allocation_location_.raw());
 #endif  // !defined(PRODUCT)
   }
   if (is_control_port) {
@@ -24192,14 +24174,13 @@
         Object::Allocate(Closure::kClassId, Closure::InstanceSize(), space);
     NoSafepointScope no_safepoint;
     result ^= raw;
-    result.StorePointer(&result.raw_ptr()->instantiator_type_arguments_,
-                        instantiator_type_arguments.raw());
-    result.StorePointer(&result.raw_ptr()->function_type_arguments_,
-                        function_type_arguments.raw());
-    result.StorePointer(&result.raw_ptr()->delayed_type_arguments_,
-                        delayed_type_arguments.raw());
-    result.StorePointer(&result.raw_ptr()->function_, function.raw());
-    result.StorePointer(&result.raw_ptr()->context_, context.raw());
+    result.raw_ptr()->set_instantiator_type_arguments(
+        instantiator_type_arguments.raw());
+    result.raw_ptr()->set_function_type_arguments(
+        function_type_arguments.raw());
+    result.raw_ptr()->set_delayed_type_arguments(delayed_type_arguments.raw());
+    result.raw_ptr()->set_function(function.raw());
+    result.raw_ptr()->set_context(context.raw());
   }
   return result.raw();
 }
@@ -24247,42 +24228,42 @@
 }
 
 intptr_t StackTrace::Length() const {
-  const Array& code_array = Array::Handle(raw_ptr()->code_array_);
+  const Array& code_array = Array::Handle(raw_ptr()->code_array());
   return code_array.Length();
 }
 
 ObjectPtr StackTrace::CodeAtFrame(intptr_t frame_index) const {
-  const Array& code_array = Array::Handle(raw_ptr()->code_array_);
+  const Array& code_array = Array::Handle(raw_ptr()->code_array());
   return code_array.At(frame_index);
 }
 
 void StackTrace::SetCodeAtFrame(intptr_t frame_index,
                                 const Object& code) const {
-  const Array& code_array = Array::Handle(raw_ptr()->code_array_);
+  const Array& code_array = Array::Handle(raw_ptr()->code_array());
   code_array.SetAt(frame_index, code);
 }
 
 SmiPtr StackTrace::PcOffsetAtFrame(intptr_t frame_index) const {
-  const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
+  const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array());
   return static_cast<SmiPtr>(pc_offset_array.At(frame_index));
 }
 
 void StackTrace::SetPcOffsetAtFrame(intptr_t frame_index,
                                     const Smi& pc_offset) const {
-  const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
+  const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array());
   pc_offset_array.SetAt(frame_index, pc_offset);
 }
 
 void StackTrace::set_async_link(const StackTrace& async_link) const {
-  StorePointer(&raw_ptr()->async_link_, async_link.raw());
+  raw_ptr()->set_async_link(async_link.raw());
 }
 
 void StackTrace::set_code_array(const Array& code_array) const {
-  StorePointer(&raw_ptr()->code_array_, code_array.raw());
+  raw_ptr()->set_code_array(code_array.raw());
 }
 
 void StackTrace::set_pc_offset_array(const Array& pc_offset_array) const {
-  StorePointer(&raw_ptr()->pc_offset_array_, pc_offset_array.raw());
+  raw_ptr()->set_pc_offset_array(pc_offset_array.raw());
 }
 
 void StackTrace::set_expand_inlined(bool value) const {
@@ -24608,7 +24589,7 @@
                     "symbolize stack traces in the precompiled runtime.");
 
 void RegExp::set_pattern(const String& pattern) const {
-  StorePointer(&raw_ptr()->pattern_, pattern.raw());
+  raw_ptr()->set_pattern(pattern.raw());
 }
 
 void RegExp::set_function(intptr_t cid,
@@ -24622,25 +24603,25 @@
                           const TypedData& bytecode) const {
   if (sticky) {
     if (is_one_byte) {
-      StorePointer(&raw_ptr()->one_byte_sticky_.bytecode_, bytecode.raw());
+      raw_ptr()->set_one_byte_sticky(bytecode.raw());
     } else {
-      StorePointer(&raw_ptr()->two_byte_sticky_.bytecode_, bytecode.raw());
+      raw_ptr()->set_two_byte_sticky(bytecode.raw());
     }
   } else {
     if (is_one_byte) {
-      StorePointer(&raw_ptr()->one_byte_.bytecode_, bytecode.raw());
+      raw_ptr()->set_one_byte(bytecode.raw());
     } else {
-      StorePointer(&raw_ptr()->two_byte_.bytecode_, bytecode.raw());
+      raw_ptr()->set_two_byte(bytecode.raw());
     }
   }
 }
 
 void RegExp::set_num_bracket_expressions(intptr_t value) const {
-  StoreSmi(&raw_ptr()->num_bracket_expressions_, Smi::New(value));
+  raw_ptr()->set_num_bracket_expressions(Smi::New(value));
 }
 
 void RegExp::set_capture_name_map(const Array& array) const {
-  StorePointer(&raw_ptr()->capture_name_map_, array.raw());
+  raw_ptr()->set_capture_name_map(array.raw());
 }
 
 RegExpPtr RegExp::New(Heap::Space space) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ada80f9..59377eb 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -229,9 +229,9 @@
 
 #define HEAP_OBJECT_IMPLEMENTATION(object, super)                              \
   OBJECT_IMPLEMENTATION(object, super);                                        \
-  const object##Layout* raw_ptr() const {                                      \
+  object##Layout* raw_ptr() const {                                            \
     ASSERT(raw() != null());                                                   \
-    return raw()->ptr();                                                       \
+    return const_cast<object##Layout*>(raw()->ptr());                          \
   }                                                                            \
   SNAPSHOT_READER_SUPPORT(object)                                              \
   friend class StackFrame;                                                     \
@@ -253,9 +253,9 @@
   object() : super() {}                                                        \
   BASE_OBJECT_IMPLEMENTATION(object, super)                                    \
   OBJECT_SERVICE_SUPPORT(object)                                               \
-  const object##Layout* raw_ptr() const {                                      \
+  object##Layout* raw_ptr() const {                                            \
     ASSERT(raw() != null());                                                   \
-    return raw()->ptr();                                                       \
+    return const_cast<object##Layout*>(raw()->ptr());                          \
   }                                                                            \
   static intptr_t NextFieldOffset() { return -kWordSize; }                     \
   SNAPSHOT_READER_SUPPORT(rettype)                                             \
@@ -1041,7 +1041,7 @@
 
   virtual StringPtr DictionaryName() const { return Name(); }
 
-  ScriptPtr script() const { return raw_ptr()->script_; }
+  ScriptPtr script() const { return raw_ptr()->script(); }
   void set_script(const Script& value) const;
 
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
@@ -1053,7 +1053,7 @@
 
   // This class represents a typedef if the signature function is not null.
   FunctionPtr signature_function() const {
-    return raw_ptr()->signature_function_;
+    return raw_ptr()->signature_function();
   }
   void set_signature_function(const Function& value) const;
 
@@ -1076,14 +1076,14 @@
     return OFFSET_OF(ClassLayout, declaration_type_);
   }
 
-  LibraryPtr library() const { return raw_ptr()->library_; }
+  LibraryPtr library() const { return raw_ptr()->library(); }
   void set_library(const Library& value) const;
 
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   TypeArgumentsPtr type_parameters() const {
     ASSERT(is_declaration_loaded());
-    return raw_ptr()->type_parameters_;
+    return raw_ptr()->type_parameters();
   }
   void set_type_parameters(const TypeArguments& value) const;
   intptr_t NumTypeParameters(Thread* thread) const;
@@ -1171,7 +1171,7 @@
   // The super type of this class, Object type if not explicitly specified.
   AbstractTypePtr super_type() const {
     ASSERT(is_declaration_loaded());
-    return raw_ptr()->super_type_;
+    return raw_ptr()->super_type();
   }
   void set_super_type(const AbstractType& value) const;
   static intptr_t super_type_offset() {
@@ -1187,7 +1187,7 @@
   // Interfaces is an array of Types.
   ArrayPtr interfaces() const {
     ASSERT(is_declaration_loaded());
-    return raw_ptr()->interfaces_;
+    return raw_ptr()->interfaces();
   }
   void set_interfaces(const Array& value) const;
 
@@ -1195,7 +1195,7 @@
   GrowableObjectArrayPtr direct_implementors() const {
     DEBUG_ASSERT(
         IsolateGroup::Current()->program_lock()->IsCurrentThreadReader());
-    return raw_ptr()->direct_implementors_;
+    return raw_ptr()->direct_implementors();
   }
   void AddDirectImplementor(const Class& subclass, bool is_mixin) const;
   void ClearDirectImplementors() const;
@@ -1207,7 +1207,7 @@
     return direct_subclasses_unsafe();
   }
   GrowableObjectArrayPtr direct_subclasses_unsafe() const {
-    return raw_ptr()->direct_subclasses_;
+    return raw_ptr()->direct_subclasses();
   }
   void AddDirectSubclass(const Class& subclass) const;
   void ClearDirectSubclasses() const;
@@ -1249,7 +1249,7 @@
   static bool IsInFullSnapshot(ClassPtr cls) {
     NoSafepointScope no_safepoint;
     return LibraryLayout::InFullSnapshotBit::decode(
-        cls->ptr()->library_->ptr()->flags_);
+        cls->ptr()->library()->ptr()->flags_);
   }
 
   // Returns true if the type specified by cls, type_arguments, and nullability
@@ -1273,7 +1273,7 @@
   ArrayPtr fields() const {
     // We rely on the fact that any loads from the array are dependent loads
     // and avoid the load-acquire barrier here.
-    return raw_ptr()->fields_;
+    return raw_ptr()->fields();
   }
   void SetFields(const Array& value) const;
   void AddField(const Field& field) const;
@@ -1297,7 +1297,7 @@
   ArrayPtr current_functions() const {
     // We rely on the fact that any loads from the array are dependent loads
     // and avoid the load-acquire barrier here.
-    return raw_ptr()->functions_;
+    return raw_ptr()->functions();
   }
   ArrayPtr functions() const {
     DEBUG_ASSERT(
@@ -1429,7 +1429,7 @@
     StoreNonPointer(&raw_ptr()->num_native_fields_, value);
   }
 
-  CodePtr allocation_stub() const { return raw_ptr()->allocation_stub_; }
+  CodePtr allocation_stub() const { return raw_ptr()->allocation_stub(); }
   void set_allocation_stub(const Code& value) const;
 
   intptr_t kernel_offset() const {
@@ -1600,7 +1600,7 @@
   }
 
  private:
-  TypePtr declaration_type() const { return raw_ptr()->declaration_type_; }
+  TypePtr declaration_type() const { return raw_ptr()->declaration_type(); }
 
   // Caches the declaration type of this class.
   void set_declaration_type(const Type& type) const;
@@ -1752,11 +1752,11 @@
 
 class PatchClass : public Object {
  public:
-  ClassPtr patched_class() const { return raw_ptr()->patched_class_; }
-  ClassPtr origin_class() const { return raw_ptr()->origin_class_; }
-  ScriptPtr script() const { return raw_ptr()->script_; }
+  ClassPtr patched_class() const { return raw_ptr()->patched_class(); }
+  ClassPtr origin_class() const { return raw_ptr()->origin_class(); }
+  ScriptPtr script() const { return raw_ptr()->script(); }
   ExternalTypedDataPtr library_kernel_data() const {
-    return raw_ptr()->library_kernel_data_;
+    return raw_ptr()->library_kernel_data();
   }
   void set_library_kernel_data(const ExternalTypedData& data) const;
 
@@ -1777,7 +1777,7 @@
   }
   static bool IsInFullSnapshot(PatchClassPtr cls) {
     NoSafepointScope no_safepoint;
-    return Class::IsInFullSnapshot(cls->ptr()->patched_class_);
+    return Class::IsInFullSnapshot(cls->ptr()->patched_class());
   }
 
   static PatchClassPtr New(const Class& patched_class,
@@ -1798,7 +1798,7 @@
 
 class SingleTargetCache : public Object {
  public:
-  CodePtr target() const { return raw_ptr()->target_; }
+  CodePtr target() const { return raw_ptr()->target(); }
   void set_target(const Code& target) const;
   static intptr_t target_offset() {
     return OFFSET_OF(SingleTargetCacheLayout, target_);
@@ -1831,7 +1831,7 @@
 
 class MonomorphicSmiableCall : public Object {
  public:
-  CodePtr target() const { return raw_ptr()->target_; }
+  CodePtr target() const { return raw_ptr()->target(); }
   classid_t expected_cid() const { return raw_ptr()->expected_cid_; }
 
   static intptr_t InstanceSize() {
@@ -1860,8 +1860,8 @@
 
 class CallSiteData : public Object {
  public:
-  StringPtr target_name() const { return raw_ptr()->target_name_; }
-  ArrayPtr arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
+  StringPtr target_name() const { return raw_ptr()->target_name(); }
+  ArrayPtr arguments_descriptor() const { return raw_ptr()->args_descriptor(); }
 
   intptr_t TypeArgsLen() const;
 
@@ -1945,7 +1945,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   AbstractTypePtr receivers_static_type() const {
-    return raw_ptr()->receivers_static_type_;
+    return raw_ptr()->receivers_static_type();
   }
   bool is_tracking_exactness() const {
     return TrackingExactnessBit::decode(raw_ptr()->state_bits_);
@@ -2240,8 +2240,7 @@
   intptr_t FindCheck(const GrowableArray<intptr_t>& cids) const;
 
   ArrayPtr entries() const {
-    return LoadPointer<ArrayPtr, std::memory_order_acquire>(
-        &raw_ptr()->entries_);
+    return raw_ptr()->entries<std::memory_order_acquire>();
   }
 
   bool receiver_cannot_be_smi() const {
@@ -2446,7 +2445,7 @@
 
 class Function : public Object {
  public:
-  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name(); }
   StringPtr UserVisibleName() const;  // Same as scrubbed name.
   const char* UserVisibleNameCString() const;
 
@@ -2543,7 +2542,7 @@
   void set_owner(const Object& value) const;
   ClassPtr origin() const;
   ScriptPtr script() const;
-  ObjectPtr RawOwner() const { return raw_ptr()->owner_; }
+  ObjectPtr RawOwner() const { return raw_ptr()->owner(); }
 
   // The NNBD mode of the library declaring this function.
   // TODO(alexmarkov): nnbd_mode() doesn't work for mixins.
@@ -2560,7 +2559,7 @@
   StringPtr native_name() const;
   void set_native_name(const String& name) const;
 
-  AbstractTypePtr result_type() const { return raw_ptr()->result_type_; }
+  AbstractTypePtr result_type() const { return raw_ptr()->result_type(); }
   void set_result_type(const AbstractType& value) const;
 
   // The parameters, starting with NumImplicitParameters() parameters which are
@@ -2568,7 +2567,7 @@
   // Note that type checks exclude implicit parameters.
   AbstractTypePtr ParameterTypeAt(intptr_t index) const;
   void SetParameterTypeAt(intptr_t index, const AbstractType& value) const;
-  ArrayPtr parameter_types() const { return raw_ptr()->parameter_types_; }
+  ArrayPtr parameter_types() const { return raw_ptr()->parameter_types(); }
   void set_parameter_types(const Array& value) const;
   static intptr_t parameter_types_offset() {
     return OFFSET_OF(FunctionLayout, parameter_types_);
@@ -2581,7 +2580,7 @@
   // elements are the names.
   StringPtr ParameterNameAt(intptr_t index) const;
   void SetParameterNameAt(intptr_t index, const String& value) const;
-  ArrayPtr parameter_names() const { return raw_ptr()->parameter_names_; }
+  ArrayPtr parameter_names() const { return raw_ptr()->parameter_names(); }
   static intptr_t parameter_names_offset() {
     return OFFSET_OF(FunctionLayout, parameter_names_);
   }
@@ -2607,7 +2606,7 @@
   // The type parameters (and their bounds) are specified as an array of
   // TypeParameter.
   TypeArgumentsPtr type_parameters() const {
-    return raw_ptr()->type_parameters_;
+    return raw_ptr()->type_parameters();
   }
   void set_type_parameters(const TypeArguments& value) const;
   static intptr_t type_parameters_offset() {
@@ -2672,14 +2671,14 @@
   bool SafeToClosurize() const;
 
   static CodePtr CurrentCodeOf(const FunctionPtr function) {
-    return function->ptr()->code_;
+    return function->ptr()->code();
   }
 
   CodePtr unoptimized_code() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return static_cast<CodePtr>(Object::null());
 #else
-    return raw_ptr()->unoptimized_code_;
+    return raw_ptr()->unoptimized_code();
 #endif
   }
   void set_unoptimized_code(const Code& value) const;
@@ -3891,11 +3890,11 @@
 
  private:
   // Enclosing function of this signature function.
-  FunctionPtr parent_function() const { return raw_ptr()->parent_function_; }
+  FunctionPtr parent_function() const { return raw_ptr()->parent_function(); }
   void set_parent_function(const Function& value) const;
 
   // Signature type of this signature function.
-  TypePtr signature_type() const { return raw_ptr()->signature_type_; }
+  TypePtr signature_type() const { return raw_ptr()->signature_type(); }
   void set_signature_type(const Type& value) const;
 
   static SignatureDataPtr New(Heap::Space space = Heap::kOld);
@@ -3922,17 +3921,17 @@
 
  private:
   // Signature type of this closure function.
-  TypePtr signature_type() const { return raw_ptr()->signature_type_; }
+  TypePtr signature_type() const { return raw_ptr()->signature_type(); }
   void set_signature_type(const Type& value) const;
 
-  FunctionPtr c_signature() const { return raw_ptr()->c_signature_; }
+  FunctionPtr c_signature() const { return raw_ptr()->c_signature(); }
   void set_c_signature(const Function& value) const;
 
-  FunctionPtr callback_target() const { return raw_ptr()->callback_target_; }
+  FunctionPtr callback_target() const { return raw_ptr()->callback_target(); }
   void set_callback_target(const Function& value) const;
 
   InstancePtr callback_exceptional_return() const {
-    return raw_ptr()->callback_exceptional_return_;
+    return raw_ptr()->callback_exceptional_return();
   }
   void set_callback_exceptional_return(const Instance& value) const;
 
@@ -3963,7 +3962,7 @@
       return true;
     }
     NoSafepointScope no_safepoint;
-    return !raw_ptr()->owner_->IsField();
+    return !raw_ptr()->owner()->IsField();
   }
 
   // Returns whether fields must be cloned via [CloneFromOriginal] for the
@@ -3974,7 +3973,7 @@
   // original field of result.
   FieldPtr CloneFromOriginal() const;
 
-  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name(); }
   StringPtr UserVisibleName() const;  // Same as scrubbed name.
   const char* UserVisibleNameCString() const;
   virtual StringPtr DictionaryName() const { return name(); }
@@ -4086,7 +4085,7 @@
   ScriptPtr Script() const;
   ObjectPtr RawOwner() const;
 
-  AbstractTypePtr type() const { return raw_ptr()->type_; }
+  AbstractTypePtr type() const { return raw_ptr()->type(); }
   // Used by class finalizer, otherwise initialized in constructor.
   void SetFieldType(const AbstractType& value) const;
 
@@ -4345,7 +4344,7 @@
   FunctionPtr InitializerFunction() const {
     // We rely on the fact that any loads from the initializer function
     // are dependent loads and avoid the load-acquire barrier here.
-    return raw_ptr()->initializer_function_;
+    return raw_ptr()->initializer_function<std::memory_order_relaxed>();
   }
   void SetInitializerFunction(const Function& initializer) const;
   bool HasInitializerFunction() const;
@@ -4377,7 +4376,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   SubtypeTestCachePtr type_test_cache() const {
-    return raw_ptr()->type_test_cache_;
+    return raw_ptr()->type_test_cache();
   }
   void set_type_test_cache(const SubtypeTestCache& cache) const;
 #endif
@@ -4469,7 +4468,7 @@
     set_kind_bits(ConstBit::update(value, raw_ptr()->kind_bits_));
   }
   void set_owner(const Object& value) const {
-    StorePointer(&raw_ptr()->owner_, value.raw());
+    raw_ptr()->set_owner(value.raw());
   }
   void set_token_pos(TokenPosition token_pos) const {
     StoreNonPointer(&raw_ptr()->token_pos_, token_pos);
@@ -4493,11 +4492,11 @@
 
 class Script : public Object {
  public:
-  StringPtr url() const { return raw_ptr()->url_; }
+  StringPtr url() const { return raw_ptr()->url(); }
   void set_url(const String& value) const;
 
   // The actual url which was loaded from disk, if provided by the embedder.
-  StringPtr resolved_url() const { return raw_ptr()->resolved_url_; }
+  StringPtr resolved_url() const { return raw_ptr()->resolved_url(); }
   bool HasSource() const;
   StringPtr Source() const;
   bool IsPartOfDartColonLibrary() const;
@@ -4512,12 +4511,12 @@
   int64_t load_timestamp() const { return raw_ptr()->load_timestamp_; }
 
   ArrayPtr compile_time_constants() const {
-    return raw_ptr()->compile_time_constants_;
+    return raw_ptr()->compile_time_constants();
   }
   void set_compile_time_constants(const Array& value) const;
 
   KernelProgramInfoPtr kernel_program_info() const {
-    return raw_ptr()->kernel_program_info_;
+    return raw_ptr()->kernel_program_info();
   }
   void set_kernel_program_info(const KernelProgramInfo& info) const;
 
@@ -4640,11 +4639,11 @@
 
 class Library : public Object {
  public:
-  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name(); }
   void SetName(const String& name) const;
 
-  StringPtr url() const { return raw_ptr()->url_; }
-  StringPtr private_key() const { return raw_ptr()->private_key_; }
+  StringPtr url() const { return raw_ptr()->url(); }
+  StringPtr private_key() const { return raw_ptr()->private_key(); }
   bool LoadNotStarted() const {
     return raw_ptr()->load_state_ == LibraryLayout::kAllocated;
   }
@@ -4661,7 +4660,7 @@
   }
   void SetLoaded() const;
 
-  LoadingUnitPtr loading_unit() const { return raw_ptr()->loading_unit_; }
+  LoadingUnitPtr loading_unit() const { return raw_ptr()->loading_unit(); }
   void set_loading_unit(const LoadingUnit& value) const;
 
   static intptr_t InstanceSize() {
@@ -4772,22 +4771,22 @@
                          const String& pragma_name,
                          Object* options);
 
-  ClassPtr toplevel_class() const { return raw_ptr()->toplevel_class_; }
+  ClassPtr toplevel_class() const { return raw_ptr()->toplevel_class(); }
   void set_toplevel_class(const Class& value) const;
 
   GrowableObjectArrayPtr used_scripts() const {
-    return raw_ptr()->used_scripts_;
+    return raw_ptr()->used_scripts();
   }
 
   // Library imports.
-  ArrayPtr imports() const { return raw_ptr()->imports_; }
-  ArrayPtr exports() const { return raw_ptr()->exports_; }
+  ArrayPtr imports() const { return raw_ptr()->imports(); }
+  ArrayPtr exports() const { return raw_ptr()->exports(); }
   void AddImport(const Namespace& ns) const;
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
   NamespacePtr ImportAt(intptr_t index) const;
   LibraryPtr ImportLibraryAt(intptr_t index) const;
 
-  ArrayPtr dependencies() const { return raw_ptr()->dependencies_; }
+  ArrayPtr dependencies() const { return raw_ptr()->dependencies(); }
   void set_dependencies(const Array& deps) const;
 
   void DropDependenciesAndCaches() const;
@@ -4873,7 +4872,7 @@
 
   inline intptr_t UrlHash() const;
 
-  ExternalTypedDataPtr kernel_data() const { return raw_ptr()->kernel_data_; }
+  ExternalTypedDataPtr kernel_data() const { return raw_ptr()->kernel_data(); }
   void set_kernel_data(const ExternalTypedData& data) const;
 
   intptr_t kernel_offset() const {
@@ -4978,13 +4977,13 @@
   void set_num_imports(intptr_t value) const;
   void set_flags(uint8_t flags) const;
   bool HasExports() const;
-  ArrayPtr loaded_scripts() const { return raw_ptr()->loaded_scripts_; }
-  GrowableObjectArrayPtr metadata() const { return raw_ptr()->metadata_; }
+  ArrayPtr loaded_scripts() const { return raw_ptr()->loaded_scripts(); }
+  GrowableObjectArrayPtr metadata() const { return raw_ptr()->metadata(); }
   void set_metadata(const GrowableObjectArray& value) const;
-  ArrayPtr dictionary() const { return raw_ptr()->dictionary_; }
+  ArrayPtr dictionary() const { return raw_ptr()->dictionary(); }
   void InitClassDictionary() const;
 
-  ArrayPtr resolved_names() const { return raw_ptr()->resolved_names_; }
+  ArrayPtr resolved_names() const { return raw_ptr()->resolved_names(); }
   bool LookupResolvedNamesCache(const String& name, Object* obj) const;
   void AddToResolvedNamesCache(const String& name, const Object& obj) const;
   void InitResolvedNamesCache() const;
@@ -4992,7 +4991,7 @@
   void InvalidateResolvedName(const String& name) const;
   void InvalidateResolvedNamesCache() const;
 
-  ArrayPtr exported_names() const { return raw_ptr()->exported_names_; }
+  ArrayPtr exported_names() const { return raw_ptr()->exported_names(); }
   bool LookupExportedNamesCache(const String& name, Object* obj) const;
   void AddToExportedNamesCache(const String& name, const Object& obj) const;
   void InitExportedNamesCache() const;
@@ -5032,9 +5031,9 @@
 // the show/hide combinators.
 class Namespace : public Object {
  public:
-  LibraryPtr library() const { return raw_ptr()->library_; }
-  ArrayPtr show_names() const { return raw_ptr()->show_names_; }
-  ArrayPtr hide_names() const { return raw_ptr()->hide_names_; }
+  LibraryPtr library() const { return raw_ptr()->library(); }
+  ArrayPtr show_names() const { return raw_ptr()->show_names(); }
+  ArrayPtr hide_names() const { return raw_ptr()->hide_names(); }
 
   void AddMetadata(const Object& owner,
                    TokenPosition token_pos,
@@ -5056,7 +5055,7 @@
  private:
   static NamespacePtr New();
 
-  FieldPtr metadata_field() const { return raw_ptr()->metadata_field_; }
+  FieldPtr metadata_field() const { return raw_ptr()->metadata_field(); }
   void set_metadata_field(const Field& value) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Namespace, Object);
@@ -5082,30 +5081,30 @@
     return RoundedAllocationSize(sizeof(KernelProgramInfoLayout));
   }
 
-  TypedDataPtr string_offsets() const { return raw_ptr()->string_offsets_; }
+  TypedDataPtr string_offsets() const { return raw_ptr()->string_offsets(); }
 
-  ExternalTypedDataPtr string_data() const { return raw_ptr()->string_data_; }
+  ExternalTypedDataPtr string_data() const { return raw_ptr()->string_data(); }
 
-  TypedDataPtr canonical_names() const { return raw_ptr()->canonical_names_; }
+  TypedDataPtr canonical_names() const { return raw_ptr()->canonical_names(); }
 
   ExternalTypedDataPtr metadata_payloads() const {
-    return raw_ptr()->metadata_payloads_;
+    return raw_ptr()->metadata_payloads();
   }
 
   ExternalTypedDataPtr metadata_mappings() const {
-    return raw_ptr()->metadata_mappings_;
+    return raw_ptr()->metadata_mappings();
   }
 
   ExternalTypedDataPtr constants_table() const {
-    return raw_ptr()->constants_table_;
+    return raw_ptr()->constants_table();
   }
 
   void set_constants_table(const ExternalTypedData& value) const;
 
-  ArrayPtr scripts() const { return raw_ptr()->scripts_; }
+  ArrayPtr scripts() const { return raw_ptr()->scripts(); }
   void set_scripts(const Array& scripts) const;
 
-  ArrayPtr constants() const { return raw_ptr()->constants_; }
+  ArrayPtr constants() const { return raw_ptr()->constants(); }
   void set_constants(const Array& constants) const;
 
   uint32_t kernel_binary_version() const {
@@ -5119,26 +5118,26 @@
   //
   // This array will hold the functions which might need their native name set.
   GrowableObjectArrayPtr potential_natives() const {
-    return raw_ptr()->potential_natives_;
+    return raw_ptr()->potential_natives();
   }
   void set_potential_natives(const GrowableObjectArray& candidates) const;
 
   GrowableObjectArrayPtr potential_pragma_functions() const {
-    return raw_ptr()->potential_pragma_functions_;
+    return raw_ptr()->potential_pragma_functions();
   }
   void set_potential_pragma_functions(
       const GrowableObjectArray& candidates) const;
 
   ScriptPtr ScriptAt(intptr_t index) const;
 
-  ArrayPtr libraries_cache() const { return raw_ptr()->libraries_cache_; }
+  ArrayPtr libraries_cache() const { return raw_ptr()->libraries_cache(); }
   void set_libraries_cache(const Array& cache) const;
   LibraryPtr LookupLibrary(Thread* thread, const Smi& name_index) const;
   LibraryPtr InsertLibrary(Thread* thread,
                            const Smi& name_index,
                            const Library& lib) const;
 
-  ArrayPtr classes_cache() const { return raw_ptr()->classes_cache_; }
+  ArrayPtr classes_cache() const { return raw_ptr()->classes_cache(); }
   void set_classes_cache(const Array& cache) const;
   ClassPtr LookupClass(Thread* thread, const Smi& name_index) const;
   ClassPtr InsertClass(Thread* thread,
@@ -5968,8 +5967,8 @@
     return Object::null();
 #else
     // Outside the precompiled runtime, they should always have a target.
-    ASSERT(raw->ptr()->target_ != Object::null());
-    return raw->ptr()->target_;
+    ASSERT(raw->ptr()->target() != Object::null());
+    return raw->ptr()->target();
 #endif
   }
 
@@ -6053,14 +6052,14 @@
     UNREACHABLE();
     return NULL;
 #else
-    return raw_ptr()->active_instructions_;
+    return raw_ptr()->active_instructions();
 #endif
   }
 
   // When dual mapping, these return the executable view.
-  InstructionsPtr instructions() const { return raw_ptr()->instructions_; }
+  InstructionsPtr instructions() const { return raw_ptr()->instructions(); }
   static InstructionsPtr InstructionsOf(const CodePtr code) {
-    return code->ptr()->instructions_;
+    return code->ptr()->instructions();
   }
 
   static intptr_t saved_instructions_offset() {
@@ -6087,7 +6086,7 @@
     }
   }
 
-  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool_; }
+  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool(); }
   static intptr_t object_pool_offset() {
     return OFFSET_OF(CodeLayout, object_pool_);
   }
@@ -6193,19 +6192,21 @@
   // Returns true if there is a debugger breakpoint set in this code object.
   bool HasBreakpoint() const;
 
-  PcDescriptorsPtr pc_descriptors() const { return raw_ptr()->pc_descriptors_; }
+  PcDescriptorsPtr pc_descriptors() const {
+    return raw_ptr()->pc_descriptors();
+  }
   void set_pc_descriptors(const PcDescriptors& descriptors) const {
     ASSERT(descriptors.IsOld());
-    StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
+    raw_ptr()->set_pc_descriptors(descriptors.raw());
   }
 
   CodeSourceMapPtr code_source_map() const {
-    return raw_ptr()->code_source_map_;
+    return raw_ptr()->code_source_map();
   }
 
   void set_code_source_map(const CodeSourceMap& code_source_map) const {
     ASSERT(code_source_map.IsOld());
-    StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw());
+    raw_ptr()->set_code_source_map(code_source_map.raw());
   }
 
   // Array of DeoptInfo objects.
@@ -6214,7 +6215,7 @@
     UNREACHABLE();
     return NULL;
 #else
-    return raw_ptr()->deopt_info_array_;
+    return raw_ptr()->deopt_info_array();
 #endif
   }
   void set_deopt_info_array(const Array& array) const;
@@ -6230,7 +6231,7 @@
 #endif
 
   CompressedStackMapsPtr compressed_stackmaps() const {
-    return raw_ptr()->compressed_stackmaps_;
+    return raw_ptr()->compressed_stackmaps();
   }
   void set_compressed_stackmaps(const CompressedStackMaps& maps) const;
 
@@ -6270,7 +6271,7 @@
     UNREACHABLE();
     return NULL;
 #else
-    return raw_ptr()->static_calls_target_table_;
+    return raw_ptr()->static_calls_target_table();
 #endif
   }
 
@@ -6323,7 +6324,7 @@
     UNREACHABLE();
     return NULL;
 #else
-    return raw_ptr()->return_address_metadata_;
+    return raw_ptr()->return_address_metadata();
 #endif
   }
   // Sets |return_address_metadata|.
@@ -6364,7 +6365,7 @@
     UNREACHABLE();
     return NULL;
 #else
-    return raw_ptr()->var_descriptors_;
+    return raw_ptr()->var_descriptors();
 #endif
   }
   void set_var_descriptors(const LocalVarDescriptors& value) const {
@@ -6372,7 +6373,7 @@
     UNREACHABLE();
 #else
     ASSERT(value.IsOld());
-    StorePointer(&raw_ptr()->var_descriptors_, value.raw());
+    raw_ptr()->set_var_descriptors(value.raw());
 #endif
   }
 
@@ -6380,11 +6381,11 @@
   LocalVarDescriptorsPtr GetLocalVarDescriptors() const;
 
   ExceptionHandlersPtr exception_handlers() const {
-    return raw_ptr()->exception_handlers_;
+    return raw_ptr()->exception_handlers();
   }
   void set_exception_handlers(const ExceptionHandlers& handlers) const {
     ASSERT(handlers.IsOld());
-    StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
+    raw_ptr()->set_exception_handlers(handlers.raw());
   }
 
   // WARNING: function() returns the owner which is not guaranteed to be
@@ -6396,15 +6397,15 @@
   FunctionPtr function() const {
     ASSERT(IsFunctionCode());
     return Function::RawCast(
-        WeakSerializationReference::Unwrap(raw_ptr()->owner_));
+        WeakSerializationReference::Unwrap(raw_ptr()->owner()));
   }
 
-  ObjectPtr owner() const { return raw_ptr()->owner_; }
+  ObjectPtr owner() const { return raw_ptr()->owner(); }
   void set_owner(const Object& owner) const;
 
   classid_t OwnerClassId() const { return OwnerClassIdOf(raw()); }
   static classid_t OwnerClassIdOf(CodePtr raw) {
-    return WeakSerializationReference::UnwrappedClassIdOf(raw->ptr()->owner_);
+    return WeakSerializationReference::UnwrappedClassIdOf(raw->ptr()->owner());
   }
 
   static intptr_t owner_offset() { return OFFSET_OF(CodeLayout, owner_); }
@@ -6510,12 +6511,12 @@
     UNREACHABLE();
     return false;
 #else
-    return code->ptr()->instructions_ != code->ptr()->active_instructions_;
+    return code->ptr()->instructions() != code->ptr()->active_instructions();
 #endif
   }
 
   void set_object_pool(ObjectPoolPtr object_pool) const {
-    StorePointer(&raw_ptr()->object_pool_, object_pool);
+    raw_ptr()->set_object_pool(object_pool);
   }
 
  private:
@@ -6583,7 +6584,7 @@
 
   void set_instructions(const Instructions& instructions) const {
     ASSERT(Thread::Current()->IsMutatorThread() || !is_alive());
-    StorePointer(&raw_ptr()->instructions_, instructions.raw());
+    raw_ptr()->set_instructions(instructions.raw());
   }
 #if !defined(DART_PRECOMPILED_RUNTIME)
   void set_unchecked_offset(uword offset) const {
@@ -6651,9 +6652,9 @@
 
 class Context : public Object {
  public:
-  ContextPtr parent() const { return raw_ptr()->parent_; }
+  ContextPtr parent() const { return raw_ptr()->parent(); }
   void set_parent(const Context& parent) const {
-    StorePointer(&raw_ptr()->parent_, parent.raw());
+    raw_ptr()->set_parent(parent.raw());
   }
   static intptr_t parent_offset() { return OFFSET_OF(ContextLayout, parent_); }
 
@@ -6666,7 +6667,7 @@
   }
 
   ObjectPtr At(intptr_t context_index) const {
-    return *ObjectAddr(context_index);
+    return raw_ptr()->element(context_index);
   }
   inline void SetAt(intptr_t context_index, const Object& value) const;
 
@@ -6710,11 +6711,6 @@
   static ContextPtr New(intptr_t num_variables, Heap::Space space = Heap::kNew);
 
  private:
-  ObjectPtr const* ObjectAddr(intptr_t context_index) const {
-    ASSERT((context_index >= 0) && (context_index < num_variables()));
-    return &raw_ptr()->data()[context_index];
-  }
-
   void set_num_variables(intptr_t num_variables) const {
     StoreNonPointer(&raw_ptr()->num_variables_, num_variables);
   }
@@ -7041,7 +7037,7 @@
 
 class ApiError : public Error {
  public:
-  StringPtr message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message(); }
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(ApiErrorLayout));
@@ -7101,10 +7097,10 @@
   TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
 
  private:
-  ErrorPtr previous_error() const { return raw_ptr()->previous_error_; }
+  ErrorPtr previous_error() const { return raw_ptr()->previous_error(); }
   void set_previous_error(const Error& value) const;
 
-  ScriptPtr script() const { return raw_ptr()->script_; }
+  ScriptPtr script() const { return raw_ptr()->script(); }
   void set_script(const Script& value) const;
 
   void set_token_pos(TokenPosition value) const;
@@ -7114,10 +7110,10 @@
 
   void set_kind(uint8_t value) const;
 
-  StringPtr message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message(); }
   void set_message(const String& value) const;
 
-  StringPtr formatted_message() const { return raw_ptr()->formatted_message_; }
+  StringPtr formatted_message() const { return raw_ptr()->formatted_message(); }
   void set_formatted_message(const String& value) const;
 
   static LanguageErrorPtr New();
@@ -7128,12 +7124,12 @@
 
 class UnhandledException : public Error {
  public:
-  InstancePtr exception() const { return raw_ptr()->exception_; }
+  InstancePtr exception() const { return raw_ptr()->exception(); }
   static intptr_t exception_offset() {
     return OFFSET_OF(UnhandledExceptionLayout, exception_);
   }
 
-  InstancePtr stacktrace() const { return raw_ptr()->stacktrace_; }
+  InstancePtr stacktrace() const { return raw_ptr()->stacktrace(); }
   static intptr_t stacktrace_offset() {
     return OFFSET_OF(UnhandledExceptionLayout, stacktrace_);
   }
@@ -7164,7 +7160,7 @@
   bool is_user_initiated() const { return raw_ptr()->is_user_initiated_; }
   void set_is_user_initiated(bool value) const;
 
-  StringPtr message() const { return raw_ptr()->message_; }
+  StringPtr message() const { return raw_ptr()->message(); }
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(UnwindErrorLayout));
@@ -7392,12 +7388,12 @@
 
 class LibraryPrefix : public Instance {
  public:
-  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name(); }
   virtual StringPtr DictionaryName() const { return name(); }
 
-  ArrayPtr imports() const { return raw_ptr()->imports_; }
+  ArrayPtr imports() const { return raw_ptr()->imports(); }
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
-  LibraryPtr importer() const { return raw_ptr()->importer_; }
+  LibraryPtr importer() const { return raw_ptr()->importer(); }
 
   LibraryPtr GetLibrary(int index) const;
   void AddImport(const Namespace& import) const;
@@ -7687,7 +7683,6 @@
 
   ArrayPtr instantiations() const;
   void set_instantiations(const Array& value) const;
-  AbstractTypePtr const* TypeAddr(intptr_t index) const;
   void SetLength(intptr_t value) const;
   // Number of fields in the raw object is 4:
   // instantiations_, length_, hash_ and nullability_.
@@ -7947,7 +7942,7 @@
   uword type_test_stub_entry_point() const {
     return raw_ptr()->type_test_stub_entry_point_;
   }
-  CodePtr type_test_stub() const { return raw_ptr()->type_test_stub_; }
+  CodePtr type_test_stub() const { return raw_ptr()->type_test_stub(); }
 
   void SetTypeTestingStub(const Code& stub) const;
 
@@ -8008,7 +8003,7 @@
   virtual classid_t type_class_id() const;
   virtual ClassPtr type_class() const;
   void set_type_class(const Class& value) const;
-  virtual TypeArgumentsPtr arguments() const { return raw_ptr()->arguments_; }
+  virtual TypeArgumentsPtr arguments() const { return raw_ptr()->arguments(); }
   virtual void set_arguments(const TypeArguments& value) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
@@ -8168,7 +8163,7 @@
     return (type() != AbstractType::null()) &&
            AbstractType::Handle(type()).HasTypeClass();
   }
-  AbstractTypePtr type() const { return raw_ptr()->type_; }
+  AbstractTypePtr type() const { return raw_ptr()->type(); }
   void set_type(const AbstractType& value) const;
   virtual classid_t type_class_id() const {
     return AbstractType::Handle(type()).type_class_id();
@@ -8262,7 +8257,7 @@
   classid_t parameterized_class_id() const;
   ClassPtr parameterized_class() const;
   FunctionPtr parameterized_function() const {
-    return raw_ptr()->parameterized_function_;
+    return raw_ptr()->parameterized_function();
   }
   bool IsClassTypeParameter() const {
     return parameterized_class_id() != kFunctionCid;
@@ -8278,16 +8273,16 @@
     return OFFSET_OF(TypeParameterLayout, index_);
   }
 
-  StringPtr name() const { return raw_ptr()->name_; }
+  StringPtr name() const { return raw_ptr()->name(); }
   static intptr_t name_offset() {
     return OFFSET_OF(TypeParameterLayout, name_);
   }
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const;
-  AbstractTypePtr bound() const { return raw_ptr()->bound_; }
+  AbstractTypePtr bound() const { return raw_ptr()->bound(); }
   void set_bound(const AbstractType& value) const;
   AbstractTypePtr default_argument() const {
-    return raw_ptr()->default_argument_;
+    return raw_ptr()->default_argument();
   }
   void set_default_argument(const AbstractType& value) const;
   static intptr_t bound_offset() {
@@ -8671,7 +8666,7 @@
 
   intptr_t Length() const { return LengthOf(raw()); }
   static intptr_t LengthOf(StringPtr obj) {
-    return Smi::Value(obj->ptr()->length_);
+    return Smi::Value(obj->ptr()->length());
   }
   static intptr_t length_offset() { return OFFSET_OF(StringLayout, length_); }
 
@@ -8940,7 +8935,7 @@
   void SetLength(intptr_t value) const {
     // This is only safe because we create a new Smi, which does not cause
     // heap allocation.
-    StoreSmi(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length(Smi::New(value));
   }
 
   void SetHash(intptr_t value) const { SetCachedHash(raw(), value); }
@@ -9024,7 +9019,7 @@
   }
 
   static intptr_t UnroundedSize(OneByteStringPtr str) {
-    return UnroundedSize(Smi::Value(str->ptr()->length_));
+    return UnroundedSize(Smi::Value(str->ptr()->length()));
   }
   static intptr_t UnroundedSize(intptr_t len) {
     return sizeof(OneByteStringLayout) + (len * kBytesPerElement);
@@ -9163,7 +9158,7 @@
     return OFFSET_OF_RETURNED_VALUE(TwoByteStringLayout, data);
   }
   static intptr_t UnroundedSize(TwoByteStringPtr str) {
-    return UnroundedSize(Smi::Value(str->ptr()->length_));
+    return UnroundedSize(Smi::Value(str->ptr()->length()));
   }
   static intptr_t UnroundedSize(intptr_t len) {
     return sizeof(TwoByteStringLayout) + (len * kBytesPerElement);
@@ -9493,7 +9488,7 @@
 
   intptr_t Length() const { return LengthOf(raw()); }
   static intptr_t LengthOf(const ArrayPtr array) {
-    return Smi::Value(array->ptr()->length_);
+    return Smi::Value(array->ptr()->length());
   }
 
   static intptr_t length_offset() { return OFFSET_OF(ArrayLayout, length_); }
@@ -9518,8 +9513,8 @@
   static bool Equals(ArrayPtr a, ArrayPtr b) {
     if (a == b) return true;
     if (a->IsRawNull() || b->IsRawNull()) return false;
-    if (a->ptr()->length_ != b->ptr()->length_) return false;
-    if (a->ptr()->type_arguments_ != b->ptr()->type_arguments_) return false;
+    if (a->ptr()->length() != b->ptr()->length()) return false;
+    if (a->ptr()->type_arguments() != b->ptr()->type_arguments()) return false;
     const intptr_t length = LengthOf(a);
     return memcmp(a->ptr()->data(), b->ptr()->data(), kWordSize * length) == 0;
   }
@@ -9528,20 +9523,20 @@
 
   template <std::memory_order order = std::memory_order_relaxed>
   ObjectPtr At(intptr_t index) const {
-    return LoadPointer<ObjectPtr, order>(ObjectAddr(index));
+    return raw_ptr()->element(index);
   }
   template <std::memory_order order = std::memory_order_relaxed>
   void SetAt(intptr_t index, const Object& value) const {
     // TODO(iposva): Add storing NoSafepointScope.
-    StoreArrayPointer<ObjectPtr, order>(ObjectAddr(index), value.raw());
+    raw_ptr()->set_element(index, value.raw());
   }
 
   // Access to the array with acquire release semantics.
   ObjectPtr AtAcquire(intptr_t index) const {
-    return At<std::memory_order_acquire>(index);
+    return raw_ptr()->element<std::memory_order_acquire>(index);
   }
   void SetAtRelease(intptr_t index, const Object& value) const {
-    SetAt<std::memory_order_release>(index, value);
+    raw_ptr()->set_element<std::memory_order_release>(index, value.raw());
   }
 
   bool IsImmutable() const { return raw()->GetClassId() == kImmutableArrayCid; }
@@ -9550,7 +9545,7 @@
   static const intptr_t kElementTypeTypeArgPos = 0;
 
   virtual TypeArgumentsPtr GetTypeArguments() const {
-    return raw_ptr()->type_arguments_;
+    return raw_ptr()->type_arguments();
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
     // An Array is raw or takes one type argument. However, its type argument
@@ -9643,10 +9638,10 @@
   }
 
   void SetLength(intptr_t value) const {
-    StoreSmi(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length(Smi::New(value));
   }
   void SetLengthIgnoreRace(intptr_t value) const {
-    StoreSmiIgnoreRace(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length_ignore_race(Smi::New(value));
   }
 
   template <typename type, std::memory_order order = std::memory_order_relaxed>
@@ -9712,35 +9707,33 @@
   intptr_t Capacity() const {
     NoSafepointScope no_safepoint;
     ASSERT(!IsNull());
-    return Smi::Value(DataArray()->length_);
+    return Smi::Value(DataArray()->length());
   }
   intptr_t Length() const {
     ASSERT(!IsNull());
-    return Smi::Value(raw_ptr()->length_);
+    return Smi::Value(raw_ptr()->length());
   }
   void SetLength(intptr_t value) const {
     // This is only safe because we create a new Smi, which does not cause
     // heap allocation.
-    StoreSmi(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length(Smi::New(value));
   }
 
-  ArrayPtr data() const { return raw_ptr()->data_; }
-  void SetData(const Array& value) const {
-    StorePointer(&raw_ptr()->data_, value.raw());
-  }
+  ArrayPtr data() const { return raw_ptr()->data(); }
+  void SetData(const Array& value) const { raw_ptr()->set_data(value.raw()); }
 
   ObjectPtr At(intptr_t index) const {
     NoSafepointScope no_safepoint;
     ASSERT(!IsNull());
     ASSERT(index < Length());
-    return *ObjectAddr(index);
+    return data()->ptr()->element(index);
   }
   void SetAt(intptr_t index, const Object& value) const {
     ASSERT(!IsNull());
     ASSERT(index < Length());
 
     // TODO(iposva): Add storing NoSafepointScope.
-    data()->ptr()->StoreArrayPointer(ObjectAddr(index), value.raw());
+    data()->ptr()->set_element(index, value.raw());
   }
 
   void Add(const Object& value, Heap::Space space = Heap::kNew) const;
@@ -9749,7 +9742,7 @@
   ObjectPtr RemoveLast() const;
 
   virtual TypeArgumentsPtr GetTypeArguments() const {
-    return raw_ptr()->type_arguments_;
+    return raw_ptr()->type_arguments();
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
     // A GrowableObjectArray is raw or takes one type argument. However, its
@@ -9757,7 +9750,7 @@
     // reusing the type argument vector of the instantiator.
     ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated() &&
                               value.IsCanonical()));
-    StorePointer(&raw_ptr()->type_arguments_, value.raw());
+    raw_ptr()->set_type_arguments(value.raw());
   }
 
   // We don't expect a growable object array to be canonicalized.
@@ -9796,19 +9789,15 @@
                                     Heap::Space space = Heap::kNew);
 
   static SmiPtr NoSafepointLength(const GrowableObjectArrayPtr array) {
-    return array->ptr()->length_;
+    return array->ptr()->length();
   }
 
   static ArrayPtr NoSafepointData(const GrowableObjectArrayPtr array) {
-    return array->ptr()->data_;
+    return array->ptr()->data();
   }
 
  private:
   ArrayLayout* DataArray() const { return data()->ptr(); }
-  ObjectPtr* ObjectAddr(intptr_t index) const {
-    ASSERT((index >= 0) && (index < Length()));
-    return &(DataArray()->data()[index]);
-  }
 
   static const int kDefaultInitialCapacity = 0;
 
@@ -9925,11 +9914,11 @@
     return OFFSET_OF(TypedDataBaseLayout, length_);
   }
 
-  SmiPtr length() const { return raw_ptr()->length_; }
+  SmiPtr length() const { return raw_ptr()->length(); }
 
   intptr_t Length() const {
     ASSERT(!IsNull());
-    return Smi::Value(raw_ptr()->length_);
+    return Smi::Value(raw_ptr()->length());
   }
 
   intptr_t LengthInBytes() const {
@@ -9976,7 +9965,7 @@
  protected:
   void SetLength(intptr_t value) const {
     ASSERT(value <= Smi::kMaxValue);
-    StoreSmi(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length(Smi::New(value));
   }
 
   virtual uint8_t* Validate(uint8_t* data) const {
@@ -10206,7 +10195,7 @@
 
   void SetLength(intptr_t value) const {
     ASSERT(value <= Smi::kMaxValue);
-    StoreSmi(&raw_ptr()->length_, Smi::New(value));
+    raw_ptr()->set_length(Smi::New(value));
   }
 
   void SetData(uint8_t* data) const {
@@ -10257,22 +10246,22 @@
     return OFFSET_OF(TypedDataViewLayout, offset_in_bytes_);
   }
 
-  InstancePtr typed_data() const { return raw_ptr()->typed_data_; }
+  InstancePtr typed_data() const { return raw_ptr()->typed_data(); }
 
   void InitializeWith(const TypedDataBase& typed_data,
                       intptr_t offset_in_bytes,
                       intptr_t length) {
     const classid_t cid = typed_data.GetClassId();
     ASSERT(IsTypedDataClassId(cid) || IsExternalTypedDataClassId(cid));
-    StorePointer(&raw_ptr()->typed_data_, typed_data.raw());
-    StoreSmi(&raw_ptr()->length_, Smi::New(length));
-    StoreSmi(&raw_ptr()->offset_in_bytes_, Smi::New(offset_in_bytes));
+    raw_ptr()->set_typed_data(typed_data.raw());
+    raw_ptr()->set_length(Smi::New(length));
+    raw_ptr()->set_offset_in_bytes(Smi::New(offset_in_bytes));
 
     // Update the inner pointer.
     RecomputeDataField();
   }
 
-  SmiPtr offset_in_bytes() const { return raw_ptr()->offset_in_bytes_; }
+  SmiPtr offset_in_bytes() const { return raw_ptr()->offset_in_bytes(); }
 
  protected:
   virtual uint8_t* Validate(uint8_t* data) const { return data; }
@@ -10281,11 +10270,10 @@
   void RecomputeDataField() { raw()->ptr()->RecomputeDataField(); }
 
   void Clear() {
-    StoreSmi(&raw_ptr()->length_, Smi::New(0));
-    StoreSmi(&raw_ptr()->offset_in_bytes_, Smi::New(0));
+    raw_ptr()->set_length(Smi::New(0));
+    raw_ptr()->set_offset_in_bytes(Smi::New(0));
     StoreNonPointer(&raw_ptr()->data_, nullptr);
-    StorePointer(&raw_ptr()->typed_data_,
-                 TypedDataBase::RawCast(Object::null()));
+    raw_ptr()->set_typed_data(TypedDataBase::RawCast(Object::null()));
   }
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(TypedDataView, TypedDataBase);
@@ -10402,7 +10390,7 @@
                               Heap::Space space = Heap::kNew);
 
   virtual TypeArgumentsPtr GetTypeArguments() const {
-    return raw_ptr()->type_arguments_;
+    return raw_ptr()->type_arguments();
   }
   virtual void SetTypeArguments(const TypeArguments& value) const {
     ASSERT(value.IsNull() ||
@@ -10410,48 +10398,46 @@
             value.IsInstantiated() /*&& value.IsCanonical()*/));
     // TODO(asiva): Values read from a message snapshot are not properly marked
     // as canonical. See for example tests/isolate/message3_test.dart.
-    StorePointer(&raw_ptr()->type_arguments_, value.raw());
+    raw_ptr()->set_type_arguments(value.raw());
   }
   static intptr_t type_arguments_offset() {
     return OFFSET_OF(LinkedHashMapLayout, type_arguments_);
   }
 
-  TypedDataPtr index() const { return raw_ptr()->index_; }
+  TypedDataPtr index() const { return raw_ptr()->index(); }
   void SetIndex(const TypedData& value) const {
     ASSERT(!value.IsNull());
-    StorePointer(&raw_ptr()->index_, value.raw());
+    raw_ptr()->set_index(value.raw());
   }
   static intptr_t index_offset() {
     return OFFSET_OF(LinkedHashMapLayout, index_);
   }
 
-  ArrayPtr data() const { return raw_ptr()->data_; }
-  void SetData(const Array& value) const {
-    StorePointer(&raw_ptr()->data_, value.raw());
-  }
+  ArrayPtr data() const { return raw_ptr()->data(); }
+  void SetData(const Array& value) const { raw_ptr()->set_data(value.raw()); }
   static intptr_t data_offset() {
     return OFFSET_OF(LinkedHashMapLayout, data_);
   }
 
-  SmiPtr hash_mask() const { return raw_ptr()->hash_mask_; }
+  SmiPtr hash_mask() const { return raw_ptr()->hash_mask(); }
   void SetHashMask(intptr_t value) const {
-    StoreSmi(&raw_ptr()->hash_mask_, Smi::New(value));
+    raw_ptr()->set_hash_mask(Smi::New(value));
   }
   static intptr_t hash_mask_offset() {
     return OFFSET_OF(LinkedHashMapLayout, hash_mask_);
   }
 
-  SmiPtr used_data() const { return raw_ptr()->used_data_; }
+  SmiPtr used_data() const { return raw_ptr()->used_data(); }
   void SetUsedData(intptr_t value) const {
-    StoreSmi(&raw_ptr()->used_data_, Smi::New(value));
+    raw_ptr()->set_used_data(Smi::New(value));
   }
   static intptr_t used_data_offset() {
     return OFFSET_OF(LinkedHashMapLayout, used_data_);
   }
 
-  SmiPtr deleted_keys() const { return raw_ptr()->deleted_keys_; }
+  SmiPtr deleted_keys() const { return raw_ptr()->deleted_keys(); }
   void SetDeletedKeys(intptr_t value) const {
-    StoreSmi(&raw_ptr()->deleted_keys_, Smi::New(value));
+    raw_ptr()->set_deleted_keys(Smi::New(value));
   }
   static intptr_t deleted_keys_offset() {
     return OFFSET_OF(LinkedHashMapLayout, deleted_keys_);
@@ -10459,11 +10445,11 @@
 
   intptr_t Length() const {
     // The map may be uninitialized.
-    if (raw_ptr()->used_data_ == Object::null()) return 0;
-    if (raw_ptr()->deleted_keys_ == Object::null()) return 0;
+    if (raw_ptr()->used_data() == Object::null()) return 0;
+    if (raw_ptr()->deleted_keys() == Object::null()) return 0;
 
-    intptr_t used = Smi::Value(raw_ptr()->used_data_);
-    intptr_t deleted = Smi::Value(raw_ptr()->deleted_keys_);
+    intptr_t used = Smi::Value(raw_ptr()->used_data());
+    intptr_t deleted = Smi::Value(raw_ptr()->deleted_keys());
     return (used >> 1) - deleted;
   }
 
@@ -10523,41 +10509,41 @@
 class Closure : public Instance {
  public:
   TypeArgumentsPtr instantiator_type_arguments() const {
-    return raw_ptr()->instantiator_type_arguments_;
+    return raw_ptr()->instantiator_type_arguments();
   }
   void set_instantiator_type_arguments(const TypeArguments& args) const {
-    StorePointer(&raw_ptr()->instantiator_type_arguments_, args.raw());
+    raw_ptr()->set_instantiator_type_arguments(args.raw());
   }
   static intptr_t instantiator_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, instantiator_type_arguments_);
   }
 
   TypeArgumentsPtr function_type_arguments() const {
-    return raw_ptr()->function_type_arguments_;
+    return raw_ptr()->function_type_arguments();
   }
   void set_function_type_arguments(const TypeArguments& args) const {
-    StorePointer(&raw_ptr()->function_type_arguments_, args.raw());
+    raw_ptr()->set_function_type_arguments(args.raw());
   }
   static intptr_t function_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, function_type_arguments_);
   }
 
   TypeArgumentsPtr delayed_type_arguments() const {
-    return raw_ptr()->delayed_type_arguments_;
+    return raw_ptr()->delayed_type_arguments();
   }
   void set_delayed_type_arguments(const TypeArguments& args) const {
-    StorePointer(&raw_ptr()->delayed_type_arguments_, args.raw());
+    raw_ptr()->set_delayed_type_arguments(args.raw());
   }
   static intptr_t delayed_type_arguments_offset() {
     return OFFSET_OF(ClosureLayout, delayed_type_arguments_);
   }
 
-  FunctionPtr function() const { return raw_ptr()->function_; }
+  FunctionPtr function() const { return raw_ptr()->function(); }
   static intptr_t function_offset() {
     return OFFSET_OF(ClosureLayout, function_);
   }
 
-  ContextPtr context() const { return raw_ptr()->context_; }
+  ContextPtr context() const { return raw_ptr()->context(); }
   static intptr_t context_offset() {
     return OFFSET_OF(ClosureLayout, context_);
   }
@@ -10567,7 +10553,7 @@
   // No need for NumParentTypeParameters, as a closure is always closed over
   // its parents type parameters (i.e., function_type_parameters() above).
 
-  SmiPtr hash() const { return raw_ptr()->hash_; }
+  SmiPtr hash() const { return raw_ptr()->hash(); }
   static intptr_t hash_offset() { return OFFSET_OF(ClosureLayout, hash_); }
 
   static intptr_t InstanceSize() {
@@ -10619,18 +10605,18 @@
 
 class ReceivePort : public Instance {
  public:
-  SendPortPtr send_port() const { return raw_ptr()->send_port_; }
+  SendPortPtr send_port() const { return raw_ptr()->send_port(); }
   Dart_Port Id() const { return send_port()->ptr()->id_; }
 
-  InstancePtr handler() const { return raw_ptr()->handler_; }
+  InstancePtr handler() const { return raw_ptr()->handler(); }
   void set_handler(const Instance& value) const;
 
 #if !defined(PRODUCT)
   StackTracePtr allocation_location() const {
-    return raw_ptr()->allocation_location_;
+    return raw_ptr()->allocation_location();
   }
 
-  StringPtr debug_name() const { return raw_ptr()->debug_name_; }
+  StringPtr debug_name() const { return raw_ptr()->debug_name(); }
 #endif
 
   static intptr_t InstanceSize() {
@@ -10720,15 +10706,15 @@
 
   intptr_t Length() const;
 
-  StackTracePtr async_link() const { return raw_ptr()->async_link_; }
+  StackTracePtr async_link() const { return raw_ptr()->async_link(); }
   void set_async_link(const StackTrace& async_link) const;
   void set_expand_inlined(bool value) const;
 
-  ArrayPtr code_array() const { return raw_ptr()->code_array_; }
+  ArrayPtr code_array() const { return raw_ptr()->code_array(); }
   ObjectPtr CodeAtFrame(intptr_t frame_index) const;
   void SetCodeAtFrame(intptr_t frame_index, const Object& code) const;
 
-  ArrayPtr pc_offset_array() const { return raw_ptr()->pc_offset_array_; }
+  ArrayPtr pc_offset_array() const { return raw_ptr()->pc_offset_array(); }
   SmiPtr PcOffsetAtFrame(intptr_t frame_index) const;
   void SetPcOffsetAtFrame(intptr_t frame_index, const Smi& pc_offset) const;
 
@@ -10853,19 +10839,19 @@
                        : raw_ptr()->num_two_byte_registers_;
   }
 
-  StringPtr pattern() const { return raw_ptr()->pattern_; }
+  StringPtr pattern() const { return raw_ptr()->pattern(); }
   SmiPtr num_bracket_expressions() const {
-    return raw_ptr()->num_bracket_expressions_;
+    return raw_ptr()->num_bracket_expressions();
   }
-  ArrayPtr capture_name_map() const { return raw_ptr()->capture_name_map_; }
+  ArrayPtr capture_name_map() const { return raw_ptr()->capture_name_map(); }
 
   TypedDataPtr bytecode(bool is_one_byte, bool sticky) const {
     if (sticky) {
-      return is_one_byte ? raw_ptr()->one_byte_sticky_.bytecode_
-                         : raw_ptr()->two_byte_sticky_.bytecode_;
+      return TypedData::RawCast(is_one_byte ? raw_ptr()->one_byte_sticky_
+                                            : raw_ptr()->two_byte_sticky_);
     } else {
-      return is_one_byte ? raw_ptr()->one_byte_.bytecode_
-                         : raw_ptr()->two_byte_.bytecode_;
+      return TypedData::RawCast(is_one_byte ? raw_ptr()->one_byte_
+                                            : raw_ptr()->two_byte_);
     }
   }
 
@@ -10873,24 +10859,24 @@
     if (sticky) {
       switch (cid) {
         case kOneByteStringCid:
-          return OFFSET_OF(RegExpLayout, one_byte_sticky_.function_);
+          return OFFSET_OF(RegExpLayout, one_byte_sticky_);
         case kTwoByteStringCid:
-          return OFFSET_OF(RegExpLayout, two_byte_sticky_.function_);
+          return OFFSET_OF(RegExpLayout, two_byte_sticky_);
         case kExternalOneByteStringCid:
-          return OFFSET_OF(RegExpLayout, external_one_byte_sticky_function_);
+          return OFFSET_OF(RegExpLayout, external_one_byte_sticky_);
         case kExternalTwoByteStringCid:
-          return OFFSET_OF(RegExpLayout, external_two_byte_sticky_function_);
+          return OFFSET_OF(RegExpLayout, external_two_byte_sticky_);
       }
     } else {
       switch (cid) {
         case kOneByteStringCid:
-          return OFFSET_OF(RegExpLayout, one_byte_.function_);
+          return OFFSET_OF(RegExpLayout, one_byte_);
         case kTwoByteStringCid:
-          return OFFSET_OF(RegExpLayout, two_byte_.function_);
+          return OFFSET_OF(RegExpLayout, two_byte_);
         case kExternalOneByteStringCid:
-          return OFFSET_OF(RegExpLayout, external_one_byte_function_);
+          return OFFSET_OF(RegExpLayout, external_one_byte_);
         case kExternalTwoByteStringCid:
-          return OFFSET_OF(RegExpLayout, external_two_byte_function_);
+          return OFFSET_OF(RegExpLayout, external_two_byte_);
       }
     }
 
@@ -10981,16 +10967,14 @@
 
 class WeakProperty : public Instance {
  public:
-  ObjectPtr key() const { return raw_ptr()->key_; }
+  ObjectPtr key() const { return raw_ptr()->key(); }
 
-  void set_key(const Object& key) const {
-    StorePointer(&raw_ptr()->key_, key.raw());
-  }
+  void set_key(const Object& key) const { raw_ptr()->set_key(key.raw()); }
 
-  ObjectPtr value() const { return raw_ptr()->value_; }
+  ObjectPtr value() const { return raw_ptr()->value(); }
 
   void set_value(const Object& value) const {
-    StorePointer(&raw_ptr()->value_, value.raw());
+    raw_ptr()->set_value(value.raw());
   }
 
   static WeakPropertyPtr New(Heap::Space space = Heap::kNew);
@@ -11013,10 +10997,10 @@
 
 class MirrorReference : public Instance {
  public:
-  ObjectPtr referent() const { return raw_ptr()->referent_; }
+  ObjectPtr referent() const { return raw_ptr()->referent(); }
 
   void set_referent(const Object& referent) const {
-    StorePointer(&raw_ptr()->referent_, referent.raw());
+    raw_ptr()->set_referent(referent.raw());
   }
 
   AbstractTypePtr GetAbstractTypeReferent() const;
@@ -11053,7 +11037,7 @@
   }
   static intptr_t tag_offset() { return OFFSET_OF(UserTagLayout, tag_); }
 
-  StringPtr label() const { return raw_ptr()->label_; }
+  StringPtr label() const { return raw_ptr()->label(); }
 
   void MakeActive() const;
 
@@ -11072,7 +11056,7 @@
   static void AddTagToIsolate(Thread* thread, const UserTag& tag);
 
   void set_label(const String& tag_label) const {
-    StorePointer(&raw_ptr()->label_, tag_label.raw());
+    raw_ptr()->set_label(tag_label.raw());
   }
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(UserTag, Instance);
@@ -11087,7 +11071,7 @@
   }
 
   virtual TypeArgumentsPtr GetTypeArguments() const {
-    return raw_ptr()->type_arguments_;
+    return raw_ptr()->type_arguments();
   }
   static intptr_t type_arguments_offset() {
     return OFFSET_OF(FutureOrLayout, type_arguments_);
@@ -11142,7 +11126,7 @@
 
 intptr_t Field::HostOffset() const {
   ASSERT(is_instance());  // Valid only for dart instance fields.
-  return (Smi::Value(raw_ptr()->host_offset_or_field_id_) * kWordSize);
+  return (Smi::Value(raw_ptr()->host_offset_or_field_id()) * kWordSize);
 }
 
 intptr_t Field::TargetOffset() const {
@@ -11166,8 +11150,8 @@
                       intptr_t target_offset_in_bytes) const {
   ASSERT(is_instance());  // Valid only for dart instance fields.
   ASSERT(kWordSize != 0);
-  StoreSmi(&raw_ptr()->host_offset_or_field_id_,
-           Smi::New(host_offset_in_bytes / kWordSize));
+  raw_ptr()->set_host_offset_or_field_id(
+      Smi::New(host_offset_in_bytes / kWordSize));
 #if !defined(DART_PRECOMPILED_RUNTIME)
   ASSERT(compiler::target::kWordSize != 0);
   StoreNonPointer(&raw_ptr()->target_offset_,
@@ -11180,21 +11164,21 @@
 InstancePtr Field::StaticValue() const {
   ASSERT(is_static());  // Valid only for static dart fields.
   return Isolate::Current()->field_table()->At(
-      Smi::Value(raw_ptr()->host_offset_or_field_id_));
+      Smi::Value(raw_ptr()->host_offset_or_field_id()));
 }
 
 inline intptr_t Field::field_id() const {
-  return Smi::Value(raw_ptr()->host_offset_or_field_id_);
+  return Smi::Value(raw_ptr()->host_offset_or_field_id());
 }
 
 void Field::set_field_id(intptr_t field_id) const {
   ASSERT(is_static());
   ASSERT(Thread::Current()->IsMutatorThread());
-  StoreSmi(&raw_ptr()->host_offset_or_field_id_, Smi::New(field_id));
+  raw_ptr()->set_host_offset_or_field_id(Smi::New(field_id));
 }
 
 void Context::SetAt(intptr_t index, const Object& value) const {
-  StorePointer(ObjectAddr(index), value.raw());
+  raw_ptr()->set_element(index, value.raw());
 }
 
 intptr_t Instance::GetNativeField(int index) const {
@@ -11276,7 +11260,7 @@
 }
 
 inline intptr_t Type::Hash() const {
-  intptr_t result = Smi::Value(raw_ptr()->hash_);
+  intptr_t result = Smi::Value(raw_ptr()->hash());
   if (result != 0) {
     return result;
   }
@@ -11286,12 +11270,12 @@
 inline void Type::SetHash(intptr_t value) const {
   // This is only safe because we create a new Smi, which does not cause
   // heap allocation.
-  StoreSmi(&raw_ptr()->hash_, Smi::New(value));
+  raw_ptr()->set_hash(Smi::New(value));
 }
 
 inline intptr_t TypeParameter::Hash() const {
   ASSERT(IsFinalized());
-  intptr_t result = Smi::Value(raw_ptr()->hash_);
+  intptr_t result = Smi::Value(raw_ptr()->hash());
   if (result != 0) {
     return result;
   }
@@ -11301,12 +11285,12 @@
 inline void TypeParameter::SetHash(intptr_t value) const {
   // This is only safe because we create a new Smi, which does not cause
   // heap allocation.
-  StoreSmi(&raw_ptr()->hash_, Smi::New(value));
+  raw_ptr()->set_hash(Smi::New(value));
 }
 
 inline intptr_t TypeArguments::Hash() const {
   if (IsNull()) return kAllDynamicHash;
-  intptr_t result = Smi::Value(raw_ptr()->hash_);
+  intptr_t result = Smi::Value(raw_ptr()->hash());
   if (result != 0) {
     return result;
   }
@@ -11316,7 +11300,7 @@
 inline void TypeArguments::SetHash(intptr_t value) const {
   // This is only safe because we create a new Smi, which does not cause
   // heap allocation.
-  StoreSmi(&raw_ptr()->hash_, Smi::New(value));
+  raw_ptr()->set_hash(Smi::New(value));
 }
 
 inline uint16_t String::CharAt(StringPtr str, intptr_t index) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 6ef0636..0f9c283 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -48,10 +48,10 @@
 class CodeStatistics;
 
 #define VISIT_FROM(type, first)                                                \
-  type* from() { return reinterpret_cast<type*>(&first); }
+  type* from() { return reinterpret_cast<type*>(&first##_); }
 
 #define VISIT_TO(type, last)                                                   \
-  type* to() { return reinterpret_cast<type*>(&last); }
+  type* to() { return reinterpret_cast<type*>(&last##_); }
 
 #define VISIT_TO_LENGTH(type, last)                                            \
   type* to(intptr_t length) { return reinterpret_cast<type*>(last); }
@@ -536,9 +536,9 @@
   // All writes to heap objects should ultimately pass through one of the
   // methods below or their counterparts in Object, to ensure that the
   // write barrier is correctly applied.
-
+ protected:
   template <typename type, std::memory_order order = std::memory_order_relaxed>
-  type LoadPointer(type const* addr) {
+  type LoadPointer(type const* addr) const {
     return reinterpret_cast<std::atomic<type>*>(const_cast<type*>(addr))
         ->load(order);
   }
@@ -568,6 +568,7 @@
     }
   }
 
+ private:
   DART_FORCE_INLINE
   void CheckHeapPointerStore(ObjectPtr value, Thread* thread) {
     uword source_tags = this->tags_;
@@ -649,12 +650,20 @@
     }
   }
 
+ protected:
+  template <typename type, std::memory_order order = std::memory_order_relaxed>
+  type LoadSmi(type const* addr) const {
+    return reinterpret_cast<std::atomic<type>*>(const_cast<type*>(addr))
+        ->load(order);
+  }
   // Use for storing into an explicitly Smi-typed field of an object
   // (i.e., both the previous and new value are Smis).
+  template <std::memory_order order = std::memory_order_relaxed>
   void StoreSmi(SmiPtr const* addr, SmiPtr value) {
     // Can't use Contains, as array length is initialized through this method.
     ASSERT(reinterpret_cast<uword>(addr) >= ObjectLayout::ToAddr(this));
-    *const_cast<SmiPtr*>(addr) = value;
+    reinterpret_cast<std::atomic<SmiPtr>*>(const_cast<SmiPtr*>(addr))
+        ->store(value, order);
   }
   NO_SANITIZE_THREAD
   void StoreSmiIgnoreRace(SmiPtr const* addr, SmiPtr value) {
@@ -663,10 +672,10 @@
     *const_cast<SmiPtr*>(addr) = value;
   }
 
- protected:
   friend class StoreBufferUpdateVisitor;  // RememberCard
   void RememberCard(ObjectPtr const* slot);
 
+ private:
   friend class Array;
   friend class ByteBuffer;
   friend class CidRewriteVisitor;
@@ -720,6 +729,70 @@
   return ptr()->GetClassId();
 }
 
+#define POINTER_FIELD(type, name)                                              \
+ public:                                                                       \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  type name() const {                                                          \
+    return LoadPointer<type, order>(&name##_);                                 \
+  }                                                                            \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  void set_##name(type value) {                                                \
+    StorePointer<type, order>(&name##_, value);                                \
+  }                                                                            \
+                                                                               \
+ protected:                                                                    \
+  type name##_;
+
+#define ARRAY_POINTER_FIELD(type, name)                                        \
+ public:                                                                       \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  type name() const {                                                          \
+    return LoadPointer<type, order>(&name##_);                                 \
+  }                                                                            \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  void set_##name(type value) {                                                \
+    StoreArrayPointer<type, order>(&name##_, value);                           \
+  }                                                                            \
+                                                                               \
+ protected:                                                                    \
+  type name##_;
+
+#define VARIABLE_POINTER_FIELDS(type, accessor_name, array_name)               \
+ public:                                                                       \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  type accessor_name(intptr_t index) const {                                   \
+    return LoadPointer<type, order>(&array_name()[index]);                     \
+  }                                                                            \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  void set_##accessor_name(intptr_t index, type value) {                       \
+    StoreArrayPointer<type, order>(&array_name()[index], value);               \
+  }                                                                            \
+                                                                               \
+ protected:                                                                    \
+  type* array_name() { OPEN_ARRAY_START(type, type); }                         \
+  type const* array_name() const { OPEN_ARRAY_START(type, type); }
+
+#define SMI_FIELD(type, name)                                                  \
+ public:                                                                       \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  type name() const {                                                          \
+    type result = LoadSmi<type, order>(&name##_);                              \
+    ASSERT(!result.IsHeapObject());                                            \
+    return result;                                                             \
+  }                                                                            \
+  template <std::memory_order order = std::memory_order_relaxed>               \
+  void set_##name(type value) {                                                \
+    ASSERT(!value.IsHeapObject());                                             \
+    StoreSmi<order>(&name##_, value);                                          \
+  }                                                                            \
+  void set_##name##_ignore_race(type value) {                                  \
+    ASSERT(!value.IsHeapObject());                                             \
+    StoreSmiIgnoreRace(&name##_, value);                                       \
+  }                                                                            \
+                                                                               \
+ protected:                                                                    \
+  type name##_;
+
 class ClassLayout : public ObjectLayout {
  public:
   enum ClassFinalizedState {
@@ -745,27 +818,32 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Class);
 
-  VISIT_FROM(ObjectPtr, name_);
-  StringPtr name_;
-  StringPtr user_name_;
-  ArrayPtr functions_;
-  ArrayPtr functions_hash_table_;
-  ArrayPtr fields_;
-  ArrayPtr offset_in_words_to_field_;
-  ArrayPtr interfaces_;  // Array of AbstractType.
-  ScriptPtr script_;
-  LibraryPtr library_;
-  TypeArgumentsPtr type_parameters_;  // Array of TypeParameter.
-  AbstractTypePtr super_type_;
-  FunctionPtr signature_function_;  // Associated function for typedef class.
-  ArrayPtr constants_;        // Canonicalized const instances of this class.
-  TypePtr declaration_type_;  // Declaration type for this class.
-  ArrayPtr invocation_dispatcher_cache_;  // Cache for dispatcher functions.
-  CodePtr allocation_stub_;  // Stub code for allocation of instances.
-  GrowableObjectArrayPtr direct_implementors_;  // Array of Class.
-  GrowableObjectArrayPtr direct_subclasses_;    // Array of Class.
-  ArrayPtr dependent_code_;                     // CHA optimized codes.
-  VISIT_TO(ObjectPtr, dependent_code_);
+  VISIT_FROM(ObjectPtr, name)
+  POINTER_FIELD(StringPtr, name)
+  POINTER_FIELD(StringPtr, user_name)
+  POINTER_FIELD(ArrayPtr, functions)
+  POINTER_FIELD(ArrayPtr, functions_hash_table)
+  POINTER_FIELD(ArrayPtr, fields)
+  POINTER_FIELD(ArrayPtr, offset_in_words_to_field)
+  POINTER_FIELD(ArrayPtr, interfaces)  // Array of AbstractType.
+  POINTER_FIELD(ScriptPtr, script)
+  POINTER_FIELD(LibraryPtr, library)
+  POINTER_FIELD(TypeArgumentsPtr, type_parameters)  // Array of TypeParameter.
+  POINTER_FIELD(AbstractTypePtr, super_type)
+  POINTER_FIELD(FunctionPtr,
+                signature_function)  // Associated function for typedef class.
+  POINTER_FIELD(ArrayPtr,
+                constants)  // Canonicalized const instances of this class.
+  POINTER_FIELD(TypePtr, declaration_type)  // Declaration type for this class.
+  POINTER_FIELD(ArrayPtr,
+                invocation_dispatcher_cache)  // Cache for dispatcher functions.
+  POINTER_FIELD(CodePtr,
+                allocation_stub)  // Stub code for allocation of instances.
+  POINTER_FIELD(GrowableObjectArrayPtr,
+                direct_implementors)                        // Array of Class.
+  POINTER_FIELD(GrowableObjectArrayPtr, direct_subclasses)  // Array of Class.
+  POINTER_FIELD(ArrayPtr, dependent_code)  // CHA optimized codes.
+  VISIT_TO(ObjectPtr, dependent_code)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -832,12 +910,12 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
 
-  VISIT_FROM(ObjectPtr, patched_class_);
-  ClassPtr patched_class_;
-  ClassPtr origin_class_;
-  ScriptPtr script_;
-  ExternalTypedDataPtr library_kernel_data_;
-  VISIT_TO(ObjectPtr, library_kernel_data_);
+  VISIT_FROM(ObjectPtr, patched_class)
+  POINTER_FIELD(ClassPtr, patched_class)
+  POINTER_FIELD(ClassPtr, origin_class)
+  POINTER_FIELD(ScriptPtr, script)
+  POINTER_FIELD(ExternalTypedDataPtr, library_kernel_data)
+  VISIT_TO(ObjectPtr, library_kernel_data)
 
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
@@ -1021,16 +1099,17 @@
   uword entry_point_;            // Accessed from generated code.
   uword unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(ObjectPtr, name_);
-  StringPtr name_;
-  ObjectPtr owner_;  // Class or patch class or mixin class
-                     // where this function is defined.
-  AbstractTypePtr result_type_;
-  ArrayPtr parameter_types_;
-  ArrayPtr parameter_names_;
-  TypeArgumentsPtr type_parameters_;  // Array of TypeParameter.
-  ObjectPtr data_;  // Additional data specific to the function kind. See
-                    // Function::set_data() for details.
+  VISIT_FROM(ObjectPtr, name)
+  POINTER_FIELD(StringPtr, name)
+  POINTER_FIELD(ObjectPtr, owner)  // Class or patch class or mixin class
+                                   // where this function is defined.
+  POINTER_FIELD(AbstractTypePtr, result_type)
+  POINTER_FIELD(ArrayPtr, parameter_types)
+  POINTER_FIELD(ArrayPtr, parameter_names)
+  POINTER_FIELD(TypeArgumentsPtr, type_parameters)  // Array of TypeParameter.
+  POINTER_FIELD(ObjectPtr,
+                data)  // Additional data specific to the function kind. See
+                       // Function::set_data() for details.
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1046,17 +1125,19 @@
     UNREACHABLE();
     return NULL;
   }
-  ArrayPtr ic_data_array_;  // ICData of unoptimized code.
+  POINTER_FIELD(ArrayPtr, ic_data_array);  // ICData of unoptimized code.
   ObjectPtr* to_no_code() {
     return reinterpret_cast<ObjectPtr*>(&ic_data_array_);
   }
-  CodePtr code_;  // Currently active code. Accessed from generated code.
-  NOT_IN_PRECOMPILED(CodePtr unoptimized_code_);  // Unoptimized code, keep it
+  POINTER_FIELD(CodePtr,
+                code);  // Currently active code. Accessed from generated code.
+  NOT_IN_PRECOMPILED(
+      POINTER_FIELD(CodePtr, unoptimized_code));  // Unoptimized code, keep it
                                                   // after optimization.
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(ObjectPtr, code_);
+  VISIT_TO(ObjectPtr, code);
 #else
-  VISIT_TO(ObjectPtr, unoptimized_code_);
+  VISIT_TO(ObjectPtr, unoptimized_code);
 #endif
 
   NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
@@ -1113,16 +1194,18 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData);
 
-  VISIT_FROM(ObjectPtr, context_scope_);
-  ContextScopePtr context_scope_;
-  FunctionPtr parent_function_;  // Enclosing function of this local function.
-  TypePtr signature_type_;
-  InstancePtr closure_;  // Closure object for static implicit closures.
+  VISIT_FROM(ObjectPtr, context_scope)
+  POINTER_FIELD(ContextScopePtr, context_scope)
+  POINTER_FIELD(FunctionPtr,
+                parent_function)  // Enclosing function of this local function.
+  POINTER_FIELD(TypePtr, signature_type)
+  POINTER_FIELD(InstancePtr,
+                closure)  // Closure object for static implicit closures.
   // Instantiate-to-bounds TAV for use when no TAV is provided.
-  TypeArgumentsPtr default_type_arguments_;
+  POINTER_FIELD(TypeArgumentsPtr, default_type_arguments)
   // Additional information about the instantiate-to-bounds TAV.
-  SmiPtr default_type_arguments_info_;
-  VISIT_TO(ObjectPtr, default_type_arguments_info_);
+  POINTER_FIELD(SmiPtr, default_type_arguments_info)
+  VISIT_TO(ObjectPtr, default_type_arguments_info)
 
   friend class Function;
 };
@@ -1131,10 +1214,11 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(SignatureData);
 
-  VISIT_FROM(ObjectPtr, parent_function_);
-  FunctionPtr parent_function_;  // Enclosing function of this sig. function.
-  TypePtr signature_type_;
-  VISIT_TO(ObjectPtr, signature_type_);
+  VISIT_FROM(ObjectPtr, parent_function)
+  POINTER_FIELD(FunctionPtr,
+                parent_function);  // Enclosing function of this sig. function.
+  POINTER_FIELD(TypePtr, signature_type)
+  VISIT_TO(ObjectPtr, signature_type)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Function;
@@ -1144,17 +1228,17 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(FfiTrampolineData);
 
-  VISIT_FROM(ObjectPtr, signature_type_);
-  TypePtr signature_type_;
-  FunctionPtr c_signature_;
+  VISIT_FROM(ObjectPtr, signature_type)
+  POINTER_FIELD(TypePtr, signature_type)
+  POINTER_FIELD(FunctionPtr, c_signature)
 
   // Target Dart method for callbacks, otherwise null.
-  FunctionPtr callback_target_;
+  POINTER_FIELD(FunctionPtr, callback_target)
 
   // For callbacks, value to return if Dart target throws an exception.
-  InstancePtr callback_exceptional_return_;
+  POINTER_FIELD(InstancePtr, callback_exceptional_return)
 
-  VISIT_TO(ObjectPtr, callback_exceptional_return_);
+  VISIT_TO(ObjectPtr, callback_exceptional_return)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Callback id for callbacks.
@@ -1172,18 +1256,19 @@
 class FieldLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Field);
 
-  VISIT_FROM(ObjectPtr, name_);
-  StringPtr name_;
-  ObjectPtr owner_;  // Class or patch class or mixin class
-                     // where this field is defined or original field.
-  AbstractTypePtr type_;
-  FunctionPtr initializer_function_;  // Static initializer function.
+  VISIT_FROM(ObjectPtr, name)
+  POINTER_FIELD(StringPtr, name)
+  POINTER_FIELD(ObjectPtr, owner)  // Class or patch class or mixin class
+  // where this field is defined or original field.
+  POINTER_FIELD(AbstractTypePtr, type)
+  POINTER_FIELD(FunctionPtr,
+                initializer_function)  // Static initializer function.
 
   // - for instance fields: offset in words to the value in the class instance.
   // - for static fields: index into field_table.
-  SmiPtr host_offset_or_field_id_;
-  SmiPtr guarded_list_length_;
-  ArrayPtr dependent_code_;
+  SMI_FIELD(SmiPtr, host_offset_or_field_id)
+  SMI_FIELD(SmiPtr, guarded_list_length)
+  POINTER_FIELD(ArrayPtr, dependent_code)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFull:
@@ -1200,10 +1285,11 @@
     return NULL;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(ObjectPtr, dependent_code_);
+  VISIT_TO(ObjectPtr, dependent_code);
 #else
-  SubtypeTestCachePtr type_test_cache_;  // For type test in implicit setter.
-  VISIT_TO(ObjectPtr, type_test_cache_);
+  POINTER_FIELD(SubtypeTestCachePtr,
+                type_test_cache);  // For type test in implicit setter.
+  VISIT_TO(ObjectPtr, type_test_cache);
 #endif
   TokenPosition token_pos_;
   TokenPosition end_token_pos_;
@@ -1248,15 +1334,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Script);
 
-  VISIT_FROM(ObjectPtr, url_);
-  StringPtr url_;
-  StringPtr resolved_url_;
-  ArrayPtr compile_time_constants_;
-  TypedDataPtr line_starts_;
-  ArrayPtr debug_positions_;
-  KernelProgramInfoPtr kernel_program_info_;
-  StringPtr source_;
-  VISIT_TO(ObjectPtr, source_);
+  VISIT_FROM(ObjectPtr, url)
+  POINTER_FIELD(StringPtr, url)
+  POINTER_FIELD(StringPtr, resolved_url)
+  POINTER_FIELD(ArrayPtr, compile_time_constants)
+  POINTER_FIELD(TypedDataPtr, line_starts)
+  POINTER_FIELD(ArrayPtr, debug_positions)
+  POINTER_FIELD(KernelProgramInfoPtr, kernel_program_info)
+  POINTER_FIELD(StringPtr, source)
+  VISIT_TO(ObjectPtr, source)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1318,19 +1404,22 @@
 
   RAW_HEAP_OBJECT_IMPLEMENTATION(Library);
 
-  VISIT_FROM(ObjectPtr, name_);
-  StringPtr name_;
-  StringPtr url_;
-  StringPtr private_key_;
-  ArrayPtr dictionary_;              // Top-level names in this library.
-  GrowableObjectArrayPtr metadata_;  // Metadata on classes, methods etc.
-  ClassPtr toplevel_class_;          // Class containing top-level elements.
-  GrowableObjectArrayPtr used_scripts_;
-  LoadingUnitPtr loading_unit_;
-  ArrayPtr imports_;  // List of Namespaces imported without prefix.
-  ArrayPtr exports_;  // List of re-exported Namespaces.
-  ArrayPtr dependencies_;
-  ExternalTypedDataPtr kernel_data_;
+  VISIT_FROM(ObjectPtr, name)
+  POINTER_FIELD(StringPtr, name)
+  POINTER_FIELD(StringPtr, url)
+  POINTER_FIELD(StringPtr, private_key)
+  POINTER_FIELD(ArrayPtr, dictionary)  // Top-level names in this library.
+  POINTER_FIELD(GrowableObjectArrayPtr,
+                metadata)  // Metadata on classes, methods etc.
+  POINTER_FIELD(ClassPtr,
+                toplevel_class)  // Class containing top-level elements.
+  POINTER_FIELD(GrowableObjectArrayPtr, used_scripts)
+  POINTER_FIELD(LoadingUnitPtr, loading_unit)
+  POINTER_FIELD(ArrayPtr,
+                imports)  // List of Namespaces imported without prefix.
+  POINTER_FIELD(ArrayPtr, exports)  // List of re-exported Namespaces.
+  POINTER_FIELD(ArrayPtr, dependencies)
+  POINTER_FIELD(ExternalTypedDataPtr, kernel_data)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1347,10 +1436,13 @@
     UNREACHABLE();
     return NULL;
   }
-  ArrayPtr resolved_names_;  // Cache of resolved names in library scope.
-  ArrayPtr exported_names_;  // Cache of exported names by library.
-  ArrayPtr loaded_scripts_;  // Array of scripts loaded in this library.
-  VISIT_TO(ObjectPtr, loaded_scripts_);
+  POINTER_FIELD(ArrayPtr,
+                resolved_names);  // Cache of resolved names in library scope.
+  POINTER_FIELD(ArrayPtr,
+                exported_names);  // Cache of exported names by library.
+  POINTER_FIELD(ArrayPtr,
+                loaded_scripts);  // Array of scripts loaded in this library.
+  VISIT_TO(ObjectPtr, loaded_scripts);
 
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
@@ -1370,34 +1462,35 @@
 class NamespaceLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace);
 
-  VISIT_FROM(ObjectPtr, library_);
-  LibraryPtr library_;       // library with name dictionary.
-  ArrayPtr show_names_;      // list of names that are exported.
-  ArrayPtr hide_names_;      // list of names that are hidden.
-  FieldPtr metadata_field_;  // remembers the token pos of metadata if any,
-                             // and the metadata values if computed.
-  VISIT_TO(ObjectPtr, metadata_field_);
+  VISIT_FROM(ObjectPtr, library)
+  POINTER_FIELD(LibraryPtr, library)   // library with name dictionary.
+  POINTER_FIELD(ArrayPtr, show_names)  // list of names that are exported.
+  POINTER_FIELD(ArrayPtr, hide_names)  // list of names that are hidden.
+  POINTER_FIELD(FieldPtr,
+                metadata_field)  // remembers the token pos of metadata if any,
+                                 // and the metadata values if computed.
+  VISIT_TO(ObjectPtr, metadata_field)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class KernelProgramInfoLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(KernelProgramInfo);
 
-  VISIT_FROM(ObjectPtr, string_offsets_);
-  TypedDataPtr string_offsets_;
-  ExternalTypedDataPtr string_data_;
-  TypedDataPtr canonical_names_;
-  ExternalTypedDataPtr metadata_payloads_;
-  ExternalTypedDataPtr metadata_mappings_;
-  ArrayPtr scripts_;
-  ArrayPtr constants_;
-  GrowableObjectArrayPtr potential_natives_;
-  GrowableObjectArrayPtr potential_pragma_functions_;
-  ExternalTypedDataPtr constants_table_;
-  ArrayPtr libraries_cache_;
-  ArrayPtr classes_cache_;
-  ObjectPtr retained_kernel_blob_;
-  VISIT_TO(ObjectPtr, retained_kernel_blob_);
+  VISIT_FROM(ObjectPtr, string_offsets)
+  POINTER_FIELD(TypedDataPtr, string_offsets)
+  POINTER_FIELD(ExternalTypedDataPtr, string_data)
+  POINTER_FIELD(TypedDataPtr, canonical_names)
+  POINTER_FIELD(ExternalTypedDataPtr, metadata_payloads)
+  POINTER_FIELD(ExternalTypedDataPtr, metadata_mappings)
+  POINTER_FIELD(ArrayPtr, scripts)
+  POINTER_FIELD(ArrayPtr, constants)
+  POINTER_FIELD(GrowableObjectArrayPtr, potential_natives)
+  POINTER_FIELD(GrowableObjectArrayPtr, potential_pragma_functions)
+  POINTER_FIELD(ExternalTypedDataPtr, constants_table)
+  POINTER_FIELD(ArrayPtr, libraries_cache)
+  POINTER_FIELD(ArrayPtr, classes_cache)
+  POINTER_FIELD(ObjectPtr, retained_kernel_blob)
+  VISIT_TO(ObjectPtr, retained_kernel_blob)
 
   uint32_t kernel_binary_version_;
 
@@ -1413,9 +1506,9 @@
   VISIT_NOTHING();
   ClassIdTagType cid_;
 #else
-  VISIT_FROM(ObjectPtr, target_);
-  ObjectPtr target_;
-  VISIT_TO(ObjectPtr, target_);
+  VISIT_FROM(ObjectPtr, target)
+  POINTER_FIELD(ObjectPtr, target)
+  VISIT_TO(ObjectPtr, target)
 #endif
 };
 
@@ -1468,39 +1561,40 @@
   uword unchecked_entry_point_;              // Accessed from generated code.
   uword monomorphic_unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(ObjectPtr, object_pool_);
-  ObjectPoolPtr object_pool_;     // Accessed from generated code.
-  InstructionsPtr instructions_;  // Accessed from generated code.
+  VISIT_FROM(ObjectPtr, object_pool)
+  POINTER_FIELD(ObjectPoolPtr, object_pool)  // Accessed from generated code.
+  POINTER_FIELD(InstructionsPtr,
+                instructions)  // Accessed from generated code.
   // If owner_ is Function::null() the owner is a regular stub.
   // If owner_ is a Class the owner is the allocation stub for that class.
   // Else, owner_ is a regular Dart Function.
-  ObjectPtr owner_;  // Function, Null, or a Class.
-  ExceptionHandlersPtr exception_handlers_;
-  PcDescriptorsPtr pc_descriptors_;
+  POINTER_FIELD(ObjectPtr, owner)  // Function, Null, or a Class.
+  POINTER_FIELD(ExceptionHandlersPtr, exception_handlers)
+  POINTER_FIELD(PcDescriptorsPtr, pc_descriptors)
   // If FLAG_precompiled_mode, then this field contains
   //   TypedDataPtr catch_entry_moves_maps
   // Otherwise, it is
   //   SmiPtr num_variables
-  ObjectPtr catch_entry_;
-  CompressedStackMapsPtr compressed_stackmaps_;
-  ArrayPtr inlined_id_to_function_;
-  CodeSourceMapPtr code_source_map_;
-  NOT_IN_PRECOMPILED(InstructionsPtr active_instructions_);
-  NOT_IN_PRECOMPILED(ArrayPtr deopt_info_array_);
+  POINTER_FIELD(ObjectPtr, catch_entry)
+  POINTER_FIELD(CompressedStackMapsPtr, compressed_stackmaps)
+  POINTER_FIELD(ArrayPtr, inlined_id_to_function)
+  POINTER_FIELD(CodeSourceMapPtr, code_source_map)
+  NOT_IN_PRECOMPILED(POINTER_FIELD(InstructionsPtr, active_instructions))
+  NOT_IN_PRECOMPILED(POINTER_FIELD(ArrayPtr, deopt_info_array))
   // (code-offset, function, code) triples.
-  NOT_IN_PRECOMPILED(ArrayPtr static_calls_target_table_);
+  NOT_IN_PRECOMPILED(POINTER_FIELD(ArrayPtr, static_calls_target_table))
   // If return_address_metadata_ is a Smi, it is the offset to the prologue.
   // Else, return_address_metadata_ is null.
-  NOT_IN_PRODUCT(ObjectPtr return_address_metadata_);
-  NOT_IN_PRODUCT(LocalVarDescriptorsPtr var_descriptors_);
-  NOT_IN_PRODUCT(ArrayPtr comments_);
+  NOT_IN_PRODUCT(POINTER_FIELD(ObjectPtr, return_address_metadata))
+  NOT_IN_PRODUCT(POINTER_FIELD(LocalVarDescriptorsPtr, var_descriptors))
+  NOT_IN_PRODUCT(POINTER_FIELD(ArrayPtr, comments))
 
 #if !defined(PRODUCT)
-  VISIT_TO(ObjectPtr, comments_);
+  VISIT_TO(ObjectPtr, comments);
 #elif defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(ObjectPtr, code_source_map_);
+  VISIT_TO(ObjectPtr, code_source_map);
 #else
-  VISIT_TO(ObjectPtr, static_calls_target_table_);
+  VISIT_TO(ObjectPtr, static_calls_target_table);
 #endif
 
   // Compilation timestamp.
@@ -1855,7 +1949,7 @@
   // platforms.
   uword num_entries_;
 
-  VISIT_FROM(ObjectPtr, names()[0]);
+  ObjectPtr* from() { return reinterpret_cast<ObjectPtr*>(&names()[0]); }
   StringPtr* names() {
     // Array of [num_entries_] variable names.
     OPEN_ARRAY_START(StringPtr, StringPtr);
@@ -1880,9 +1974,9 @@
 
   // Array with [num_entries_] entries. Each entry is an array of all handled
   // exception types.
-  VISIT_FROM(ObjectPtr, handled_types_data_)
-  ArrayPtr handled_types_data_;
-  VISIT_TO_LENGTH(ObjectPtr, &handled_types_data_);
+  VISIT_FROM(ObjectPtr, handled_types_data)
+  POINTER_FIELD(ArrayPtr, handled_types_data)
+  VISIT_TO_LENGTH(ObjectPtr, &handled_types_data_)
 
   // Exception handler info of length [num_entries_].
   const ExceptionHandlerInfo* data() const {
@@ -1900,12 +1994,10 @@
 
   int32_t num_variables_;
 
-  VISIT_FROM(ObjectPtr, parent_);
-  ContextPtr parent_;
-
+  VISIT_FROM(ObjectPtr, parent)
+  POINTER_FIELD(ContextPtr, parent)
   // Variable length data follows here.
-  ObjectPtr* data() { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
-  ObjectPtr const* data() const { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
+  VARIABLE_POINTER_FIELDS(ObjectPtr, element, data)
   VISIT_TO_LENGTH(ObjectPtr, &data()[length - 1]);
 
   friend class Object;
@@ -1964,9 +2056,9 @@
 
 class SingleTargetCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
-  VISIT_FROM(ObjectPtr, target_);
-  CodePtr target_;
-  VISIT_TO(ObjectPtr, target_);
+  VISIT_FROM(ObjectPtr, target)
+  POINTER_FIELD(CodePtr, target)
+  VISIT_TO(ObjectPtr, target)
   uword entry_point_;
   ClassIdTagType lower_limit_;
   ClassIdTagType upper_limit_;
@@ -1974,9 +2066,10 @@
 
 class MonomorphicSmiableCallLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MonomorphicSmiableCall);
-  VISIT_FROM(ObjectPtr, target_);
-  CodePtr target_;  // Entrypoint PC in bare mode, Code in non-bare mode.
-  VISIT_TO(ObjectPtr, target_);
+  VISIT_FROM(ObjectPtr, target)
+  POINTER_FIELD(CodePtr,
+                target);  // Entrypoint PC in bare mode, Code in non-bare mode.
+  VISIT_TO(ObjectPtr, target)
   uword expected_cid_;
   uword entrypoint_;
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
@@ -1985,18 +2078,18 @@
 // Abstract base class for RawICData/RawMegamorphicCache
 class CallSiteDataLayout : public ObjectLayout {
  protected:
-  StringPtr target_name_;  // Name of target function.
+  POINTER_FIELD(StringPtr, target_name);  // Name of target function.
   // arg_descriptor in RawICData and in RawMegamorphicCache should be
   // in the same position so that NoSuchMethod can access it.
-  ArrayPtr args_descriptor_;  // Arguments descriptor.
+  POINTER_FIELD(ArrayPtr, args_descriptor);  // Arguments descriptor.
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(CallSiteData)
 };
 
 class UnlinkedCallLayout : public CallSiteDataLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall);
-  VISIT_FROM(ObjectPtr, target_name_);
-  VISIT_TO(ObjectPtr, args_descriptor_);
+  VISIT_FROM(ObjectPtr, target_name)
+  VISIT_TO(ObjectPtr, args_descriptor)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   bool can_patch_to_monomorphic_;
@@ -2004,12 +2097,13 @@
 
 class ICDataLayout : public CallSiteDataLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
-  VISIT_FROM(ObjectPtr, target_name_);
-  ArrayPtr entries_;  // Contains class-ids, target and count.
+  VISIT_FROM(ObjectPtr, target_name)
+  POINTER_FIELD(ArrayPtr, entries)  // Contains class-ids, target and count.
   // Static type of the receiver, if instance call and available.
-  NOT_IN_PRECOMPILED(AbstractTypePtr receivers_static_type_);
-  ObjectPtr owner_;  // Parent/calling function or original IC of cloned IC.
-  VISIT_TO(ObjectPtr, owner_);
+  NOT_IN_PRECOMPILED(POINTER_FIELD(AbstractTypePtr, receivers_static_type))
+  POINTER_FIELD(ObjectPtr,
+                owner)  // Parent/calling function or original IC of cloned IC.
+  VISIT_TO(ObjectPtr, owner)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -2032,10 +2126,11 @@
 
 class MegamorphicCacheLayout : public CallSiteDataLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache);
-  VISIT_FROM(ObjectPtr, target_name_)
-  ArrayPtr buckets_;
-  SmiPtr mask_;
-  VISIT_TO(ObjectPtr, mask_)
+
+  VISIT_FROM(ObjectPtr, target_name)
+  POINTER_FIELD(ArrayPtr, buckets)
+  SMI_FIELD(SmiPtr, mask)
+  VISIT_TO(ObjectPtr, mask)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   int32_t filled_entry_count_;
@@ -2043,17 +2138,19 @@
 
 class SubtypeTestCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache);
-  VISIT_FROM(ObjectPtr, cache_);
-  ArrayPtr cache_;
-  VISIT_TO(ObjectPtr, cache_);
+
+  VISIT_FROM(ObjectPtr, cache)
+  POINTER_FIELD(ArrayPtr, cache)
+  VISIT_TO(ObjectPtr, cache)
 };
 
 class LoadingUnitLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LoadingUnit);
-  VISIT_FROM(ObjectPtr, parent_);
-  LoadingUnitPtr parent_;
-  ArrayPtr base_objects_;
-  VISIT_TO(ObjectPtr, base_objects_);
+
+  VISIT_FROM(ObjectPtr, parent)
+  POINTER_FIELD(LoadingUnitPtr, parent)
+  POINTER_FIELD(ArrayPtr, base_objects)
+  VISIT_TO(ObjectPtr, base_objects)
   int32_t id_;
   bool load_outstanding_;
   bool loaded_;
@@ -2066,20 +2163,21 @@
 class ApiErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError);
 
-  VISIT_FROM(ObjectPtr, message_)
-  StringPtr message_;
-  VISIT_TO(ObjectPtr, message_)
+  VISIT_FROM(ObjectPtr, message)
+  POINTER_FIELD(StringPtr, message)
+  VISIT_TO(ObjectPtr, message)
 };
 
 class LanguageErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError);
 
-  VISIT_FROM(ObjectPtr, previous_error_)
-  ErrorPtr previous_error_;  // May be null.
-  ScriptPtr script_;
-  StringPtr message_;
-  StringPtr formatted_message_;  // Incl. previous error's formatted message.
-  VISIT_TO(ObjectPtr, formatted_message_)
+  VISIT_FROM(ObjectPtr, previous_error)
+  POINTER_FIELD(ErrorPtr, previous_error)  // May be null.
+  POINTER_FIELD(ScriptPtr, script)
+  POINTER_FIELD(StringPtr, message)
+  POINTER_FIELD(StringPtr,
+                formatted_message)  // Incl. previous error's formatted message.
+  VISIT_TO(ObjectPtr, formatted_message)
   TokenPosition token_pos_;  // Source position in script_.
   bool report_after_token_;  // Report message at or after the token.
   int8_t kind_;              // Of type Report::Kind.
@@ -2090,19 +2188,19 @@
 class UnhandledExceptionLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException);
 
-  VISIT_FROM(ObjectPtr, exception_)
-  InstancePtr exception_;
-  InstancePtr stacktrace_;
-  VISIT_TO(ObjectPtr, stacktrace_)
+  VISIT_FROM(ObjectPtr, exception)
+  POINTER_FIELD(InstancePtr, exception)
+  POINTER_FIELD(InstancePtr, stacktrace)
+  VISIT_TO(ObjectPtr, stacktrace)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class UnwindErrorLayout : public ErrorLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError);
 
-  VISIT_FROM(ObjectPtr, message_)
-  StringPtr message_;
-  VISIT_TO(ObjectPtr, message_)
+  VISIT_FROM(ObjectPtr, message)
+  POINTER_FIELD(StringPtr, message)
+  VISIT_TO(ObjectPtr, message)
   bool is_user_initiated_;
 };
 
@@ -2113,11 +2211,11 @@
 class LibraryPrefixLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
 
-  VISIT_FROM(ObjectPtr, name_)
-  StringPtr name_;       // Library prefix name.
-  ArrayPtr imports_;     // Libraries imported with this prefix.
-  LibraryPtr importer_;  // Library which declares this prefix.
-  VISIT_TO(ObjectPtr, importer_)
+  VISIT_FROM(ObjectPtr, name)
+  POINTER_FIELD(StringPtr, name)       // Library prefix name.
+  POINTER_FIELD(ArrayPtr, imports)     // Libraries imported with this prefix.
+  POINTER_FIELD(LibraryPtr, importer)  // Library which declares this prefix.
+  VISIT_TO(ObjectPtr, importer)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -2143,20 +2241,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
 
-  VISIT_FROM(ObjectPtr, instantiations_)
+  VISIT_FROM(ObjectPtr, instantiations)
   // The instantiations_ array remains empty for instantiated type arguments.
-  ArrayPtr instantiations_;  // Of 3-tuple: 2 instantiators, result.
-  SmiPtr length_;
-  SmiPtr hash_;
-  SmiPtr nullability_;
-
+  POINTER_FIELD(ArrayPtr,
+                instantiations)  // Of 3-tuple: 2 instantiators, result.
+  SMI_FIELD(SmiPtr, length)
+  SMI_FIELD(SmiPtr, hash)
+  SMI_FIELD(SmiPtr, nullability)
   // Variable length data follows here.
-  AbstractTypePtr const* types() const {
-    OPEN_ARRAY_START(AbstractTypePtr, AbstractTypePtr);
-  }
-  AbstractTypePtr* types() {
-    OPEN_ARRAY_START(AbstractTypePtr, AbstractTypePtr);
-  }
+  VARIABLE_POINTER_FIELDS(AbstractTypePtr, element, types)
   ObjectPtr* to(intptr_t length) {
     return reinterpret_cast<ObjectPtr*>(&types()[length - 1]);
   }
@@ -2179,8 +2272,10 @@
   static constexpr intptr_t kTypeStateBitSize = 2;
 
   uword type_test_stub_entry_point_;  // Accessed from generated code.
-  CodePtr type_test_stub_;  // Must be the last field, since subclasses use it
-                            // in their VISIT_FROM.
+  POINTER_FIELD(
+      CodePtr,
+      type_test_stub)  // Must be the last field, since subclasses use it
+                       // in their VISIT_FROM.
 
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType);
@@ -2193,14 +2288,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
 
-  VISIT_FROM(ObjectPtr, type_test_stub_)
-  SmiPtr type_class_id_;
-  TypeArgumentsPtr arguments_;
-  SmiPtr hash_;
+  VISIT_FROM(ObjectPtr, type_test_stub)
+  POINTER_FIELD(SmiPtr, type_class_id)
+  POINTER_FIELD(TypeArgumentsPtr, arguments)
+  POINTER_FIELD(SmiPtr, hash)
   // This type object represents a function type if its signature field is a
   // non-null function object.
-  FunctionPtr signature_;  // If not null, this type is a function type.
-  VISIT_TO(ObjectPtr, signature_)
+  POINTER_FIELD(FunctionPtr,
+                signature)  // If not null, this type is a function type.
+  VISIT_TO(ObjectPtr, signature)
   TokenPosition token_pos_;
   int8_t type_state_;
   int8_t nullability_;
@@ -2215,9 +2311,9 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
 
-  VISIT_FROM(ObjectPtr, type_test_stub_)
-  AbstractTypePtr type_;  // The referenced type.
-  VISIT_TO(ObjectPtr, type_)
+  VISIT_FROM(ObjectPtr, type_test_stub)
+  POINTER_FIELD(AbstractTypePtr, type)  // The referenced type.
+  VISIT_TO(ObjectPtr, type)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
@@ -2225,17 +2321,18 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
-  VISIT_FROM(ObjectPtr, type_test_stub_)
-  StringPtr name_;
-  SmiPtr hash_;
-  AbstractTypePtr bound_;  // ObjectType if no explicit bound specified.
+  VISIT_FROM(ObjectPtr, type_test_stub)
+  POINTER_FIELD(StringPtr, name)
+  POINTER_FIELD(SmiPtr, hash)
+  POINTER_FIELD(AbstractTypePtr,
+                bound)  // ObjectType if no explicit bound specified.
   // The instantiation to bounds of this parameter as calculated by the CFE.
   //
   // TODO(dartbug.com/43901): Once a separate TypeParameters class has been
   // added, move these there and remove them from TypeParameter objects.
-  AbstractTypePtr default_argument_;
-  FunctionPtr parameterized_function_;
-  VISIT_TO(ObjectPtr, parameterized_function_)
+  POINTER_FIELD(AbstractTypePtr, default_argument)
+  POINTER_FIELD(FunctionPtr, parameterized_function)
+  VISIT_TO(ObjectPtr, parameterized_function)
   ClassIdTagType parameterized_class_id_;
   TokenPosition token_pos_;
   int16_t index_;
@@ -2265,15 +2362,15 @@
 
   // The following fields are also declared in the Dart source of class
   // _Closure.
-  VISIT_FROM(RawCompressed, instantiator_type_arguments_)
-  TypeArgumentsPtr instantiator_type_arguments_;
-  TypeArgumentsPtr function_type_arguments_;
-  TypeArgumentsPtr delayed_type_arguments_;
-  FunctionPtr function_;
-  ContextPtr context_;
-  SmiPtr hash_;
+  VISIT_FROM(RawCompressed, instantiator_type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, instantiator_type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, function_type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, delayed_type_arguments)
+  POINTER_FIELD(FunctionPtr, function)
+  POINTER_FIELD(ContextPtr, context)
+  POINTER_FIELD(SmiPtr, hash)
 
-  VISIT_TO(RawCompressed, hash_)
+  VISIT_TO(RawCompressed, hash)
 
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
@@ -2342,13 +2439,13 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(String);
 
  protected:
-  VISIT_FROM(ObjectPtr, length_)
-  SmiPtr length_;
+  VISIT_FROM(ObjectPtr, length)
+  SMI_FIELD(SmiPtr, length)
 #if !defined(HASH_IN_OBJECT_HEADER)
-  SmiPtr hash_;
-  VISIT_TO(ObjectPtr, hash_)
+  SMI_FIELD(SmiPtr, hash)
+  VISIT_TO(ObjectPtr, hash)
 #else
-  VISIT_TO(ObjectPtr, length_)
+  VISIT_TO(ObjectPtr, length)
 #endif
 
  private:
@@ -2417,7 +2514,7 @@
  protected:
   // The length of the view in element sizes (obtainable via
   // [TypedDataBase::ElementSizeInBytes]).
-  SmiPtr length_;
+  SMI_FIELD(SmiPtr, length);
 
  private:
   friend class TypedDataViewLayout;
@@ -2436,7 +2533,7 @@
   void RecomputeDataField() { data_ = internal_data(); }
 
  protected:
-  VISIT_FROM(RawCompressed, length_)
+  VISIT_FROM(RawCompressed, length)
   VISIT_TO_LENGTH(RawCompressed, &length_)
 
   // Variable length data follows here.
@@ -2472,7 +2569,7 @@
   // Recompute [data_] based on internal/external [typed_data_].
   void RecomputeDataField() {
     const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
-    uint8_t* payload = typed_data_->ptr()->data_;
+    uint8_t* payload = typed_data()->ptr()->data_;
     data_ = payload + offset_in_bytes;
   }
 
@@ -2485,12 +2582,12 @@
   void RecomputeDataFieldForInternalTypedData() {
     const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
     uint8_t* payload = reinterpret_cast<uint8_t*>(
-        ObjectLayout::ToAddr(typed_data_) + TypedDataLayout::payload_offset());
+        ObjectLayout::ToAddr(typed_data()) + TypedDataLayout::payload_offset());
     data_ = payload + offset_in_bytes;
   }
 
   void ValidateInnerPointer() {
-    if (typed_data_->ptr()->GetClassId() == kNullCid) {
+    if (typed_data()->ptr()->GetClassId() == kNullCid) {
       // The view object must have gotten just initialized.
       if (data_ != nullptr || RawSmiValue(offset_in_bytes_) != 0 ||
           RawSmiValue(length_) != 0) {
@@ -2498,7 +2595,7 @@
       }
     } else {
       const intptr_t offset_in_bytes = RawSmiValue(offset_in_bytes_);
-      uint8_t* payload = typed_data_->ptr()->data_;
+      uint8_t* payload = typed_data()->ptr()->data_;
       if ((payload + offset_in_bytes) != data_) {
         FATAL("RawTypedDataView has invalid inner pointer.");
       }
@@ -2506,10 +2603,10 @@
   }
 
  protected:
-  VISIT_FROM(ObjectPtr, length_)
-  TypedDataBasePtr typed_data_;
-  SmiPtr offset_in_bytes_;
-  VISIT_TO(ObjectPtr, offset_in_bytes_)
+  VISIT_FROM(ObjectPtr, length)
+  POINTER_FIELD(TypedDataBasePtr, typed_data)
+  SMI_FIELD(SmiPtr, offset_in_bytes)
+  VISIT_TO(ObjectPtr, offset_in_bytes)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Api;
@@ -2553,12 +2650,11 @@
 class ArrayLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
 
-  VISIT_FROM(RawCompressed, type_arguments_)
-  TypeArgumentsPtr type_arguments_;
-  SmiPtr length_;
+  VISIT_FROM(RawCompressed, type_arguments)
+  ARRAY_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  SMI_FIELD(SmiPtr, length)
   // Variable length data follows here.
-  ObjectPtr* data() { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
-  ObjectPtr const* data() const { OPEN_ARRAY_START(ObjectPtr, ObjectPtr); }
+  VARIABLE_POINTER_FIELDS(ObjectPtr, element, data)
   VISIT_TO_LENGTH(RawCompressed, &data()[length - 1])
 
   friend class LinkedHashMapSerializationCluster;
@@ -2589,11 +2685,11 @@
 class GrowableObjectArrayLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray);
 
-  VISIT_FROM(RawCompressed, type_arguments_)
-  TypeArgumentsPtr type_arguments_;
-  SmiPtr length_;
-  ArrayPtr data_;
-  VISIT_TO(RawCompressed, data_)
+  VISIT_FROM(RawCompressed, type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  SMI_FIELD(SmiPtr, length)
+  POINTER_FIELD(ArrayPtr, data)
+  VISIT_TO(RawCompressed, data)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class SnapshotReader;
@@ -2603,14 +2699,14 @@
 class LinkedHashMapLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap);
 
-  VISIT_FROM(RawCompressed, type_arguments_)
-  TypeArgumentsPtr type_arguments_;
-  TypedDataPtr index_;
-  SmiPtr hash_mask_;
-  ArrayPtr data_;
-  SmiPtr used_data_;
-  SmiPtr deleted_keys_;
-  VISIT_TO(RawCompressed, deleted_keys_)
+  VISIT_FROM(RawCompressed, type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  POINTER_FIELD(TypedDataPtr, index)
+  POINTER_FIELD(SmiPtr, hash_mask)
+  POINTER_FIELD(ArrayPtr, data)
+  POINTER_FIELD(SmiPtr, used_data)
+  POINTER_FIELD(SmiPtr, deleted_keys)
+  VISIT_TO(RawCompressed, deleted_keys)
 
   friend class SnapshotReader;
 };
@@ -2678,16 +2774,16 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData);
 
  protected:
-  VISIT_FROM(RawCompressed, length_)
-  VISIT_TO(RawCompressed, length_)
+  VISIT_FROM(RawCompressed, length)
+  VISIT_TO(RawCompressed, length)
 };
 
 class PointerLayout : public PointerBaseLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
 
-  VISIT_FROM(RawCompressed, type_arguments_)
-  TypeArgumentsPtr type_arguments_;
-  VISIT_TO(RawCompressed, type_arguments_)
+  VISIT_FROM(RawCompressed, type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_TO(RawCompressed, type_arguments)
 
   friend class Pointer;
 };
@@ -2719,15 +2815,15 @@
 class ReceivePortLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort);
 
-  VISIT_FROM(ObjectPtr, send_port_)
-  SendPortPtr send_port_;
-  InstancePtr handler_;
+  VISIT_FROM(ObjectPtr, send_port)
+  POINTER_FIELD(SendPortPtr, send_port)
+  POINTER_FIELD(InstancePtr, handler)
 #if !defined(PRODUCT)
-  StringPtr debug_name_;
-  StackTracePtr allocation_location_;
-  VISIT_TO(ObjectPtr, allocation_location_)
+  POINTER_FIELD(StringPtr, debug_name)
+  POINTER_FIELD(StackTracePtr, allocation_location)
+  VISIT_TO(ObjectPtr, allocation_location)
 #else
-  VISIT_TO(ObjectPtr, handler_);
+  VISIT_TO(ObjectPtr, handler)
 #endif  // !defined(PRODUCT)
 };
 
@@ -2743,11 +2839,13 @@
 class StackTraceLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(StackTrace);
 
-  VISIT_FROM(ObjectPtr, async_link_)
-  StackTracePtr async_link_;  // Link to parent async stack trace.
-  ArrayPtr code_array_;       // Code object for each frame in the stack trace.
-  ArrayPtr pc_offset_array_;  // Offset of PC for each frame.
-  VISIT_TO(ObjectPtr, pc_offset_array_)
+  VISIT_FROM(ObjectPtr, async_link)
+  POINTER_FIELD(StackTracePtr,
+                async_link);  // Link to parent async stack trace.
+  POINTER_FIELD(ArrayPtr,
+                code_array);  // Code object for each frame in the stack trace.
+  POINTER_FIELD(ArrayPtr, pc_offset_array);  // Offset of PC for each frame.
+  VISIT_TO(ObjectPtr, pc_offset_array)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // False for pre-allocated stack trace (used in OOM and Stack overflow).
@@ -2762,31 +2860,19 @@
 class RegExpLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(RegExp);
 
-  VISIT_FROM(ObjectPtr, num_bracket_expressions_)
-  SmiPtr num_bracket_expressions_;
-  ArrayPtr capture_name_map_;
-  StringPtr pattern_;  // Pattern to be used for matching.
-  union {
-    FunctionPtr function_;
-    TypedDataPtr bytecode_;
-  } one_byte_;
-  union {
-    FunctionPtr function_;
-    TypedDataPtr bytecode_;
-  } two_byte_;
-  FunctionPtr external_one_byte_function_;
-  FunctionPtr external_two_byte_function_;
-  union {
-    FunctionPtr function_;
-    TypedDataPtr bytecode_;
-  } one_byte_sticky_;
-  union {
-    FunctionPtr function_;
-    TypedDataPtr bytecode_;
-  } two_byte_sticky_;
-  FunctionPtr external_one_byte_sticky_function_;
-  FunctionPtr external_two_byte_sticky_function_;
-  VISIT_TO(ObjectPtr, external_two_byte_sticky_function_)
+  VISIT_FROM(ObjectPtr, num_bracket_expressions)
+  POINTER_FIELD(SmiPtr, num_bracket_expressions)
+  POINTER_FIELD(ArrayPtr, capture_name_map)
+  POINTER_FIELD(StringPtr, pattern)   // Pattern to be used for matching.
+  POINTER_FIELD(ObjectPtr, one_byte)  // FunctionPtr or TypedDataPtr
+  POINTER_FIELD(ObjectPtr, two_byte)
+  POINTER_FIELD(ObjectPtr, external_one_byte)
+  POINTER_FIELD(ObjectPtr, external_two_byte)
+  POINTER_FIELD(ObjectPtr, one_byte_sticky)
+  POINTER_FIELD(ObjectPtr, two_byte_sticky)
+  POINTER_FIELD(ObjectPtr, external_one_byte_sticky)
+  POINTER_FIELD(ObjectPtr, external_two_byte_sticky)
+  VISIT_TO(ObjectPtr, external_two_byte_sticky)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // The same pattern may use different amount of registers if compiled
@@ -2806,10 +2892,10 @@
 class WeakPropertyLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
-  VISIT_FROM(ObjectPtr, key_)
-  ObjectPtr key_;
-  ObjectPtr value_;
-  VISIT_TO(ObjectPtr, value_)
+  VISIT_FROM(ObjectPtr, key)
+  POINTER_FIELD(ObjectPtr, key)
+  POINTER_FIELD(ObjectPtr, value)
+  VISIT_TO(ObjectPtr, value)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Linked list is chaining all pending weak properties.
@@ -2829,18 +2915,18 @@
 class MirrorReferenceLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference);
 
-  VISIT_FROM(ObjectPtr, referent_)
-  ObjectPtr referent_;
-  VISIT_TO(ObjectPtr, referent_)
+  VISIT_FROM(ObjectPtr, referent)
+  POINTER_FIELD(ObjectPtr, referent)
+  VISIT_TO(ObjectPtr, referent)
 };
 
 // UserTag are used by the profiler to track Dart script state.
 class UserTagLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
 
-  VISIT_FROM(ObjectPtr, label_)
-  StringPtr label_;
-  VISIT_TO(ObjectPtr, label_)
+  VISIT_FROM(ObjectPtr, label)
+  POINTER_FIELD(StringPtr, label)
+  VISIT_TO(ObjectPtr, label)
 
   // Isolate unique tag.
   uword tag_;
@@ -2855,9 +2941,9 @@
 class FutureOrLayout : public InstanceLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(FutureOr);
 
-  VISIT_FROM(RawCompressed, type_arguments_)
-  TypeArgumentsPtr type_arguments_;
-  VISIT_TO(RawCompressed, type_arguments_)
+  VISIT_FROM(RawCompressed, type_arguments)
+  POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_TO(RawCompressed, type_arguments)
 
   friend class SnapshotReader;
 };
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 94d167c..cf5625b 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -173,10 +173,14 @@
   F(RegExp, num_bracket_expressions_)                                          \
   F(RegExp, capture_name_map_)                                                 \
   F(RegExp, pattern_)                                                          \
-  F(RegExp, external_one_byte_function_)                                       \
-  F(RegExp, external_two_byte_function_)                                       \
-  F(RegExp, external_one_byte_sticky_function_)                                \
-  F(RegExp, external_two_byte_sticky_function_)                                \
+  F(RegExp, one_byte_)                                                         \
+  F(RegExp, two_byte_)                                                         \
+  F(RegExp, external_one_byte_)                                                \
+  F(RegExp, external_two_byte_)                                                \
+  F(RegExp, one_byte_sticky_)                                                  \
+  F(RegExp, two_byte_sticky_)                                                  \
+  F(RegExp, external_one_byte_sticky_)                                         \
+  F(RegExp, external_two_byte_sticky_)                                         \
   F(WeakProperty, key_)                                                        \
   F(WeakProperty, value_)                                                      \
   F(MirrorReference, referent_)                                                \
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 674307f..853c1cac 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -61,7 +61,7 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   if (writer->can_send_any_object() ||
-      writer->AllowObjectsInDartLibrary(library_)) {
+      writer->AllowObjectsInDartLibrary(library())) {
     writer->WriteClassId(this);
   } else {
     // We do not allow regular dart instances in isolate messages.
@@ -122,7 +122,7 @@
                          bool as_reference) {
   ASSERT(writer != NULL);
 
-  if (signature_ != Function::null()) {
+  if (signature() != Function::null()) {
     writer->SetWriteException(Exceptions::kArgument,
                               "Illegal argument in isolate message"
                               " : (function types are not supported yet)");
@@ -132,7 +132,7 @@
   // Only resolved and finalized types should be written to a snapshot.
   ASSERT((type_state_ == TypeLayout::kFinalizedInstantiated) ||
          (type_state_ == TypeLayout::kFinalizedUninstantiated));
-  ASSERT(type_class_id_ != Object::null());
+  ASSERT(type_class_id() != Object::null());
 
   // Write out the serialization header value for this object.
   writer->WriteInlinedObjectHeader(object_id);
@@ -141,13 +141,13 @@
   writer->WriteIndexedObject(kTypeCid);
   writer->WriteTags(writer->GetObjectTags(this));
 
-  if (type_class_id_->IsHeapObject()) {
+  if (type_class_id()->IsHeapObject()) {
     // Type class is still an unresolved class.
     UNREACHABLE();
   }
 
   // Lookup the type class.
-  SmiPtr raw_type_class_id = Smi::RawCast(type_class_id_);
+  SmiPtr raw_type_class_id = Smi::RawCast(type_class_id());
   ClassPtr type_class =
       writer->isolate()->class_table()->At(Smi::Value(raw_type_class_id));
 
@@ -167,7 +167,7 @@
   writer->Write<uint8_t>(combined);
 
   // Write out all the object pointer fields.
-  ASSERT(type_class_id_ != Object::null());
+  ASSERT(type_class_id() != Object::null());
   SnapshotWriterVisitor visitor(writer, as_reference);
   visitor.VisitPointers(from(), to());
 
@@ -297,13 +297,13 @@
   visitor.VisitPointers(from(), to());
 
   if (parameterized_class_id_ != kFunctionCid) {
-    ASSERT(parameterized_function_ == Function::null());
+    ASSERT(parameterized_function() == Function::null());
     // Write out the parameterized class.
     ClassPtr param_class =
         writer->isolate()->class_table()->At(parameterized_class_id_);
     writer->WriteObjectImpl(param_class, kAsReference);
   } else {
-    ASSERT(parameterized_function_ != Function::null());
+    ASSERT(parameterized_function() != Function::null());
   }
 }
 
@@ -353,10 +353,10 @@
   writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field.
-  writer->Write<ObjectPtr>(length_);
+  writer->Write<ObjectPtr>(length());
 
   // Write out the individual types.
-  intptr_t len = Smi::Value(length_);
+  intptr_t len = Smi::Value(length());
   for (intptr_t i = 0; i < len; i++) {
     // The Dart VM reuses type argument lists across instances in order
     // to reduce memory footprint, this can sometimes lead to a type from
@@ -366,10 +366,10 @@
     if (!writer->can_send_any_object()) {
       // Lookup the type class.
       TypePtr raw_type = Type::RawCast(types()[i]);
-      SmiPtr raw_type_class_id = Smi::RawCast(raw_type->ptr()->type_class_id_);
+      SmiPtr raw_type_class_id = Smi::RawCast(raw_type->ptr()->type_class_id());
       ClassPtr type_class =
           writer->isolate()->class_table()->At(Smi::Value(raw_type_class_id));
-      if (!writer->AllowObjectsInDartLibrary(type_class->ptr()->library_)) {
+      if (!writer->AllowObjectsInDartLibrary(type_class->ptr()->library())) {
         writer->WriteVMIsolateObject(kDynamicType);
       } else {
         writer->WriteObjectImpl(types()[i], as_reference);
@@ -400,7 +400,7 @@
   FunctionPtr func = writer->IsSerializableClosure(ClosurePtr(this));
   if (func != Function::null()) {
     writer->WriteStaticImplicitClosure(
-        object_id, func, writer->GetObjectTags(this), delayed_type_arguments_);
+        object_id, func, writer->GetObjectTags(this), delayed_type_arguments());
     return;
   }
 
@@ -933,7 +933,7 @@
                                   Snapshot::Kind kind,
                                   bool as_reference) {
   StringWriteTo(writer, object_id, kind, kOneByteStringCid,
-                writer->GetObjectTags(this), length_, data());
+                writer->GetObjectTags(this), length(), data());
 }
 
 void TwoByteStringLayout::WriteTo(SnapshotWriter* writer,
@@ -941,7 +941,7 @@
                                   Snapshot::Kind kind,
                                   bool as_reference) {
   StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
-                writer->GetObjectTags(this), length_, data());
+                writer->GetObjectTags(this), length(), data());
 }
 
 ExternalOneByteStringPtr ExternalOneByteString::ReadFrom(SnapshotReader* reader,
@@ -968,7 +968,7 @@
                                           bool as_reference) {
   // Serialize as a non-external one byte string.
   StringWriteTo(writer, object_id, kind, kOneByteStringCid,
-                writer->GetObjectTags(this), length_, external_data_);
+                writer->GetObjectTags(this), length(), external_data_);
 }
 
 void ExternalTwoByteStringLayout::WriteTo(SnapshotWriter* writer,
@@ -977,7 +977,7 @@
                                           bool as_reference) {
   // Serialize as a non-external two byte string.
   StringWriteTo(writer, object_id, kind, kTwoByteStringCid,
-                writer->GetObjectTags(this), length_, external_data_);
+                writer->GetObjectTags(this), length(), external_data_);
 }
 
 ArrayPtr Array::ReadFrom(SnapshotReader* reader,
@@ -1046,7 +1046,7 @@
                           bool as_reference) {
   ASSERT(!this->IsCanonical());
   writer->ArrayWriteTo(object_id, kArrayCid, writer->GetObjectTags(this),
-                       length_, type_arguments_, data(), as_reference);
+                       length(), type_arguments(), data(), as_reference);
 }
 
 void ImmutableArrayLayout::WriteTo(SnapshotWriter* writer,
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index b05b00d..baf79d3 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1455,6 +1455,8 @@
   arguments.SetReturn(target);
 }
 
+#if defined(DART_PRECOMPILED_RUNTIME)
+
 static bool IsSingleTarget(Isolate* isolate,
                            Zone* zone,
                            intptr_t lower_cid,
@@ -1478,7 +1480,6 @@
   return true;
 }
 
-#if defined(DART_PRECOMPILED_RUNTIME)
 
 class SavedUnlinkedCallMapKeyEqualsTraits : public AllStatic {
  public:
@@ -1553,14 +1554,30 @@
 
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-class SwitchableCallHandler {
+// We use two different instance calls in JIT vs AOT but both are patchable. A
+// subset of the patching cases are handled by [PatchableCallHandler].
+//
+//   - JIT calls must be patched with CodePatcher::PatchInstanceCallAt()
+//   - AOT calls must be patched with CodePatcher::PatchSwitchableCallAt()
+//
+// In the JIT it is possible that a call site will use two different miss
+// handlers:
+//
+//   - InlineCacheMissHandlerOneArg (which patches callsite to be monomorphic)
+//   - SwitchableCallMiss (which patches callsite to be polymorphic)
+//   - InlineCacheMissHandlerOneArg (which patches it to be megamorphic)
+//   - SwitchableCallMiss (which updates megamorphic cache)
+//
+// Once we share JITed code across isolates there are more possible sequences
+// which we need to consider.
+class PatchableCallHandler {
  public:
-  SwitchableCallHandler(Thread* thread,
-                        const Instance& receiver,
-                        NativeArguments arguments,
-                        StackFrame* caller_frame,
-                        const Code& caller_code,
-                        const Function& caller_function)
+  PatchableCallHandler(Thread* thread,
+                       const Instance& receiver,
+                       NativeArguments arguments,
+                       StackFrame* caller_frame,
+                       const Code& caller_code,
+                       const Function& caller_function)
       : isolate_(thread->isolate()),
         thread_(thread),
         zone_(thread->zone()),
@@ -1578,19 +1595,23 @@
                   const Function& target_function);
 
  private:
-  void DoUnlinkedCall(const UnlinkedCall& unlinked,
-                      const Function& target_function);
+#if defined(DART_PRECOMPILED_RUNTIME)
+  void DoUnlinkedCallAOT(const UnlinkedCall& unlinked,
+                         const Function& target_function);
+  void DoMonomorphicMissAOT(const Object& data,
+                            const Function& target_function);
+  void DoSingleTargetMissAOT(const SingleTargetCache& data,
+                             const Function& target_function);
+  void DoICDataMissAOT(const ICData& data, const Function& target_function);
   bool CanExtendSingleTargetRange(const String& name,
                                   const Function& old_target,
                                   const Function& target_function,
                                   intptr_t* lower,
                                   intptr_t* upper);
-  void DoMonomorphicMiss(const Object& data, const Function& target_function);
-#if defined(DART_PRECOMPILED_RUNTIME)
-  void DoSingleTargetMiss(const SingleTargetCache& data,
-                          const Function& target_function);
+#else
+  void DoMonomorphicMissJIT(const Object& data,
+                            const Function& target_function);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  void DoICDataMiss(const ICData& data, const Function& target_function);
   void DoMegamorphicMiss(const MegamorphicCache& data,
                          const Function& target_function);
 
@@ -1612,8 +1633,9 @@
   bool is_monomorphic_hit_ = false;
 };
 
-void SwitchableCallHandler::DoUnlinkedCall(const UnlinkedCall& unlinked,
-                                           const Function& target_function) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+void PatchableCallHandler::DoUnlinkedCallAOT(const UnlinkedCall& unlinked,
+                                             const Function& target_function) {
   const auto& ic_data = ICData::Handle(
       zone_,
       target_function.IsNull()
@@ -1657,7 +1679,7 @@
   arguments_.SetReturn(ic_data);
 }
 
-bool SwitchableCallHandler::CanExtendSingleTargetRange(
+bool PatchableCallHandler::CanExtendSingleTargetRange(
     const String& name,
     const Function& old_target,
     const Function& target_function,
@@ -1680,6 +1702,7 @@
   return IsSingleTarget(isolate_, zone_, unchecked_lower, unchecked_upper,
                         target_function, name);
 }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 static ICDataPtr FindICDataForInstanceCall(Zone* zone,
@@ -1725,9 +1748,10 @@
   return target_function.raw();
 }
 
-void SwitchableCallHandler::DoMonomorphicMiss(const Object& data,
-                                              const Function& target_function) {
 #if defined(DART_PRECOMPILED_RUNTIME)
+void PatchableCallHandler::DoMonomorphicMissAOT(
+    const Object& data,
+    const Function& target_function) {
   classid_t old_expected_cid;
   if (data.IsSmi()) {
     old_expected_cid = Smi::Cast(data).Value();
@@ -1785,8 +1809,13 @@
   // stub.
   arguments_.SetArgAt(0, stub);
   arguments_.SetReturn(ic_data);
-#else   // JIT
+}
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+void PatchableCallHandler::DoMonomorphicMissJIT(
+    const Object& data,
+    const Function& target_function) {
   const ICData& ic_data = ICData::Handle(
       zone_,
       FindICDataForInstanceCall(zone_, caller_code_, caller_frame_->pc()));
@@ -1813,11 +1842,11 @@
 
   arguments_.SetArgAt(0, stub);
   arguments_.SetReturn(ic_data);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-void SwitchableCallHandler::DoSingleTargetMiss(
+void PatchableCallHandler::DoSingleTargetMissAOT(
     const SingleTargetCache& data,
     const Function& target_function) {
   const Code& old_target_code = Code::Handle(zone_, data.target());
@@ -1854,10 +1883,11 @@
   arguments_.SetArgAt(0, stub);
   arguments_.SetReturn(ic_data);
 }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-void SwitchableCallHandler::DoICDataMiss(const ICData& ic_data,
-                                         const Function& target_function) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+void PatchableCallHandler::DoICDataMissAOT(const ICData& ic_data,
+                                           const Function& target_function) {
   const String& name = String::Handle(zone_, ic_data.target_name());
   const Class& cls = Class::Handle(zone_, receiver_.clazz());
   ASSERT(!cls.IsNull());
@@ -1896,7 +1926,6 @@
     arguments_.SetArgAt(0, target_code);
     arguments_.SetReturn(expected_cid);
   } else {
-    // IC entry might have been added while we waited to get into runtime.
     ic_data.EnsureHasReceiverCheck(receiver_.GetClassId(), target_function);
     if (number_of_checks > FLAG_max_polymorphic_checks) {
       // Switch to megamorphic call.
@@ -1914,9 +1943,10 @@
     }
   }
 }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-void SwitchableCallHandler::DoMegamorphicMiss(const MegamorphicCache& data,
-                                              const Function& target_function) {
+void PatchableCallHandler::DoMegamorphicMiss(const MegamorphicCache& data,
+                                             const Function& target_function) {
   const String& name = String::Handle(zone_, data.target_name());
   const Class& cls = Class::Handle(zone_, receiver_.clazz());
   ASSERT(!cls.IsNull());
@@ -1940,13 +1970,13 @@
   arguments_.SetReturn(data);
 }
 
-ICDataPtr SwitchableCallHandler::NewICData() {
+ICDataPtr PatchableCallHandler::NewICData() {
   return ICData::New(caller_function_, name_, args_descriptor_, DeoptId::kNone,
                      /*num_args_tested=*/1, ICData::kInstance);
 }
 
-ICDataPtr SwitchableCallHandler::NewICDataWithTarget(intptr_t cid,
-                                                     const Function& target) {
+ICDataPtr PatchableCallHandler::NewICDataWithTarget(intptr_t cid,
+                                                    const Function& target) {
   GrowableArray<intptr_t> cids(1);
   cids.Add(cid);
   return ICData::NewWithCheck(caller_function_, name_, args_descriptor_,
@@ -1954,7 +1984,7 @@
                               ICData::kInstance, &cids, target);
 }
 
-FunctionPtr SwitchableCallHandler::ResolveTargetFunction(const Object& data) {
+FunctionPtr PatchableCallHandler::ResolveTargetFunction(const Object& data) {
   switch (data.GetClassId()) {
     case kUnlinkedCallCid: {
       const auto& unlinked_call = UnlinkedCall::Cast(data);
@@ -2019,36 +2049,41 @@
   return Resolve(thread_, zone_, cls, name_, args_descriptor_);
 }
 
-void SwitchableCallHandler::HandleMiss(const Object& old_data,
-                                       const Code& old_code,
-                                       const Function& target_function) {
+void PatchableCallHandler::HandleMiss(const Object& old_data,
+                                      const Code& old_code,
+                                      const Function& target_function) {
   switch (old_data.GetClassId()) {
+#if defined(DART_PRECOMPILED_RUNTIME)
     case kUnlinkedCallCid:
       ASSERT(old_code.raw() == StubCode::SwitchableCallMiss().raw());
-      DoUnlinkedCall(UnlinkedCall::Cast(old_data), target_function);
+      DoUnlinkedCallAOT(UnlinkedCall::Cast(old_data), target_function);
       break;
     case kMonomorphicSmiableCallCid:
       ASSERT(old_code.raw() == StubCode::MonomorphicSmiableCheck().raw());
       FALL_THROUGH;
-#if defined(DART_PRECOMPILED_RUNTIME)
     case kSmiCid:
-      DoMonomorphicMiss(old_data, target_function);
+      DoMonomorphicMissAOT(old_data, target_function);
       break;
     case kSingleTargetCacheCid:
       ASSERT(old_code.raw() == StubCode::SingleTargetCall().raw());
-      DoSingleTargetMiss(SingleTargetCache::Cast(old_data), target_function);
+      DoSingleTargetMissAOT(SingleTargetCache::Cast(old_data), target_function);
+      break;
+    case kICDataCid:
+      ASSERT(old_code.raw() == StubCode::ICCallThroughCode().raw());
+      DoICDataMissAOT(ICData::Cast(old_data), target_function);
       break;
 #else
     case kArrayCid:
       // ICData three-element array: Smi(receiver CID), Smi(count),
       // Function(target). It is the Array from ICData::entries_.
-      DoMonomorphicMiss(old_data, target_function);
+      DoMonomorphicMissJIT(old_data, target_function);
       break;
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
     case kICDataCid:
-      ASSERT(old_code.raw() == StubCode::ICCallThroughCode().raw());
-      DoICDataMiss(ICData::Cast(old_data), target_function);
+      // Right now ICData misses wil go to the normal ICData miss handler, not
+      // to SwitchableCall miss handler.
+      UNREACHABLE();
       break;
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
     case kMegamorphicCacheCid:
       ASSERT(old_code.raw() == StubCode::MegamorphicCall().raw());
       DoMegamorphicMiss(MegamorphicCache::Cast(old_data), target_function);
@@ -2081,8 +2116,8 @@
   const Function& caller_function =
       Function::Handle(zone, caller_frame->LookupDartFunction());
 
-  SwitchableCallHandler handler(thread, receiver, arguments, caller_frame,
-                                caller_code, caller_function);
+  PatchableCallHandler handler(thread, receiver, arguments, caller_frame,
+                               caller_code, caller_function);
 
   // Find out actual target (which can be time consuminmg) without holding any
   // locks.
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 0a6c2b8..6655cbe 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1323,10 +1323,10 @@
   ASSERT(!IsSingletonClassId(class_id) && !IsBootstrapedClassId(class_id));
 
   // Write out the library url and class name.
-  LibraryPtr library = cls->library_;
+  LibraryPtr library = cls->library();
   ASSERT(library != Library::null());
   WriteObjectImpl(library->ptr()->url_, kAsInlinedObject);
-  WriteObjectImpl(cls->name_, kAsInlinedObject);
+  WriteObjectImpl(cls->name(), kAsInlinedObject);
 }
 
 void SnapshotWriter::WriteStaticImplicitClosure(
@@ -1346,11 +1346,11 @@
   // Write out the library url, class name and signature function name.
   ClassPtr cls = GetFunctionOwner(func);
   ASSERT(cls != Class::null());
-  LibraryPtr library = cls->ptr()->library_;
+  LibraryPtr library = cls->ptr()->library();
   ASSERT(library != Library::null());
-  WriteObjectImpl(library->ptr()->url_, kAsInlinedObject);
-  WriteObjectImpl(cls->ptr()->name_, kAsInlinedObject);
-  WriteObjectImpl(func->ptr()->name_, kAsInlinedObject);
+  WriteObjectImpl(library->ptr()->url(), kAsInlinedObject);
+  WriteObjectImpl(cls->ptr()->name(), kAsInlinedObject);
+  WriteObjectImpl(func->ptr()->name(), kAsInlinedObject);
   WriteObjectImpl(delayed_type_arguments, kAsInlinedObject);
 }
 
@@ -1398,7 +1398,7 @@
 FunctionPtr SnapshotWriter::IsSerializableClosure(ClosurePtr closure) {
   // Extract the function object to check if this closure
   // can be sent in an isolate message.
-  FunctionPtr func = closure->ptr()->function_;
+  FunctionPtr func = closure->ptr()->function();
   // We only allow closure of top level methods or static functions in a
   // class to be sent in isolate messages.
   if (can_send_any_object() &&
@@ -1422,7 +1422,7 @@
 }
 
 ClassPtr SnapshotWriter::GetFunctionOwner(FunctionPtr func) {
-  ObjectPtr owner = func->ptr()->owner_;
+  ObjectPtr owner = func->ptr()->owner();
   uword tags = GetObjectTags(owner);
   intptr_t class_id = ObjectLayout::ClassIdTag::decode(tags);
   if (class_id == kClassCid) {
diff --git a/tools/VERSION b/tools/VERSION
index 04bf624..d8d0e65 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 107
+PRERELEASE 108
 PRERELEASE_PATCH 0
\ No newline at end of file