Version 2.18.0-191.0.dev

Merge commit 'de23c67fb095218ce6a089d32289c9eacea7d212' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index a916ae6..1b92334 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -208,6 +208,7 @@
           });
         }
         nextInsertionRange++;
+        insertionCount++;
       }
     }
     //
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
index 3795cb8..f64c69e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
@@ -1828,6 +1828,382 @@
 ''');
   }
 
+  Future<void>
+      test_material_ThemeData_toggleableActiveColor_deprecated_1() async {
+    setPackageContent('''
+
+class ThemeData {
+  ThemeData({
+    Color? primaryColor,
+    Color? primaryColorLight,
+    Color? primaryColorDark,
+    Color? focusColor,
+    Color? hoverColor,
+    @deprecated
+    Color? toggleableActiveColor,
+    CheckboxThemeData? checkboxTheme,
+    DataTableThemeData? dataTableTheme,
+    RadioThemeData? radioTheme,
+    SliderThemeData? sliderTheme,
+  }) {}
+}
+
+class Color {
+  Color(int value) {}
+}
+
+class Colors {
+  Colors._();
+
+  static Color black = Color(0xFF000000);
+  static Color white = Color(0xFFFFFFFF);
+}
+
+class CheckboxThemeData {}
+
+class DataTableThemeData {}
+
+class RadioThemeData {}
+
+class SliderThemeData {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Migrate ThemeData.toggleableActiveColor to individual themes'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'ThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'toggleableActiveColor'
+      - kind: 'addParameter'
+        index: 6
+        name: 'checkboxTheme'
+        style: optional_named
+        argumentValue:
+          expression: "CheckboxThemeData()"
+          requiredIf: "toggleableActiveColor != ''"
+      - kind: 'addParameter'
+        index: 8
+        name: 'radioTheme'
+        style: optional_named
+        argumentValue:
+          expression: "RadioThemeData()"
+          requiredIf:  "toggleableActiveColor != ''"
+    variables:
+      toggleableActiveColor:
+        kind: 'fragment'
+        value: 'arguments[toggleableActiveColor]'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(toggleableActiveColor: Colors.black);
+  print(themeData);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(checkboxTheme: CheckboxThemeData(), radioTheme: RadioThemeData());
+  print(themeData);
+}
+''');
+  }
+
+  Future<void>
+      test_material_ThemeData_toggleableActiveColor_deprecated_2() async {
+    setPackageContent('''
+
+class ThemeData {
+  ThemeData({
+    Color? primaryColor,
+    Color? primaryColorLight,
+    Color? primaryColorDark,
+    Color? focusColor,
+    Color? hoverColor,
+    @deprecated
+    Color? toggleableActiveColor,
+    CheckboxThemeData? checkboxTheme,
+    DataTableThemeData? dataTableTheme,
+    RadioThemeData? radioTheme,
+    SliderThemeData? sliderTheme,
+  }) {}
+}
+
+class Color {
+  Color(int value) {}
+}
+
+class Colors {
+  Colors._();
+
+  static Color black = Color(0xFF000000);
+  static Color white = Color(0xFFFFFFFF);
+}
+
+class CheckboxThemeData {}
+
+class DataTableThemeData {}
+
+class RadioThemeData {}
+
+class SliderThemeData {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Migrate ThemeData.toggleableActiveColor to individual themes'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'ThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'toggleableActiveColor'
+      - kind: 'addParameter'
+        index: 6
+        name: 'checkboxTheme'
+        style: optional_named
+        argumentValue:
+          expression: "CheckboxThemeData()"
+          requiredIf: "toggleableActiveColor != ''"
+      - kind: 'addParameter'
+        index: 8
+        name: 'radioTheme'
+        style: optional_named
+        argumentValue:
+          expression: "RadioThemeData()"
+          requiredIf:  "toggleableActiveColor != ''"
+    variables:
+      toggleableActiveColor:
+        kind: 'fragment'
+        value: 'arguments[toggleableActiveColor]'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(
+    focusColor: Colors.black,
+    toggleableActiveColor: Colors.black,
+    hoverColor: Colors.white,
+    primaryColor: Colors.white,
+    sliderTheme: SliderThemeData(),
+  );
+  print(themeData);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(
+    focusColor: Colors.black,
+    hoverColor: Colors.white,
+    primaryColor: Colors.white,
+    sliderTheme: SliderThemeData(), checkboxTheme: CheckboxThemeData(), radioTheme: RadioThemeData(),
+  );
+  print(themeData);
+}
+''');
+  }
+
+  Future<void> test_material_ThemeData_toggleableActiveColor_removed_1() async {
+    setPackageContent('''
+
+class ThemeData {
+  ThemeData({
+    Color? primaryColor,
+    Color? primaryColorLight,
+    Color? primaryColorDark,
+    Color? focusColor,
+    Color? hoverColor,
+    CheckboxThemeData? checkboxTheme,
+    DataTableThemeData? dataTableTheme,
+    RadioThemeData? radioTheme,
+    SliderThemeData? sliderTheme,
+  }) {}
+}
+
+class Color {
+  Color(int value) {}
+}
+
+class Colors {
+  Colors._();
+
+  static Color black = Color(0xFF000000);
+  static Color white = Color(0xFFFFFFFF);
+}
+
+class CheckboxThemeData {}
+
+class DataTableThemeData {}
+
+class RadioThemeData {}
+
+class SliderThemeData {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Migrate ThemeData.toggleableActiveColor to individual themes'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'ThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'toggleableActiveColor'
+      - kind: 'addParameter'
+        index: 6
+        name: 'checkboxTheme'
+        style: optional_named
+        argumentValue:
+          expression: "CheckboxThemeData()"
+          requiredIf: "toggleableActiveColor != ''"
+      - kind: 'addParameter'
+        index: 8
+        name: 'radioTheme'
+        style: optional_named
+        argumentValue:
+          expression: "RadioThemeData()"
+          requiredIf:  "toggleableActiveColor != ''"
+    variables:
+      toggleableActiveColor:
+        kind: 'fragment'
+        value: 'arguments[toggleableActiveColor]'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(toggleableActiveColor: Colors.black);
+  print(themeData);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(checkboxTheme: CheckboxThemeData(), radioTheme: RadioThemeData());
+  print(themeData);
+}
+''');
+  }
+
+  Future<void> test_material_ThemeData_toggleableActiveColor_removed_2() async {
+    setPackageContent('''
+
+class ThemeData {
+  ThemeData({
+    Color? primaryColor,
+    Color? primaryColorLight,
+    Color? primaryColorDark,
+    Color? focusColor,
+    Color? hoverColor,
+    CheckboxThemeData? checkboxTheme,
+    DataTableThemeData? dataTableTheme,
+    RadioThemeData? radioTheme,
+    SliderThemeData? sliderTheme,
+  }) {}
+}
+
+class Color {
+  Color(int value) {}
+}
+
+class Colors {
+  Colors._();
+
+  static Color black = Color(0xFF000000);
+  static Color white = Color(0xFFFFFFFF);
+}
+
+class CheckboxThemeData {}
+
+class DataTableThemeData {}
+
+class RadioThemeData {}
+
+class SliderThemeData {}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Migrate ThemeData.toggleableActiveColor to individual themes'
+    date: 2020-09-24
+    element:
+      uris: ['$importUri']
+      constructor: ''
+      inClass: 'ThemeData'
+    changes:
+      - kind: 'removeParameter'
+        name: 'toggleableActiveColor'
+      - kind: 'addParameter'
+        index: 6
+        name: 'checkboxTheme'
+        style: optional_named
+        argumentValue:
+          expression: "CheckboxThemeData()"
+          requiredIf: "toggleableActiveColor != ''"
+      - kind: 'addParameter'
+        index: 8
+        name: 'radioTheme'
+        style: optional_named
+        argumentValue:
+          expression: "RadioThemeData()"
+          requiredIf:  "toggleableActiveColor != ''"
+    variables:
+      toggleableActiveColor:
+        kind: 'fragment'
+        value: 'arguments[toggleableActiveColor]'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(
+    focusColor: Colors.black,
+    toggleableActiveColor: Colors.black,
+    hoverColor: Colors.white,
+    primaryColor: Colors.white,
+    sliderTheme: SliderThemeData(),
+  );
+  print(themeData);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f() {
+  ThemeData themeData = ThemeData();
+  themeData = ThemeData(
+    focusColor: Colors.black,
+    hoverColor: Colors.white,
+    primaryColor: Colors.white,
+    sliderTheme: SliderThemeData(), checkboxTheme: CheckboxThemeData(), radioTheme: RadioThemeData(),
+  );
+  print(themeData);
+}
+''');
+  }
+
   Future<void> test_material_Typography_defaultConstructor_deprecated() async {
     setPackageContent('''
 class Typography {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index 8fcb8d5..d51cf23 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -579,6 +579,42 @@
 ''');
   }
 
+  Future<void> test_remove_deprecated_add_multiple() async {
+    setPackageContent('''
+class C {
+  void m(
+  {
+  @deprecated
+  int a,
+  int b, int d, int e}
+  ) {}
+}
+''');
+    setPackageData(_modify([
+      'm',
+      'C'
+    ], [
+      RemoveParameter(NamedParameterReference('a')),
+      AddParameter(1, 'b', true, false, codeTemplate('1')),
+      AddParameter(2, 'd', true, false, codeTemplate('2')),
+      AddParameter(3, 'e', true, false, codeTemplate('3')),
+    ]));
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m(a: 0);
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m(b: 1, d: 2, e: 3);
+}
+''');
+  }
+
   Future<void> test_remove_first_optionalNamed_deprecated() async {
     setPackageContent('''
 class C {
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index e8e75f4..756b1b9 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1671,9 +1671,9 @@
     assert(tag == Tag.Procedure);
     CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.reference;
-    Procedure? node = reference.node as Procedure?;
-    if (alwaysCreateNewNamedNodes) {
-      node = null;
+    Procedure? node;
+    if (!alwaysCreateNewNamedNodes) {
+      node = reference.node as Procedure?;
     }
     Uri fileUri = readUriReference();
     int startFileOffset = readOffset();
diff --git a/pkg/kernel/test/convert_field_to_setter_getter.dart b/pkg/kernel/test/convert_field_to_setter_getter_test.dart
similarity index 97%
rename from pkg/kernel/test/convert_field_to_setter_getter.dart
rename to pkg/kernel/test/convert_field_to_setter_getter_test.dart
index 702b4cf..d0a2e00 100644
--- a/pkg/kernel/test/convert_field_to_setter_getter.dart
+++ b/pkg/kernel/test/convert_field_to_setter_getter_test.dart
@@ -54,6 +54,10 @@
 
   // Replace the field with a setter/getter pair.
   lib1.fields.remove(field);
+
+  // Important: Unbind any old canonical name
+  field.fieldReference.canonicalName?.unbind();
+
   FunctionNode getterFunction = new FunctionNode(new Block([]));
   Procedure getter = new Procedure(
       new Name("f"), ProcedureKind.Getter, getterFunction,
@@ -112,6 +116,7 @@
   // (nulling out the canonical name is not enough, see above).
   fieldReplacement.getterReference.canonicalName?.unbind();
   fieldReplacement.setterReference?.canonicalName?.unbind();
+  fieldReplacement.fieldReference.canonicalName?.unbind();
   lib1.addField(fieldReplacement);
 
   verifyTargets(
diff --git a/pkg/kernel/test/load_field_and_procedure_overwrites_test.dart b/pkg/kernel/test/load_field_and_procedure_overwrites_test.dart
new file mode 100644
index 0000000..c9950d5
--- /dev/null
+++ b/pkg/kernel/test/load_field_and_procedure_overwrites_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
+import 'binary/utils.dart';
+
+void main() {
+  final Uri libUri = Uri.parse('org-dartlang:///lib.dart');
+
+  List<int> writtenBytesField;
+  {
+    Library lib = new Library(libUri, fileUri: libUri);
+    final Field field =
+        new Field.immutable(new Name("myGetter"), fileUri: libUri);
+    lib.addField(field);
+
+    writtenBytesField = serialize(lib);
+  }
+  List<int> writtenBytesProcedure;
+  {
+    Library lib = new Library(libUri, fileUri: libUri);
+    final Block libProcedureBody = new Block([]);
+    final Procedure procedure = new Procedure(
+        new Name("myGetter"),
+        ProcedureKind.Getter,
+        new FunctionNode(libProcedureBody, returnType: new DynamicType()),
+        fileUri: libUri);
+    lib.addProcedure(procedure);
+    writtenBytesProcedure = serialize(lib);
+  }
+
+  CanonicalName nameRoot = new CanonicalName.root();
+
+  for (int i = 0; i < 4; i++) {
+    // Load field version "on top of" (meant to replace old one if any).
+    Component componentWithField = new Component(nameRoot: nameRoot);
+    new BinaryBuilder(writtenBytesField,
+            disableLazyReading: false, alwaysCreateNewNamedNodes: true)
+        .readComponent(componentWithField);
+    expect(componentWithField.libraries.single.members.single is Field, true);
+
+    // Load procedure version "on top of" (meant to replace old one if any).
+    Component componentWithProcedure = new Component(nameRoot: nameRoot);
+    new BinaryBuilder(writtenBytesProcedure,
+            disableLazyReading: false, alwaysCreateNewNamedNodes: true)
+        .readComponent(componentWithProcedure);
+    expect(componentWithProcedure.libraries.single.members.single is Procedure,
+        true);
+  }
+}
+
+void expect(dynamic actual, dynamic expected) {
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+List<int> serialize(Library lib1) {
+  Component component = new Component(libraries: [lib1])
+    ..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
+  ByteSink sink = new ByteSink();
+  new BinaryPrinter(sink).writeComponentFile(component);
+  return sink.builder.takeBytes();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 10b6efa..5e77a13 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 190
+PRERELEASE 191
 PRERELEASE_PATCH 0
\ No newline at end of file