Version 3.7.0-173.0.dev
Merge 53844a6ba03da914e43d663e152687f2c0b026ae into dev
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
index f8b9976..a39a858 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_extension_override.dart
@@ -18,8 +18,14 @@
var node = this.node;
if (node is! SimpleIdentifier) return const [];
var parent = node.parent;
- if (parent is! PropertyAccess) return const [];
- var target = parent.target;
+ Expression? target;
+ if (parent is MethodInvocation) {
+ target = parent.target;
+ } else if (parent is PropertyAccess) {
+ target = parent.target;
+ } else {
+ return const [];
+ }
if (target == null) return const [];
var dartFixContext = context.dartFixContext;
if (dartFixContext == null) return const [];
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
index 00acc08..ca3b70e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_extension_override_test.dart
@@ -20,6 +20,39 @@
@override
FixKind get kind => DartFixKind.ADD_EXTENSION_OVERRIDE;
+ Future<void> test_method() async {
+ await resolveTestCode('''
+extension E on int {
+ void foo() {}
+}
+extension E2 on int {
+ void foo() {}
+}
+f() {
+ 0.foo();
+}
+''');
+ await assertHasFix('''
+extension E on int {
+ void foo() {}
+}
+extension E2 on int {
+ void foo() {}
+}
+f() {
+ E(0).foo();
+}
+''', matchFixMessage: "Add an extension override for 'E'");
+
+ await assertHasFixesWithoutApplying(
+ expectedNumberOfFixesForKind: 2,
+ matchFixMessages: [
+ "Add an extension override for 'E'",
+ "Add an extension override for 'E2'",
+ ],
+ );
+ }
+
Future<void> test_no_name() async {
await resolveTestCode('''
extension E on int {
diff --git a/pkg/analyzer/analyzer_use_new_elements.txt b/pkg/analyzer/analyzer_use_new_elements.txt
index 832176b..2937379 100644
--- a/pkg/analyzer/analyzer_use_new_elements.txt
+++ b/pkg/analyzer/analyzer_use_new_elements.txt
@@ -225,7 +225,6 @@
test/src/dart/resolution/scope_test.dart
test/src/dart/resolution/super_formal_parameter_test.dart
test/src/lint/lint_rule_test.dart
-test/src/lint/linter/linter_context_impl_test.dart
test/src/services/top_level_declarations_test.dart
test/src/summary/element_text.dart
test/src/summary/elements/class_test.dart
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 6255d0d..c96a0bd 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -42,9 +42,9 @@
unit: result.unit,
);
- var libraryElement = result.libraryElement;
+ var libraryElement = result.libraryElement2;
var analysisContext = libraryElement.session.analysisContext;
- var libraryPath = libraryElement.source.fullName;
+ var libraryPath = libraryElement.firstFragment.source.fullName;
var workspace = analysisContext.contextRoot.workspace;
var workspacePackage = workspace.findPackageFor(libraryPath);
diff --git a/pkg/linter/analyzer_use_new_elements.txt b/pkg/linter/analyzer_use_new_elements.txt
index b8e84eb..4f42ee6 100644
--- a/pkg/linter/analyzer_use_new_elements.txt
+++ b/pkg/linter/analyzer_use_new_elements.txt
@@ -10,5 +10,4 @@
lib/src/rules/use_build_context_synchronously.dart
lib/src/rules/use_late_for_private_fields_and_variables.dart
lib/src/util/dart_type_utilities.dart
-lib/src/util/flutter_utils.dart
test/rules/use_build_context_synchronously_test.dart
diff --git a/pkg/linter/lib/src/rules/use_build_context_synchronously.dart b/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
index 657206a..8deed4e 100644
--- a/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
+++ b/pkg/linter/lib/src/rules/use_build_context_synchronously.dart
@@ -10,6 +10,8 @@
import 'package:analyzer/src/dart/resolver/exit_detector.dart';
// ignore: implementation_imports
import 'package:analyzer/src/lint/constants.dart';
+// ignore: implementation_imports
+import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:collection/collection.dart';
import 'package:meta/meta.dart';
import 'package:pub_semver/pub_semver.dart';
@@ -1338,7 +1340,8 @@
if (self is PropertyAccessorElement) {
var enclosingElement = self.enclosingElement3;
- if (enclosingElement is InterfaceElement && isState(enclosingElement)) {
+ if (enclosingElement is InterfaceElement &&
+ isState(enclosingElement.asElement2)) {
// The BuildContext object is the field on Flutter's State class.
// This object can only be guarded by async gaps with a mounted
// check on the State.
diff --git a/pkg/linter/lib/src/util/flutter_utils.dart b/pkg/linter/lib/src/util/flutter_utils.dart
index adf98af..3ac5bbe 100644
--- a/pkg/linter/lib/src/util/flutter_utils.dart
+++ b/pkg/linter/lib/src/util/flutter_utils.dart
@@ -2,7 +2,6 @@
// 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:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
@@ -33,13 +32,13 @@
_Flutter get _flutter => _flutterInstance;
-bool hasWidgetAsAscendant(ClassElement element) =>
+bool hasWidgetAsAscendant(ClassElement2 element) =>
_flutter.hasWidgetAsAscendant(element);
bool isBuildContext(DartType? type, {bool skipNullable = false}) =>
_flutter.isBuildContext(type, skipNullable: skipNullable);
-bool isExactWidget(ClassElement element) => _flutter.isExactWidget(element);
+bool isExactWidget(ClassElement2 element) => _flutter.isExactWidget(element);
bool isExactWidgetTypeContainer(DartType? type) =>
_flutter.isExactWidgetTypeContainer(type);
@@ -49,9 +48,7 @@
bool isKDebugMode(Element2? element) => _flutter.isKDebugMode(element);
-bool isState(InterfaceElement element) => _flutter.isState(element);
-
-bool isState2(InterfaceElement2 element) => _flutter.isState2(element);
+bool isState(InterfaceElement2 element) => _flutter.isState(element);
bool isStatefulWidget(ClassElement2? element) =>
element != null && _flutter.isStatefulWidget(element);
@@ -62,7 +59,7 @@
}
if (type is InterfaceType &&
type.implementsAnyInterface(_collectionInterfaces)) {
- return type.element.typeParameters.length == 1 &&
+ return type.element3.typeParameters2.length == 1 &&
isWidgetProperty(type.typeArguments.first);
}
return false;
@@ -90,8 +87,8 @@
_uriFramework = Uri.parse('$uriPrefix/src/widgets/framework.dart'),
_uriFoundation = Uri.parse('$uriPrefix/src/foundation/constants.dart');
- bool hasWidgetAsAscendant(InterfaceElement? element,
- [Set<InterfaceElement>? alreadySeen]) {
+ bool hasWidgetAsAscendant(InterfaceElement2? element,
+ [Set<InterfaceElement2>? alreadySeen]) {
if (element == null) return false;
if (isExactly(element, _nameWidget, _uriFramework)) return true;
@@ -99,9 +96,10 @@
alreadySeen ??= {};
if (!alreadySeen.add(element)) return false;
- var type =
- element.isAugmentation ? element.augmented.thisType : element.supertype;
- return hasWidgetAsAscendant(type?.element, alreadySeen);
+ var type = element.firstFragment.isAugmentation
+ ? element.thisType
+ : element.supertype;
+ return hasWidgetAsAscendant(type?.element3, alreadySeen);
}
bool isBuildContext(DartType? type, {bool skipNullable = false}) {
@@ -111,58 +109,45 @@
if (skipNullable && type.nullabilitySuffix == NullabilitySuffix.question) {
return false;
}
- return isExactly(type.element, _nameBuildContext, _uriFramework);
+ return isExactly(type.element3, _nameBuildContext, _uriFramework);
}
/// Whether [element] is exactly the element named [type], from Flutter.
- bool isExactly(InterfaceElement element, String type, Uri uri) =>
- element.name == type && element.source.uri == uri;
+ bool isExactly(InterfaceElement2 element, String type, Uri uri) =>
+ element.name3 == type && element.library2.firstFragment.source.uri == uri;
- /// Whether [element] is exactly the element named [type], from Flutter.
- bool isExactly2(InterfaceElement2 element, String type, Uri uri) =>
- element.name3 == type &&
- element.firstFragment.libraryFragment.source.uri == uri;
-
- bool isExactWidget(ClassElement element) =>
+ bool isExactWidget(ClassElement2 element) =>
isExactly(element, _nameWidget, _uriFramework);
- bool isExactWidget2(ClassElement2 element) =>
- isExactly2(element, _nameWidget, _uriFramework);
-
bool isExactWidgetTypeContainer(DartType? type) =>
type is InterfaceType &&
- isExactly(type.element, _nameContainer, _uriContainer);
+ isExactly(type.element3, _nameContainer, _uriContainer);
bool isExactWidgetTypeSizedBox(DartType? type) =>
type is InterfaceType &&
- isExactly(type.element, _nameSizedBox, _uriBasic);
+ isExactly(type.element3, _nameSizedBox, _uriBasic);
bool isKDebugMode(Element2? element) =>
element != null &&
element.name3 == 'kDebugMode' &&
element.library2?.uri == _uriFoundation;
- bool isState(InterfaceElement element) =>
+ bool isState(InterfaceElement2 element) =>
isExactly(element, _nameState, _uriFramework) ||
element.allSupertypes
- .any((type) => isExactly(type.element, _nameState, _uriFramework));
-
- bool isState2(InterfaceElement2 element) =>
- isExactly2(element, _nameState, _uriFramework) ||
- element.allSupertypes
- .any((type) => isExactly2(type.element3, _nameState, _uriFramework));
+ .any((type) => isExactly(type.element3, _nameState, _uriFramework));
bool isStatefulWidget(ClassElement2 element) =>
- isExactly2(element, _nameStatefulWidget, _uriFramework) ||
+ isExactly(element, _nameStatefulWidget, _uriFramework) ||
element.allSupertypes.any((type) =>
- isExactly(type.element, _nameStatefulWidget, _uriFramework));
+ isExactly(type.element3, _nameStatefulWidget, _uriFramework));
bool isWidget(InterfaceElement2 element) {
- if (isExactly2(element, _nameWidget, _uriFramework)) {
+ if (isExactly(element, _nameWidget, _uriFramework)) {
return true;
}
for (var type in element.allSupertypes) {
- if (isExactly2(type.element3, _nameWidget, _uriFramework)) {
+ if (isExactly(type.element3, _nameWidget, _uriFramework)) {
return true;
}
}
diff --git a/tools/VERSION b/tools/VERSION
index 34a9717..bf0a92d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 3
MINOR 7
PATCH 0
-PRERELEASE 172
+PRERELEASE 173
PRERELEASE_PATCH 0