Version 3.9.0-168.0.dev

Merge e3e82c95cb3782515e5775bd8da170fd6771a723 into dev
diff --git a/DEPS b/DEPS
index be7207e..c7d69b5 100644
--- a/DEPS
+++ b/DEPS
@@ -138,13 +138,13 @@
   "leak_tracker_rev": "f5620600a5ce1c44f65ddaa02001e200b096e14c", # rolled manually
   "material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
   "native_rev": "09a756cb8d89638c1179efc86b51156282f5e856", # rolled manually while native assets are experimental
-  "protobuf_rev": "deda2883eb3c8437a89bdae524b732fffef6150c",
+  "protobuf_rev": "d940c8de905439e292770ccf6c546477ae566462",
   "pub_rev": "59406faad8959e332da98260bab894feb8500908", # rolled manually
   "shelf_rev": "082d3ac2d13a98700d8148e8fad8f3e12a6fd0e1",
   "sync_http_rev": "dc54465f07d9652875deeade643256dafa2fbc6c",
   "tar_rev": "5a1ea943e70cdf3fa5e1102cdbb9418bd9b4b81a",
   "test_rev": "42a6d333d96b4b0964d356b9a29ca47ccdb43691",
-  "tools_rev": "36f5c9f9989e06e79323499914c50e78ab1a6621",
+  "tools_rev": "be0bd20c803377063c45904512f272fdda94e8c3",
   "vector_math_rev": "13f185f7e97d559e003f5ac79201da12f9a01049",
   "web_rev": "f1becf07db9faa56559d2844c3c6d430dc9b37de",
   "webdev_rev": "5dbb30ebc695ad2ecc01fa8eae4e0494c199e1bc",
diff --git a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
index 31d20c1..e090dd1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
@@ -20,9 +20,6 @@
 ///
 /// Generally, messages should follow the [Guide for Writing
 /// Diagnostics](https://github.com/dart-lang/sdk/blob/main/pkg/front_end/lib/src/base/diagnostics.md).
-///
-/// Note that this class name, `ErrorCode`, is soft-deprecated in favor of the
-/// type alias, `DiagnosticCode`.
 @AnalyzerPublicApi(message: 'exported by package:analyzer/error/error.dart')
 abstract class DiagnosticCode {
   /// Regular expression for identifying positional arguments in error messages.
@@ -139,9 +136,6 @@
 
 /**
  * The severity of an [DiagnosticCode].
- *
- * Note that this class name, `ErrorSeverity`, is soft-deprecated in favor of
- * the type alias, [DiagnosticSeverity].
  */
 @AnalyzerPublicApi(message: 'exported by package:analyzer/error/error.dart')
 class DiagnosticSeverity implements Comparable<DiagnosticSeverity> {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
index 2eda980..bb3c14d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
 /// Handles textDocument/colorPresentation.
@@ -232,7 +231,7 @@
   /// `const` should be inserted if the existing expression is constant but
   /// we are not already in a constant context.
   bool _willRequireConstKeyword(int offset, ResolvedUnitResult unit) {
-    var node = NodeLocator2(offset).searchWithin(unit.unit);
+    var node = unit.unit.nodeCovering(offset: offset);
     if (node is! Expression) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index ca1d2e8..b218eed 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -112,7 +112,7 @@
   T Function(
     engine.AnalysisResultWithErrors result,
     engine.Diagnostic diagnostic, [
-    engine.DiagnosticSeverity errorSeverity,
+    engine.DiagnosticSeverity severity,
   ])
   constructor,
 ) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
index e89cb27..d6f1dc8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_helper.dart
@@ -585,13 +585,6 @@
   /// beginning of a statement. The [node] provides context to determine which
   /// keywords to include.
   void addStatementKeywords(AstNode node) {
-    if (node.inAsyncMethodOrFunction) {
-      addKeyword(Keyword.AWAIT);
-    } else if (node.inAsyncStarOrSyncStarMethodOrFunction) {
-      addKeyword(Keyword.AWAIT);
-      addKeyword(Keyword.YIELD);
-      addKeywordAndText(Keyword.YIELD, '*');
-    }
     if (node.inLoop) {
       addKeyword(Keyword.BREAK);
       addKeyword(Keyword.CONTINUE);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
index 666359f..fa97407 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
@@ -30,7 +30,6 @@
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/utilities/extensions/ast.dart';
@@ -785,7 +784,7 @@
       return null;
     }
     var offset = _selectionRange.offset;
-    var node = NodeLocator2(offset, offset).searchWithin(_resolveResult.unit);
+    var node = _resolveResult.unit.nodeCovering(offset: offset);
 
     // Check for the parameter list of a FunctionExpression.
     {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 959466f..c53017b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4544,7 +4544,7 @@
   List<MethodElementImpl2> get methods2 => methods;
 
   @override
-  String? get name3 => firstFragment.name;
+  String? get name3 => firstFragment.name2;
 
   @override
   Element get nonSynthetic2 => isSynthetic ? enclosingElement : this as Element;
diff --git a/pkg/analyzer/lib/src/fine/requirements.dart b/pkg/analyzer/lib/src/fine/requirements.dart
index aa2dffa..df70317 100644
--- a/pkg/analyzer/lib/src/fine/requirements.dart
+++ b/pkg/analyzer/lib/src/fine/requirements.dart
@@ -882,8 +882,10 @@
       return null;
     }
 
-    // SAFETY: we don't export elements without name.
-    var instanceName = element.lookupName!.asLookupName;
+    var instanceName = element.lookupName?.asLookupName;
+    if (instanceName == null) {
+      return null;
+    }
 
     var instancesMap = instances[libraryElement.uri] ??= {};
     var instanceItem =
@@ -916,8 +918,10 @@
       return null;
     }
 
-    // SAFETY: we don't export elements without name.
-    var interfaceName = element.lookupName!.asLookupName;
+    var interfaceName = element.lookupName?.asLookupName;
+    if (interfaceName == null) {
+      return null;
+    }
 
     var interfacesMap = interfaces[libraryElement.uri] ??= {};
     var interfaceItem =
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index e9dce89..ea04184 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -969,6 +969,7 @@
     required LibraryFragmentImpl unit,
   }) {
     var fragment = ClassFragmentImpl(name, 0);
+    fragment.name2 = name;
     ClassElementImpl2(Reference.root(), fragment);
     fragment.typeParameters =
         typeParameters.map((tp) => tp.firstFragment).toList();
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 475388e..85c828d 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -15,7 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DartUriResolverTest);
-    defineReflectiveTests(ErrorSeverityTest);
+    defineReflectiveTests(DiagnosticSeverityTest);
     defineReflectiveTests(ResolveRelativeUriTest);
   });
 }
@@ -74,7 +74,7 @@
 }
 
 @reflectiveTest
-class ErrorSeverityTest {
+class DiagnosticSeverityTest {
   test_max_error_error() async {
     expect(
       DiagnosticSeverity.ERROR.max(DiagnosticSeverity.ERROR),
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index a995ee9..d1b72de 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -155,6 +155,7 @@
     List<MethodElementImpl2> methods = const [],
   }) {
     var fragment = ClassFragmentImpl(name, 0);
+    fragment.name2 = name;
     fragment.isAbstract = isAbstract;
     fragment.isAugmentation = isAugmentation;
     fragment.isSealed = isSealed;
@@ -479,6 +480,7 @@
     List<InterfaceTypeImpl> interfaces = const [],
   }) {
     var fragment = MixinFragmentImpl(name, 0);
+    fragment.name2 = name;
     fragment.isAugmentation = isAugmentation;
     fragment.enclosingElement3 = testLibrary.definingCompilationUnit;
     fragment.typeParameters = typeParameters.map((e) => e.asElement).toList();
@@ -500,6 +502,7 @@
     List<InterfaceTypeImpl> interfaces = const [],
   }) {
     var fragment = MixinFragmentImpl(name, 0);
+    fragment.name2 = name;
     fragment.isAugmentation = isAugmentation;
     fragment.enclosingElement3 = testLibrary.definingCompilationUnit;
     fragment.typeParameters = typeParameters.map((e) => e.asElement).toList();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index e73dfb8..375d854 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -44373,6 +44373,64 @@
     );
   }
 
+  test_req_classElement_noName() async {
+    newFile(testFile.path, r'''
+class {}
+''');
+
+    _ManualRequirements.install((state) {
+      var e = state.singleUnit.libraryElement.classes.single;
+      e.getNamedConstructor2('foo');
+    });
+
+    await _runManualRequirementsRecording(
+      expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+[status] idle
+''',
+    );
+  }
+
+  test_req_extensionElement_noName() async {
+    newFile(testFile.path, r'''
+extension on int {
+  void foo() {}
+}
+''');
+
+    _ManualRequirements.install((state) {
+      var e = state.singleUnit.libraryElement.extensions.single;
+      e.getMethod('foo');
+    });
+
+    await _runManualRequirementsRecording(
+      expectedEvents: r'''
+[status] working
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+  requirements
+    topLevels
+      dart:core
+        int: #M0
+[operation] analyzedLibrary
+  file: /home/test/lib/test.dart
+  requirements
+    topLevels
+      dart:core
+        int: #M0
+[status] idle
+''',
+    );
+  }
+
   test_req_instanceElement_getField() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class A {
@@ -45197,6 +45255,10 @@
 
   _ManualRequirementsUnit(this.unit);
 
+  LibraryElementImpl get libraryElement {
+    return libraryFragment.element;
+  }
+
   LibraryFragmentImpl get libraryFragment {
     return unit.declaredFragment!;
   }
diff --git a/pkg/analyzer/test/src/summary/elements/class_test.dart b/pkg/analyzer/test/src/summary/elements/class_test.dart
index 759b153..065f0db 100644
--- a/pkg/analyzer/test/src/summary/elements/class_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/class_test.dart
@@ -13104,7 +13104,7 @@
               element: <testLibraryFragment>::@class::0::@constructor::new#element
               typeName: null
   classes
-    class 
+    class <null-name>
       reference: <testLibrary>::@class::0
       firstFragment: <testLibraryFragment>::@class::0
       constructors
diff --git a/pkg/analyzer/test/src/summary/elements/enum_test.dart b/pkg/analyzer/test/src/summary/elements/enum_test.dart
index 663d814..9a699e2 100644
--- a/pkg/analyzer/test/src/summary/elements/enum_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/enum_test.dart
@@ -3096,13 +3096,13 @@
                   constructorName: ConstructorName
                     type: NamedType
                       name: <empty> @-1 <synthetic>
-                      element2: <testLibrary>::@enum::0
-                      type: 
-                    element: <testLibraryFragment>::@enum::0::@constructor::new#element
+                      element2: <null>
+                      type: InvalidType
+                    element: <null>
                   argumentList: ArgumentList
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
-                  staticType: 
+                  staticType: InvalidType
               getter2: <testLibraryFragment>::@enum::0::@getter::v
             synthetic values
               reference: <testLibraryFragment>::@enum::0::@field::values
@@ -3114,9 +3114,9 @@
                     SimpleIdentifier
                       token: v @-1
                       element: <testLibraryFragment>::@enum::0::@getter::v#element
-                      staticType: 
+                      staticType: InvalidType
                   rightBracket: ] @0
-                  staticType: List<>
+                  staticType: List<<null>>
               getter2: <testLibraryFragment>::@enum::0::@getter::values
           constructors
             synthetic const new
@@ -3131,21 +3131,21 @@
               reference: <testLibraryFragment>::@enum::0::@getter::values
               element: <testLibraryFragment>::@enum::0::@getter::values#element
   enums
-    enum 
+    enum <null-name>
       reference: <testLibrary>::@enum::0
       firstFragment: <testLibraryFragment>::@enum::0
       supertype: Enum
       fields
         static const enumConstant hasInitializer v
           firstFragment: <testLibraryFragment>::@enum::0::@field::v
-          type: 
+          type: InvalidType
           constantInitializer
             fragment: <testLibraryFragment>::@enum::0::@field::v
             expression: expression_0
           getter: <testLibraryFragment>::@enum::0::@getter::v#element
         synthetic static const values
           firstFragment: <testLibraryFragment>::@enum::0::@field::values
-          type: List<>
+          type: List<<null>>
           constantInitializer
             fragment: <testLibraryFragment>::@enum::0::@field::values
             expression: expression_1
@@ -3156,10 +3156,10 @@
       getters
         synthetic static get v
           firstFragment: <testLibraryFragment>::@enum::0::@getter::v
-          returnType: 
+          returnType: InvalidType
         synthetic static get values
           firstFragment: <testLibraryFragment>::@enum::0::@getter::values
-          returnType: List<>
+          returnType: List<<null>>
 ''');
   }
 
diff --git a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
index defa5d1..56da5ee 100644
--- a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
@@ -1621,7 +1621,7 @@
               reference: <testLibraryFragment>::@extensionType::0::@getter::it
               element: <testLibraryFragment>::@extensionType::0::@getter::it#element
   extensionTypes
-    extension type 
+    extension type <null-name>
       reference: <testLibrary>::@extensionType::0
       firstFragment: <testLibraryFragment>::@extensionType::0
       representation: <testLibraryFragment>::@extensionType::0::@field::it#element
diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
index b4d0f26..5afc33d 100644
--- a/pkg/analyzer/test/src/summary/elements/mixin_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
@@ -1433,7 +1433,7 @@
           reference: <testLibraryFragment>::@mixin::0
           element: <testLibrary>::@mixin::0
   mixins
-    mixin 
+    mixin <null-name>
       reference: <testLibrary>::@mixin::0
       firstFragment: <testLibraryFragment>::@mixin::0
       superclassConstraints
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 473bcb1..35842e2 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -116,7 +116,7 @@
   }
 
   /// Returns the maximal [DiagnosticSeverity] of the recorded diagnostics.
-  DiagnosticSeverity computeMaxErrorSeverity() {
+  DiagnosticSeverity computeMaxSeverity() {
     var status = DiagnosticSeverity.NONE;
     for (var result in errorsResults) {
       for (var error in result.errors) {
@@ -180,7 +180,7 @@
     }
 
     // Compute and return max severity.
-    return computeMaxErrorSeverity();
+    return computeMaxSeverity();
   }
 
   DiagnosticSeverity? _defaultSeverityProcessor(Diagnostic diagnostic) =>
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 1a5b830..2ae71d2 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/services/top_level_declarations.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
@@ -2684,8 +2683,13 @@
 
   _EnclosingElementFinder();
 
-  void find(AstNode? target, int offset) {
-    var node = NodeLocator2(offset).searchWithin(target);
+  void find(CompilationUnit target, int offset) {
+    var node = target.nodeCovering(offset: offset);
+    if (node != null && offset == node.end) {
+      // If the offset is just outside the node, then the element declared by
+      // the node isn't actually enclosing the offset.
+      node = node.parent;
+    }
     while (node != null) {
       if (node is ClassDeclaration) {
         enclosingClass = node.declaredFragment?.element;
diff --git a/pkg/dart2wasm/lib/dynamic_modules.dart b/pkg/dart2wasm/lib/dynamic_modules.dart
index b7001aa..67ab4047 100644
--- a/pkg/dart2wasm/lib/dynamic_modules.dart
+++ b/pkg/dart2wasm/lib/dynamic_modules.dart
@@ -605,7 +605,9 @@
         // These types do not have directly invokable constructors.
         translator.classInfo[member.enclosingClass]!.struct
             .isSubtypeOf(translator.objectInfo.struct)) {
-      passReference(member.reference);
+      if (!member.enclosingClass.isAnonymousMixin) {
+        passReference(member.reference);
+      }
       passReference(member.initializerReference);
       passReference(member.constructorBodyReference);
     }
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml b/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml
new file mode 100644
index 0000000..43360b9
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/dynamic_interface.yaml
@@ -0,0 +1,7 @@
+# Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+callable:
+  - library: 'shared/shared.dart'
+    class: 'Foo'
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/main.dart b/pkg/dynamic_modules/test/data/const_mixin_class/main.dart
new file mode 100644
index 0000000..3910617
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../common/testing.dart' as helper;
+import 'package:expect/expect.dart';
+
+import 'shared/shared.dart' show Foo;
+
+/// A dynamic module is allowed to extend a class in the dynamic interface and
+/// override its members.
+void main() async {
+  final o = (await helper.load('entry1.dart'));
+  Expect.equals(const Foo(), o);
+  helper.done();
+}
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart b/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart
new file mode 100644
index 0000000..ec027e2
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/modules/entry1.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../shared/shared.dart';
+
+@pragma('dyn-module:entry-point')
+Object? dynamicModuleEntrypoint() => const Foo();
diff --git a/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart b/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart
new file mode 100644
index 0000000..c9402b4
--- /dev/null
+++ b/pkg/dynamic_modules/test/data/const_mixin_class/shared/shared.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+mixin Mixin {}
+
+class Foo with Mixin {
+  const Foo();
+}
diff --git a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
index a642122..ad49f6f 100644
--- a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
+++ b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
@@ -16,6 +16,7 @@
 const int headerSize = 8;
 final int compressedWordSize =
     sizeOf<Pointer>() == 8 && !Platform.executable.contains('64C') ? 8 : 4;
+const int wordSize = 8; // analyze_snapshot is not supported on arm32
 
 // Used to ensure we don't have multiple equivalent calls to test.
 final _seenDescriptions = <String>{};
@@ -222,7 +223,8 @@
 
     // We have:
     //   class Base {
-    //     static int baseS = int.parse('1');
+    //     static int baseS0 = int.parse('1');
+    //     static int baseS1 = int.parse('2');
     //     int base0;
     //     double base1;
     //     Object? base2;
@@ -231,10 +233,17 @@
     //   }
     //
     // This static field is never tree shaken.
-    expectField(baseFields[0], name: 'baseS', flags: ['static']);
+    expectField(baseFields[0], name: 'baseS0', flags: ['static']);
+    expectField(baseFields[1], name: 'baseS1', flags: ['static']);
+
+    // Neighboring static fields should always be one word away
+    final int staticFieldOffset0 = baseFields[0]["static_field_offset"];
+    final int staticFieldOffset1 = baseFields[1]["static_field_offset"];
+    Expect.equals(staticFieldOffset1 - staticFieldOffset0, wordSize);
+
     if (isProduct) {
       // Most [Field] objests are tree shaken.
-      Expect.equals(1, baseFields.length);
+      Expect.equals(2, baseFields.length);
 
       int slotOffset = 0;
       slotOffset += expectUnknown8Bytes(
@@ -264,28 +273,28 @@
       );
     } else {
       // We don't tree shake [Field] objects in non-product builds.
-      Expect.equals(6, baseFields.length);
+      Expect.equals(7, baseFields.length);
       expectField(
-        baseFields[1],
+        baseFields[2],
         name: 'base0',
         isReference: false,
         unboxedType: 'int',
       );
       expectField(
-        baseFields[2],
+        baseFields[3],
         name: 'base1',
         isReference: false,
         unboxedType: 'double',
       );
-      expectField(baseFields[3], name: 'base2');
+      expectField(baseFields[4], name: 'base2');
       expectField(
-        baseFields[4],
+        baseFields[5],
         name: 'base3',
         isReference: false,
         unboxedType: 'Float32x4',
       );
       expectField(
-        baseFields[5],
+        baseFields[6],
         name: 'base4',
         isReference: false,
         unboxedType: 'Float64x2',
@@ -296,34 +305,34 @@
         offsetReferences: 0,
         offsetBytes: 0,
         isReference: false,
-        fieldId: baseFieldIds[1],
+        fieldId: baseFieldIds[2],
       );
       slotOffset += expectInstanceSlot(
         baseSlots[slotOffset],
         offsetReferences: 0,
         offsetBytes: 8,
         isReference: false,
-        fieldId: baseFieldIds[2],
+        fieldId: baseFieldIds[3],
       );
       slotOffset += expectInstanceSlot(
         baseSlots[slotOffset],
         offsetReferences: 0,
         offsetBytes: 16,
-        fieldId: baseFieldIds[3],
+        fieldId: baseFieldIds[4],
       );
       slotOffset += expectInstanceSlot(
         baseSlots[slotOffset],
         offsetReferences: 1,
         offsetBytes: 16,
         isReference: false,
-        fieldId: baseFieldIds[4],
+        fieldId: baseFieldIds[5],
       );
       slotOffset += expectInstanceSlot(
         baseSlots[slotOffset],
         offsetReferences: 1,
         offsetBytes: 32,
         isReference: false,
-        fieldId: baseFieldIds[5],
+        fieldId: baseFieldIds[6],
       );
     }
     // We have:
diff --git a/runtime/tests/vm/dart/analyze_snapshot_program.dart b/runtime/tests/vm/dart/analyze_snapshot_program.dart
index d58ed4d..d970325 100644
--- a/runtime/tests/vm/dart/analyze_snapshot_program.dart
+++ b/runtime/tests/vm/dart/analyze_snapshot_program.dart
@@ -40,7 +40,8 @@
 }
 
 class FieldTestBase {
-  static int baseS = int.parse('1');
+  static int baseS0 = int.parse('1');
+  static int baseS1 = int.parse('2');
   int base0;
   double base1;
   Object? base2;
@@ -48,10 +49,12 @@
   Float64x2 base4;
 
   FieldTestBase(this.base0, this.base1, this.base2, this.base3, this.base4) {
-    baseS++;
+    baseS0++;
+    baseS1++;
   }
 
-  String foo() => 'Base.foo: [$baseS, $base0, $base1, $base2, $base3, $base4]';
+  String foo() =>
+      'Base.foo: [$baseS0, $baseS1, $base0, $base1, $base2, $base3, $base4]';
 }
 
 class FieldTestSub<T> extends FieldTestBase {
diff --git a/runtime/vm/analyze_snapshot_api_impl.cc b/runtime/vm/analyze_snapshot_api_impl.cc
index f6f268e..9a60ea8 100644
--- a/runtime/vm/analyze_snapshot_api_impl.cc
+++ b/runtime/vm/analyze_snapshot_api_impl.cc
@@ -293,6 +293,8 @@
   js_.PrintProperty64("type_class", GetObjectId(field.type()));
   if (field.is_static()) {
     js_.PrintProperty("instance", GetObjectId(field.StaticValue()));
+    js_.PrintProperty64("static_field_offset",
+                        FieldTable::FieldOffsetFor(field.field_id()));
   }
   if (field.HasInitializerFunction()) {
     js_.PrintProperty("initializer_function",
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 6a3236d..e276f33 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -109,3 +109,6 @@
 
 [ $sanitizer == asan || $sanitizer == msan || $sanitizer == tsan ]
 data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
+
+[ $hot_reload || $hot_reload_rollback ]
+isolate_group_shared_callback_test: SkipSlow # shared_slow_path_triggers_gc in combination with reload makes this test very slow
\ No newline at end of file
diff --git a/tools/VERSION b/tools/VERSION
index f750e54..ad260f7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 9
 PATCH 0
-PRERELEASE 167
+PRERELEASE 168
 PRERELEASE_PATCH 0