Version 3.5.0-301.0.dev

Merge 3180d9545360cfb176a90d45db48009cf1beb842 into dev
diff --git a/pkg/analyzer/lib/src/summary2/augmentation.dart b/pkg/analyzer/lib/src/summary2/augmentation.dart
index 73ac89a..ece4e71 100644
--- a/pkg/analyzer/lib/src/summary2/augmentation.dart
+++ b/pkg/analyzer/lib/src/summary2/augmentation.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
@@ -238,16 +239,23 @@
     var declaration = augmented.declaration;
     var declarationTypeParameters = declaration.typeParameters;
 
+    MapSubstitution toDeclaration;
     var augmentationTypeParameters = augmentation.typeParameters;
-    if (augmentationTypeParameters.length != declarationTypeParameters.length) {
-      return;
+    if (augmentationTypeParameters.length == declarationTypeParameters.length) {
+      toDeclaration = Substitution.fromPairs(
+        augmentationTypeParameters,
+        declarationTypeParameters.instantiateNone(),
+      );
+    } else {
+      toDeclaration = Substitution.fromPairs(
+        augmentationTypeParameters,
+        List.filled(
+          augmentationTypeParameters.length,
+          InvalidTypeImpl.instance,
+        ),
+      );
     }
 
-    var toDeclaration = Substitution.fromPairs(
-      augmentationTypeParameters,
-      declarationTypeParameters.instantiateNone(),
-    );
-
     if (augmentation is InterfaceElementImpl &&
         declaration is InterfaceElementImpl &&
         augmented is AugmentedInterfaceElementImpl) {
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 1aeba7d..bf840bf 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -2024,12 +2024,20 @@
       var augmentationSubstitution = Substitution.empty;
       if (enclosing != declaration) {
         var elementTypeParameters = enclosing.typeParameters;
-        // We don't add augmentation members if numbers of type parameters
-        // don't match, so we can assume that they are the same here.
-        augmentationSubstitution = Substitution.fromPairs(
-          elementTypeParameters,
-          declarationTypeParameters.instantiateNone(),
-        );
+        if (elementTypeParameters.length == declarationTypeParameters.length) {
+          augmentationSubstitution = Substitution.fromPairs(
+            elementTypeParameters,
+            declarationTypeParameters.instantiateNone(),
+          );
+        } else {
+          augmentationSubstitution = Substitution.fromPairs(
+            elementTypeParameters,
+            List.filled(
+              elementTypeParameters.length,
+              InvalidTypeImpl.instance,
+            ),
+          );
+        }
       }
 
       var substitution = Substitution.empty;
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
index 0936906..2b862dd 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
@@ -93,6 +93,26 @@
     ]);
   }
 
+  test_class_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+class A {
+  void foo() {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+augment library 'a.dart';
+
+augment class A<T> {
+  augment void foo() {}
+}
+''', [
+      error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 42, 1),
+    ]);
+  }
+
   test_enum_0_1() async {
     newFile('$testPackageLibPath/a.dart', r'''
 import augment 'test.dart';
@@ -404,4 +424,24 @@
       error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 44, 1),
     ]);
   }
+
+  test_mixin_method() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+mixin A {
+  void foo() {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+augment library 'a.dart';
+
+augment mixin A<T> {
+  augment void foo() {}
+}
+''', [
+      error(CompileTimeErrorCode.AUGMENTATION_TYPE_PARAMETER_COUNT, 42, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 337e2bd..c8edef6 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -4678,6 +4678,57 @@
 ''');
   }
 
+  test_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @31
+        augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A
+        methods
+          foo @42
+            returnType: void
+            augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+          bar @58
+            returnType: void
+        augmented
+          methods
+            self::@class::A::@method::bar
+            MethodMember
+              base: self::@augmentation::package:test/a.dart::@classAugmentation::A::@methodAugmentation::foo
+              augmentationSubstitution: {T: InvalidType}
+  augmentationImports
+    package:test/a.dart
+      definingUnit
+        classes
+          augment class A @43
+            typeParameters
+              covariant T @45
+                defaultType: dynamic
+            augmentationTarget: self::@class::A
+            methods
+              augment foo @65
+                returnType: void
+                augmentationTarget: self::@class::A::@method::foo
+''');
+  }
+
   test_modifiers_abstract() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';
@@ -50776,6 +50827,95 @@
 ''');
   }
 
+  test_augmented_constants_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment enum A<T> {
+  augment v
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+enum A {
+  v, v2
+}
+''');
+
+    configuration
+      ..withConstructors = false
+      ..withConstantInitializers = false
+      ..withReferences = true;
+    checkElementText(library, r'''
+library
+  reference: self
+  definingUnit
+    reference: self
+    enums
+      enum A @30
+        reference: self::@enum::A
+        augmentation: self::@augmentation::package:test/a.dart::@enumAugmentation::A
+        supertype: Enum
+        fields
+          static const enumConstant v @36
+            reference: self::@enum::A::@field::v
+            type: A
+            shouldUseTypeForInitializerInference: false
+            augmentation: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+          static const enumConstant v2 @39
+            reference: self::@enum::A::@field::v2
+            type: A
+            shouldUseTypeForInitializerInference: false
+          synthetic static const values @-1
+            reference: self::@enum::A::@field::values
+            type: List<A>
+        accessors
+          synthetic static get v @-1
+            reference: self::@enum::A::@getter::v
+            returnType: A
+          synthetic static get v2 @-1
+            reference: self::@enum::A::@getter::v2
+            returnType: A
+          synthetic static get values @-1
+            reference: self::@enum::A::@getter::values
+            returnType: List<A>
+        augmented
+          fields
+            FieldMember
+              base: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+              augmentationSubstitution: {T: InvalidType}
+            self::@enum::A::@field::v2
+            self::@enum::A::@field::values
+          constants
+            FieldMember
+              base: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+              augmentationSubstitution: {T: InvalidType}
+            self::@enum::A::@field::v2
+          accessors
+            self::@enum::A::@getter::v
+            self::@enum::A::@getter::v2
+            self::@enum::A::@getter::values
+  augmentationImports
+    package:test/a.dart
+      reference: self::@augmentation::package:test/a.dart
+      definingUnit
+        reference: self::@augmentation::package:test/a.dart
+        enums
+          augment enum A @42
+            reference: self::@augmentation::package:test/a.dart::@enumAugmentation::A
+            typeParameters
+              covariant T @44
+                defaultType: dynamic
+            augmentationTarget: self::@enum::A
+            fields
+              augment static const enumConstant v @59
+                reference: self::@augmentation::package:test/a.dart::@enumAugmentation::A::@fieldAugmentation::v
+                type: A
+                shouldUseTypeForInitializerInference: false
+                augmentationTarget: self::@enum::A::@field::v
+''');
+  }
+
   test_augmented_constructors_add_named() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';
@@ -56509,6 +56649,57 @@
 ''');
   }
 
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension A on int {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  definingUnit
+    extensions
+      A @35
+        extendedType: int
+        augmentation: self::@augmentation::package:test/a.dart::@extensionAugmentation::A
+        methods
+          foo @53
+            returnType: void
+            augmentation: self::@augmentation::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+          bar @69
+            returnType: void
+        augmented
+          methods
+            self::@extension::A::@method::bar
+            MethodMember
+              base: self::@augmentation::package:test/a.dart::@extensionAugmentation::A::@methodAugmentation::foo
+              augmentationSubstitution: {T: InvalidType}
+  augmentationImports
+    package:test/a.dart
+      definingUnit
+        extensions
+          augment A @47
+            typeParameters
+              covariant T @49
+                defaultType: dynamic
+            augmentationTarget: self::@extension::A
+            methods
+              augment foo @69
+                returnType: void
+                augmentationTarget: self::@extension::A::@method::foo
+''');
+  }
+
   test_augmented_setters_add() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';
@@ -58694,6 +58885,77 @@
 ''');
   }
 
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment extension type A<T>(int it) {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+extension type A(int it) {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  definingUnit
+    extensionTypes
+      A @40
+        augmentation: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A
+        representation: self::@extensionType::A::@field::it
+        primaryConstructor: self::@extensionType::A::@constructor::new
+        typeErasure: int
+        fields
+          final it @46
+            type: int
+        constructors
+          @40
+            parameters
+              requiredPositional final this.it @46
+                type: int
+                field: self::@extensionType::A::@field::it
+        accessors
+          synthetic get it @-1
+            returnType: int
+        methods
+          foo @59
+            returnType: void
+            augmentation: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+          bar @75
+            returnType: void
+        augmented
+          fields
+            self::@extensionType::A::@field::it
+          constructors
+            self::@extensionType::A::@constructor::new
+          accessors
+            self::@extensionType::A::@getter::it
+          methods
+            self::@extensionType::A::@method::bar
+            MethodMember
+              base: self::@augmentation::package:test/a.dart::@extensionTypeAugmentation::A::@methodAugmentation::foo
+              augmentationSubstitution: {T: InvalidType}
+  augmentationImports
+    package:test/a.dart
+      definingUnit
+        extensionTypes
+          augment A @52
+            typeParameters
+              covariant T @54
+                defaultType: dynamic
+            augmentationTarget: self::@extensionType::A
+            methods
+              augment foo @82
+                returnType: void
+                augmentationTarget: self::@extensionType::A::@method::foo
+''');
+  }
+
   test_augmented_setters_add() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';
@@ -62791,6 +63053,60 @@
 ''');
   }
 
+  test_augmented_methods_typeParameterCountMismatch() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment mixin A<T> {
+  augment void foo() {}
+}
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+mixin A {
+  void foo() {}
+  void bar() {}
+}
+''');
+
+    checkElementText(library, r'''
+library
+  definingUnit
+    mixins
+      mixin A @31
+        augmentation: self::@augmentation::package:test/a.dart::@mixinAugmentation::A
+        superclassConstraints
+          Object
+        methods
+          foo @42
+            returnType: void
+            augmentation: self::@augmentation::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+          bar @58
+            returnType: void
+        augmented
+          superclassConstraints
+            Object
+          methods
+            self::@mixin::A::@method::bar
+            MethodMember
+              base: self::@augmentation::package:test/a.dart::@mixinAugmentation::A::@methodAugmentation::foo
+              augmentationSubstitution: {T: InvalidType}
+  augmentationImports
+    package:test/a.dart
+      definingUnit
+        mixins
+          augment mixin A @43
+            typeParameters
+              covariant T @45
+                defaultType: dynamic
+            augmentationTarget: self::@mixin::A
+            methods
+              augment foo @65
+                returnType: void
+                augmentationTarget: self::@mixin::A::@method::foo
+''');
+  }
+
   test_augmented_setters_add() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';
diff --git a/pkg/dds/test/control_web_server_starts_dds_test.dart b/pkg/dds/test/control_web_server_starts_dds_test.dart
index ef1ad79..4fb25fb 100644
--- a/pkg/dds/test/control_web_server_starts_dds_test.dart
+++ b/pkg/dds/test/control_web_server_starts_dds_test.dart
@@ -28,9 +28,9 @@
       silenceOutput: true,
     );
     expect(serviceInfo.serverUri, isNotNull);
-    expect(serviceInfo.serverWebSocketUri, isNotNull);
+    final serverWebSocketUri = serviceInfo.serverWebSocketUri!;
     service = await vmServiceConnectUri(
-      serviceInfo.serverWebSocketUri!.toString(),
+      serverWebSocketUri.toString(),
     );
 
     // Check that DDS has been launched.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 972ae8f..eb81ba2 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -561,39 +561,35 @@
                           Thread* thread) {
   ObjectPtr object = static_cast<ObjectPtr>(object_in);
 
-  // If we eliminate a generational write barriers on allocations of an object
+  // If we eliminate the generational write barrier when writing into an object,
   // we need to ensure it's either a new-space object or it has been added to
-  // the remembered set.
+  // the remembered set. If we eliminate the incremental write barrier, we need
+  // to add the object to the deferred marking stack so it will be [re]scanned.
   //
   // NOTE: We use static_cast<>() instead of ::RawCast() to avoid handle
   // allocations in debug mode. Handle allocations in leaf runtimes can cause
   // memory leaks because they will allocate into a handle scope from the next
   // outermost runtime code (to which the generated Dart code might not return
   // in a long time).
-  bool add_to_remembered_set = true;
-  if (object->IsNewObject()) {
-    add_to_remembered_set = false;
-  } else if (object->IsArray()) {
+  bool skips_barrier = true;
+  if (object->IsArray()) {
     const intptr_t length = Array::LengthOf(static_cast<ArrayPtr>(object));
-    add_to_remembered_set =
-        compiler::target::WillAllocateNewOrRememberedArray(length);
+    skips_barrier = compiler::target::WillAllocateNewOrRememberedArray(length);
   } else if (object->IsContext()) {
     const intptr_t num_context_variables =
         Context::NumVariables(static_cast<ContextPtr>(object));
-    add_to_remembered_set =
-        compiler::target::WillAllocateNewOrRememberedContext(
-            num_context_variables);
+    skips_barrier = compiler::target::WillAllocateNewOrRememberedContext(
+        num_context_variables);
   }
 
-  if (add_to_remembered_set) {
-    object->untag()->EnsureInRememberedSet(thread);
-  }
+  if (skips_barrier) {
+    if (object->IsOldObject()) {
+      object->untag()->EnsureInRememberedSet(thread);
+    }
 
-  // For incremental write barrier elimination, we need to ensure that the
-  // allocation ends up in the new space or else the object needs to added
-  // to deferred marking stack so it will be [re]scanned.
-  if (thread->is_marking()) {
-    thread->DeferredMarkingStackAddObject(object);
+    if (thread->is_marking()) {
+      thread->DeferredMarkingStackAddObject(object);
+    }
   }
 
   return static_cast<uword>(object);
diff --git a/tools/VERSION b/tools/VERSION
index 4214e18..2f24734 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 5
 PATCH 0
-PRERELEASE 300
+PRERELEASE 301
 PRERELEASE_PATCH 0