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