DAS: Extract static code from static class Flutter.
Most methods are refactored as extension methods. Some unused ones are deleted.
Some are inlined into their call sites.
Change-Id: I47826fd3241db86526efa2ee410990a0fc7be702
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/362300
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 04ea357..10895e8 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/services/refactoring/legacy/refactoring.dart';
import 'package:analysis_server/src/services/search/hierarchy.dart';
import 'package:analysis_server/src/utilities/change_builder.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/line_info.dart';
@@ -81,9 +81,9 @@
}
FlutterWidgetState? _findFlutterStateClass(Element element, String newName) {
- if (Flutter.isStatefulWidgetDeclaration(element)) {
+ if (element is ClassElement && element.isStatefulWidgetDeclaration) {
var oldStateName = '${element.displayName}State';
- var library = element.library!;
+ var library = element.library;
var state =
library.getClass(oldStateName) ?? library.getClass('_$oldStateName');
if (state != null) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_color.dart b/pkg/analysis_server/lib/src/computer/computer_color.dart
index eb38ccf0..28f3395 100644
--- a/pkg/analysis_server/lib/src/computer/computer_color.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_color.dart
@@ -2,7 +2,7 @@
// 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:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
@@ -55,7 +55,7 @@
String? memberName,
int? index,
}) {
- if (!Flutter.isColor(expression.staticType)) return false;
+ if (!expression.staticType.isColor) return false;
target ??= expression;
@@ -80,7 +80,7 @@
/// because they are not const) but are simple well-known dart:ui/Flutter
/// color constructors that we can manually parse.
bool tryAddKnownColorConstructor(InstanceCreationExpression expression) {
- if (!Flutter.isColor(expression.staticType)) return false;
+ if (!expression.staticType.isColor) return false;
final constructor = expression.constructorName;
final staticElement = constructor.staticElement;
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 17d2c74..ba996ed 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/collections.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
@@ -482,14 +482,14 @@
@override
void visitInstanceCreationExpression(InstanceCreationExpression node) {
- if (outlineComputer.withBasicFlutter && Flutter.isWidgetCreation(node)) {
+ if (outlineComputer.withBasicFlutter && node.isWidgetCreation) {
var children = <Outline>[];
node.argumentList
.accept(_FunctionBodyOutlinesVisitor(outlineComputer, children));
// The method `getWidgetPresentationText` should not return `null` when
// `isWidgetCreation` returns `true`.
- var text = Flutter.getWidgetPresentationText(node) ?? '<unknown>';
+ var text = node.widgetPresentationText ?? '<unknown>';
var element = Element(ElementKind.CONSTRUCTOR_INVOCATION, text, 0,
location: outlineComputer._getLocationOffsetLength(node.offset, 0));
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 0584aa3f..f83ab37 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/computer/computer_outline.dart';
import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
@@ -129,7 +129,7 @@
/// a widget reference outline item.
protocol.FlutterOutline? _createOutline(Expression node, bool withGeneric) {
var type = node.staticType;
- if (type is! InterfaceType || !Flutter.isWidgetType(type)) {
+ if (type is! InterfaceType || !type.isWidgetType) {
return null;
}
var className = type.element.displayName;
@@ -138,11 +138,6 @@
var attributes = <protocol.FlutterOutlineAttribute>[];
var children = <protocol.FlutterOutline>[];
for (var argument in node.argumentList.arguments) {
- var argumentType = argument.staticType;
- var isWidgetArgument = Flutter.isWidgetType(argumentType);
- var isWidgetListArgument =
- argumentType != null && Flutter.isListOfWidgetsType(argumentType);
-
String? parentAssociationLabel;
Expression childrenExpression;
@@ -174,6 +169,11 @@
}
}
+ var argumentType = argument.staticType;
+ var isWidgetArgument = argumentType.isWidgetType;
+ var isWidgetListArgument =
+ argumentType != null && argumentType.isListOfWidgetsType;
+
if (isWidgetArgument && childrenExpression is ConditionalExpression) {
addChildrenFrom(childrenExpression.thenExpression);
addChildrenFrom(childrenExpression.elseExpression);
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 1883eda..60d4df4 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
@@ -6,7 +6,6 @@
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/mapping.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -135,8 +134,7 @@
final editRange = SourceRange(editStart, editEnd - editStart);
final sessionHelper = AnalysisSessionHelper(unit.session);
- final colorType =
- await sessionHelper.getClass(Flutter.widgetsUri, 'Color');
+ final colorType = await sessionHelper.getFlutterClass('Color');
if (colorType == null) {
// If we can't find the class (perhaps because this isn't a Flutter
// project) we will not include any results. In theory the client should
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 7ccdc42..53b352b 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -29,7 +29,7 @@
import 'package:analysis_server/src/server/error_notifier.dart';
import 'package:analysis_server/src/server/performance.dart';
import 'package:analysis_server/src/services/user_prompts/dart_fix_prompt_manager.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analysis_server/src/utilities/process.dart';
import 'package:analyzer/dart/analysis/context_locator.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -1016,13 +1016,13 @@
);
}
- /// Checks whether [file] is in a project that can resolve 'package:flutter'
- /// libraries.
+ /// Returns whether [filePath] is in a project that can resolve
+ /// 'package:flutter' libraries.
bool _isInFlutterProject(String filePath) =>
getAnalysisDriver(filePath)
?.currentSession
.uriConverter
- .uriToPath(Uri.parse(Flutter.widgetsUri)) !=
+ .uriToPath(Uri.parse(widgetsUri)) !=
null;
void _notifyPluginsOverlayChanged(
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
index 74fa17a..40fb946 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart
@@ -14,8 +14,8 @@
import 'package:analysis_server/src/services/completion/dart/visibility_tracker.dart';
import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analysis_server/src/utilities/extensions/object.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/syntactic_entity.dart';
@@ -345,7 +345,7 @@
appendComma = true;
}
} else if (parent is InstanceCreationExpression &&
- Flutter.isWidgetCreation(parent)) {
+ parent.isWidgetCreation) {
appendComma = true;
}
int? replacementLength;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 6909f0a..021a510 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -16,7 +16,7 @@
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analysis_server/src/utilities/extensions/element.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
@@ -776,7 +776,7 @@
var enclosingElement = method.enclosingElement;
if (method.name == 'setState' &&
enclosingElement is ClassElement &&
- Flutter.isExactState(enclosingElement)) {
+ enclosingElement.isExactState) {
// TODO(brianwilkerson): Make this more efficient by creating the correct
// suggestion in the first place.
// Find the line indentation.
@@ -844,11 +844,11 @@
var selectionOffset = completion.length;
// Optionally add Flutter child widget details.
- // TODO(pq): revisit this special casing; likely it can be generalized away
+ // TODO(pq): revisit this special casing; likely it can be generalized away.
var element = parameter.enclosingElement;
- // If appendColon is false, default values should never be appended.
+ // If `appendColon` is false, default values should never be appended.
if (element is ConstructorElement && appendColon) {
- if (Flutter.isWidget(element.enclosingElement.augmented.declaration)) {
+ if (element.enclosingElement.augmented.declaration.isWidget) {
var analysisOptions = request.analysisSession.analysisContext
.getAnalysisOptionsForFile(
request.resourceProvider.getFile(request.path));
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index 5aaf775..5fb8281 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
@@ -45,7 +45,7 @@
final classDeclaration = node.thisOrAncestorOfType<ClassDeclaration>();
if (classDeclaration == null ||
- !Flutter.isDiagnosticable(classDeclaration.declaredElement!.thisType)) {
+ !classDeclaration.declaredElement!.thisType.isDiagnosticable) {
return;
}
@@ -74,9 +74,9 @@
} else if (_isIterable(type)) {
constructorId = 'IterableProperty';
typeArgs = (type as InterfaceType).typeArguments;
- } else if (Flutter.isColor(type)) {
+ } else if (type.isColor) {
constructorId = 'ColorProperty';
- } else if (Flutter.isMatrix4(type)) {
+ } else if (type.isMatrix4) {
constructorId = 'TransformProperty';
} else {
constructorId = 'DiagnosticsProperty';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
index 555c8b4..16eb2cb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_field_formal_parameters.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/error_verifier.dart';
@@ -39,8 +39,8 @@
fields.sort((a, b) => a.nameOffset - b.nameOffset);
// Specialize for Flutter widgets.
- if (Flutter.isExactlyStatelessWidgetType(superType) ||
- Flutter.isExactlyStatefulWidgetType(superType)) {
+ if (superType.isExactlyStatelessWidgetType ||
+ superType.isExactlyStatefulWidgetType) {
if (parameters.isNotEmpty && parameters.last.isNamed) {
String parameterForField(FieldElement field) {
var prefix = '';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
index 521c990..301996d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_key_to_constructors.dart
@@ -4,7 +4,6 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
@@ -161,7 +160,7 @@
/// Return the type for the class `Key`.
Future<DartType?> _getKeyType() async {
- var keyClass = await sessionHelper.getClass(Flutter.widgetsUri, 'Key');
+ var keyClass = await sessionHelper.getFlutterClass('Key');
if (keyClass == null) {
return null;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index 1d6bee2..930a4ed 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -6,7 +6,7 @@
import 'package:analysis_server/src/services/completion/dart/utilities.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -85,10 +85,8 @@
offset = lastArgument.end;
hasTrailingComma = lastArgument.endToken.next!.type == TokenType.COMMA;
- if (lastArgument is NamedExpression &&
- Flutter.isWidgetExpression(creation)) {
- if (Flutter.isChildArgument(lastArgument) ||
- Flutter.isChildrenArgument(lastArgument)) {
+ if (lastArgument is NamedExpression && creation.isWidgetExpression) {
+ if (lastArgument.isChildArgument || lastArgument.isChildrenArgument) {
offset = lastArgument.offset;
hasTrailingComma = true;
insertBetweenParams = true;
@@ -123,7 +121,7 @@
builder.addSimpleLinkedEdit('VALUE', 'null');
}
- if (Flutter.isWidgetExpression(creation)) {
+ if (creation.isWidgetExpression) {
// Insert a trailing comma after Flutter instance creation params.
if (!hasTrailingComma) {
builder.write(',');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_child.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_child.dart
index 6ad53b6..7a16829 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_child.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_child.dart
@@ -4,8 +4,9 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/source_range.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -16,33 +17,55 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var named = Flutter.findNamedExpression(node, 'child');
+ var named = node.findArgumentNamed('child');
if (named == null) {
return;
}
// child: widget
var expression = named.expression;
- if (Flutter.isWidgetExpression(expression)) {
+ if (expression.isWidgetExpression) {
await builder.addDartFileEdit(file, (builder) {
- Flutter.convertChildToChildren2(
- builder,
- expression,
- named,
- eol,
- utils.getNodeText,
- utils.getLinePrefix,
- utils.oneIndent,
- utils.getText,
- utils.replaceSourceIndent,
- range.node);
+ var childLoc = named.offset + 'child'.length;
+ builder.addSimpleInsertion(childLoc, 'ren');
+ var listLoc = expression.offset;
+ var childArgSrc = utils.getNodeText(expression);
+ if (!childArgSrc.contains(eol)) {
+ builder.addSimpleInsertion(listLoc, '[');
+ builder.addSimpleInsertion(listLoc + expression.length, ']');
+ } else {
+ var newlineLoc = childArgSrc.lastIndexOf(eol);
+ if (newlineLoc == childArgSrc.length) {
+ newlineLoc -= 1;
+ }
+ var indentOld =
+ utils.getLinePrefix(expression.offset + eol.length + newlineLoc);
+ var indentNew = '$indentOld${utils.oneIndent}';
+ // The separator includes 'child:' but that has no newlines.
+ var separator =
+ utils.getText(named.offset, expression.offset - named.offset);
+ var prefix = separator.contains(eol) ? '' : '$eol$indentNew';
+ if (prefix.isEmpty) {
+ builder.addSimpleInsertion(named.offset + 'child:'.length, ' [');
+ builder.addDeletion(SourceRange(expression.offset - 2, 2));
+ } else {
+ builder.addSimpleInsertion(listLoc, '[');
+ }
+ var newChildArgSrc = utils.replaceSourceIndent(
+ childArgSrc,
+ indentOld,
+ indentNew,
+ );
+ newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
+ builder.addSimpleReplacement(range.node(expression), newChildArgSrc);
+ }
});
return;
}
// child: [widget1, widget2]
if (expression is ListLiteral &&
- expression.elements.every(Flutter.isWidgetExpression)) {
+ expression.elements.every((e) => e.isWidgetExpression)) {
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(range.node(named.name), 'children:');
});
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_children.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_children.dart
index 49185a3..75a4c84 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_children.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_flutter_children.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -23,7 +23,7 @@
var expression = namedExpression.expression;
if (expression is ListLiteral && expression.elements.length == 1) {
var widget = expression.elements[0];
- if (Flutter.isWidgetExpression(widget)) {
+ if (widget.isWidgetExpression) {
var widgetText = utils.getNodeText(widget);
var indentOld = utils.getLinePrefix(widget.offset);
var indentNew = utils.getLinePrefix(namedExpression.offset);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
index 19fa0da..c4f59a8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_for_final_fields.dart
@@ -4,8 +4,8 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analysis_server/src/utilities/extensions/object.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -77,8 +77,8 @@
return;
}
- if (Flutter.isExactlyStatelessWidgetType(superType) ||
- Flutter.isExactlyStatefulWidgetType(superType)) {
+ if (superType.isExactlyStatelessWidgetType ||
+ superType.isExactlyStatefulWidgetType) {
await _forFlutterWidget(
fixContext: fixContext, classDeclaration: container);
} else {
@@ -142,7 +142,7 @@
required _FixContext fixContext,
required NamedCompilationUnitMember classDeclaration,
}) async {
- final keyClass = await sessionHelper.getClass(Flutter.widgetsUri, 'Key');
+ final keyClass = await sessionHelper.getFlutterClass('Key');
if (keyClass == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
index f3f6e3f..8bb1f5d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -27,7 +27,7 @@
parent2 is NamedExpression &&
node.name == 'child' &&
node.staticElement != null &&
- Flutter.isWidgetExpression(parent2.expression)) {
+ parent2.expression.isWidgetExpression) {
namedExp = parent2;
} else {
return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
index 67caa5c..9971ea81 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateful_widget.dart
@@ -5,7 +5,7 @@
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -38,7 +38,7 @@
// Must be a StatelessWidget subclass.
var widgetClassElement = widgetClass.declaredElement!;
var superType = widgetClassElement.supertype;
- if (superType == null || !Flutter.isExactlyStatelessWidgetType(superType)) {
+ if (superType == null || !superType.isExactlyStatelessWidgetType) {
return;
}
@@ -104,14 +104,9 @@
return SourceEdit.applySequence(text, visitor.edits.reversed);
}
- var statefulWidgetClass = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'StatefulWidget',
- );
- var stateClass = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'State',
- );
+ var statefulWidgetClass =
+ await sessionHelper.getFlutterClass('StatefulWidget');
+ var stateClass = await sessionHelper.getFlutterClass('State');
if (statefulWidgetClass == null || stateClass == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
index 57eaa84..2ed18e4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
@@ -5,7 +5,7 @@
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -37,7 +37,7 @@
// Must be a StatefulWidget subclass.
var widgetClassElement = widgetClass.declaredElement!;
var superType = widgetClassElement.supertype;
- if (superType == null || !Flutter.isExactlyStatefulWidgetType(superType)) {
+ if (superType == null || !superType.isExactlyStatefulWidgetType) {
return;
}
@@ -124,10 +124,8 @@
return SourceEdit.applySequence(text, visitor.edits.reversed);
}
- var statelessWidgetClass = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'StatelessWidget',
- );
+ var statelessWidgetClass =
+ await sessionHelper.getFlutterClass('StatelessWidget');
if (statelessWidgetClass == null) {
return;
}
@@ -259,7 +257,7 @@
}
var classElement = type.element;
- return classElement is ClassElement && Flutter.isExactState(classElement);
+ return classElement is ClassElement && classElement.isExactState;
}
}
@@ -367,7 +365,7 @@
if (methodElement is ClassMemberElement) {
var classElement = methodElement.enclosingElement;
if (classElement is ClassElement &&
- Flutter.isExactState(classElement) &&
+ classElement.isExactState &&
!FlutterConvertToStatelessWidget._isDefaultOverride(
node.thisOrAncestorOfType<MethodDeclaration>())) {
canBeStateless = false;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
index ae1570d..0e1fe0c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_down.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -17,7 +17,7 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var widget = Flutter.identifyWidgetExpression(node);
+ var widget = node.findWidgetExpression;
if (widget == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
index 1145aa9..f11e103 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_move_up.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -17,7 +17,7 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var widget = Flutter.identifyWidgetExpression(node);
+ var widget = node.findWidgetExpression;
if (widget == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
index 3088727..5adb0ce 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_remove_widget.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -34,13 +34,13 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var widgetCreation = Flutter.identifyNewExpression(node);
+ var widgetCreation = node.findInstanceCreationExpression;
if (widgetCreation == null) {
return;
}
// Prepare the list of our children.
- var childrenArgument = Flutter.findChildrenArgument(widgetCreation);
+ var childrenArgument = widgetCreation.childrenArgument;
if (childrenArgument != null) {
var childrenExpression = childrenArgument.expression;
if (childrenExpression is ListLiteral &&
@@ -49,11 +49,11 @@
builder, widgetCreation, childrenExpression.elements);
}
} else {
- var childArgument = Flutter.findChildArgument(widgetCreation);
+ var childArgument = widgetCreation.childArgument;
if (childArgument != null) {
await _removeSingle(builder, widgetCreation, childArgument.expression);
} else {
- var builderArgument = Flutter.findBuilderArgument(widgetCreation);
+ var builderArgument = widgetCreation.builderArgument;
if (builderArgument != null) {
await _removeBuilder(builder, widgetCreation, builderArgument);
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
index 3868eb4..9786097 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_child.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -16,7 +16,7 @@
InstanceCreationExpression parent,
InstanceCreationExpression child) async {
// The child must have its own child.
- var stableChild = Flutter.findChildArgument(child);
+ var stableChild = child.childArgument;
if (stableChild == null) {
return;
}
@@ -63,7 +63,7 @@
// Write all arguments of the parent.
// Don't write its child.
for (var argument in parentArgs.arguments) {
- if (!Flutter.isChildArgument(argument)) {
+ if (!argument.isChildArgument) {
var text = utils.getNodeText(argument);
text = utils.replaceSourceIndent(
text,
@@ -104,15 +104,14 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var parent = Flutter.identifyNewExpression(node);
- if (parent == null || !Flutter.isWidgetCreation(parent)) {
+ var parent = node.findInstanceCreationExpression;
+ if (parent == null || !parent.isWidgetCreation) {
return;
}
- var childArgument = Flutter.findChildArgument(parent);
+ var childArgument = parent.childArgument;
var child = childArgument?.expression;
- if (child is! InstanceCreationExpression ||
- !Flutter.isWidgetCreation(child)) {
+ if (child is! InstanceCreationExpression || !child.isWidgetCreation) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
index fb2829c..0a00d47 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_swap_with_parent.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_child.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -15,8 +15,8 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var child = Flutter.identifyNewExpression(node);
- if (child == null || !Flutter.isWidgetCreation(child)) {
+ var child = node.findInstanceCreationExpression;
+ if (child == null || !child.isWidgetCreation) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
index 1386e2f..766263a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/source/source_range.dart';
@@ -18,20 +18,20 @@
@override
Future<List<ResolvedCorrectionProducer>> get producers async {
var producers = <ResolvedCorrectionProducer>[];
- var widgetExpr = Flutter.identifyWidgetExpression(node);
+ var widgetExpr = node.findWidgetExpression;
if (widgetExpr != null) {
var widgetType = widgetExpr.typeOrThrow;
producers.add(_FlutterWrapGeneric(widgetExpr));
- if (!Flutter.isExactWidgetTypeCenter(widgetType)) {
+ if (!widgetType.isExactWidgetTypeCenter) {
producers.add(_FlutterWrapCenter(widgetExpr));
}
- if (!Flutter.isExactWidgetTypeContainer(widgetType)) {
+ if (!widgetType.isExactWidgetTypeContainer) {
producers.add(_FlutterWrapContainer(widgetExpr));
}
- if (!Flutter.isExactWidgetTypePadding(widgetType)) {
+ if (!widgetType.isExactWidgetTypePadding) {
producers.add(_FlutterWrapPadding(widgetExpr));
}
- if (!Flutter.isExactWidgetTypeSizedBox(widgetType)) {
+ if (!widgetType.isExactWidgetTypeSizedBox) {
producers.add(_FlutterWrapSizedBox(widgetExpr));
}
}
@@ -58,8 +58,7 @@
parent is InstanceCreationExpression) {
selectedNode = parent;
}
- if (selectedNode is! Expression ||
- !Flutter.isWidgetExpression(selectedNode)) {
+ if (selectedNode is! Expression || !selectedNode.isWidgetExpression) {
return;
}
widgetExpressions.add(selectedNode);
@@ -77,7 +76,7 @@
coveringNode = coveringNode.parent;
}
- var widget = Flutter.identifyWidgetExpression(coveringNode);
+ var widget = coveringNode.findWidgetExpression;
if (widget != null) {
widgetExpressions.add(widget);
}
@@ -105,7 +104,7 @@
String get _parentClassName => 'Center';
@override
- String get _parentLibraryUri => Flutter.widgetsUri;
+ String get _parentLibraryUri => widgetsUri;
}
/// A correction processor that can make one of the possible changes computed by
@@ -132,7 +131,7 @@
String get _parentClassName => 'Container';
@override
- String get _parentLibraryUri => Flutter.widgetsUri;
+ String get _parentLibraryUri => widgetsUri;
}
/// A correction processor that can make one of the possible changes computed by
@@ -162,7 +161,7 @@
String get _parentClassName => 'Padding';
@override
- String get _parentLibraryUri => Flutter.widgetsUri;
+ String get _parentLibraryUri => widgetsUri;
}
/// A correction processor that can make one of the possible changes computed by
@@ -189,7 +188,7 @@
String get _parentClassName => 'SizedBox';
@override
- String get _parentLibraryUri => Flutter.widgetsUri;
+ String get _parentLibraryUri => widgetsUri;
}
/// A correction processor that can make one of the possible changes computed by
@@ -203,7 +202,7 @@
String get _parentClassName;
- String get _parentLibraryUri => Flutter.widgetsUri;
+ String get _parentLibraryUri => widgetsUri;
@override
Future<void> compute(ChangeBuilder builder) async {
@@ -211,8 +210,7 @@
var src = utils.getRangeText(selectedRange);
var parentClassElement =
await sessionHelper.getClass(_parentLibraryUri, _parentClassName);
- var widgetClassElement =
- await sessionHelper.getClass(Flutter.widgetsUri, 'Widget');
+ var widgetClassElement = await sessionHelper.getFlutterClass('Widget');
if (parentClassElement == null || widgetClassElement == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
index a03f115..7ca6487 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -16,19 +16,16 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var widgetExpr = Flutter.identifyWidgetExpression(node);
+ var widgetExpr = node.findWidgetExpression;
if (widgetExpr == null) {
return;
}
- if (Flutter.isExactWidgetTypeBuilder(widgetExpr.typeOrThrow)) {
+ if (widgetExpr.typeOrThrow.isExactWidgetTypeBuilder) {
return;
}
var widgetSrc = utils.getNodeText(widgetExpr);
- var builderElement = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'Builder',
- );
+ var builderElement = await sessionHelper.getFlutterClass('Builder');
if (builderElement == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
index 9f60db1..8ad0b4b 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_generic.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -19,9 +19,8 @@
if (node is! ListLiteral) {
return;
}
- if ((node as ListLiteral).elements.any((CollectionElement exp) =>
- !(exp is InstanceCreationExpression &&
- Flutter.isWidgetCreation(exp)))) {
+ if ((node as ListLiteral).elements.any((CollectionElement element) =>
+ !(element is InstanceCreationExpression && element.isWidgetCreation))) {
return;
}
var literalSrc = utils.getNodeText(node);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
index d0991c7..36fbcfa 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -16,19 +16,17 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var widgetExpr = Flutter.identifyWidgetExpression(node);
+ var widgetExpr = node.findWidgetExpression;
if (widgetExpr == null) {
return;
}
- if (Flutter.isExactWidgetTypeStreamBuilder(widgetExpr.typeOrThrow)) {
+ if (widgetExpr.typeOrThrow.isExactWidgetTypeStreamBuilder) {
return;
}
var widgetSrc = utils.getNodeText(widgetExpr);
- var streamBuilderElement = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'StreamBuilder',
- );
+ var streamBuilderElement =
+ await sessionHelper.getFlutterClass('StreamBuilder');
if (streamBuilderElement == null) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
index d215522..b81bcc3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -39,7 +39,7 @@
var creationExpression = childProp.parent?.parent;
if (creationExpression is! InstanceCreationExpression ||
- !Flutter.isWidgetCreation(creationExpression)) {
+ !creationExpression.isWidgetCreation) {
return;
}
@@ -96,7 +96,7 @@
return node;
}
}
- return Flutter.findNamedExpression(node, 'child') ??
- Flutter.findNamedExpression(node, 'children');
+ return node.findArgumentNamed('child') ??
+ node.findArgumentNamed('children');
}
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
index 42fe533..174b340 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/source/source_range.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
@@ -238,10 +238,9 @@
@override
Future<void> compute(ChangeBuilder builder) async {
- var classDeclaration =
- node.parent?.thisOrAncestorOfType<ClassDeclaration>();
- if (classDeclaration != null &&
- Flutter.isState(classDeclaration.declaredElement)) {
+ var classElement =
+ node.parent?.thisOrAncestorOfType<ClassDeclaration>()?.declaredElement;
+ if (classElement != null && classElement.isState) {
await builder.addDartFileEdit(file, (builder) {
builder.addReplacement(statementsRange, (builder) {
builder.write(indentOld);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
index e139fc7..ba37034 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
@@ -4,7 +4,7 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -25,7 +25,7 @@
if (context == null) {
return;
}
- if (!Flutter.isWidgetType(context.parameterElement.type)) {
+ if (!context.parameterElement.type.isWidgetType) {
return;
}
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index a708fc3..22eac1f 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/protocol_server.dart' as protocol;
import 'package:analysis_server/src/services/flutter/class_description.dart';
import 'package:analysis_server/src/services/flutter/property.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -147,7 +147,7 @@
if (node == null) {
return null;
}
- var instanceCreation = Flutter.identifyNewExpression(node);
+ var instanceCreation = node.findInstanceCreationExpression;
if (instanceCreation == null) {
return null;
}
@@ -173,7 +173,7 @@
List<PropertyDescription> properties,
InstanceCreationExpression widgetCreation,
) {
- if (!Flutter.isWidgetCreation(widgetCreation)) {
+ if (!widgetCreation.isWidgetCreation) {
return;
}
@@ -190,7 +190,7 @@
}
PropertyDescription containerProperty;
- if (Flutter.isExactlyContainerCreation(parentCreation)) {
+ if (parentCreation?.isExactlyContainerCreation ?? false) {
containerProperty = PropertyDescription(
resolvedUnit: resolvedUnit,
instanceCreation: parentCreation,
@@ -241,7 +241,7 @@
);
if (parentCreation != null &&
- Flutter.isExactlyAlignCreation(parentCreation) &&
+ parentCreation.isExactlyAlignCreation &&
parentCreation.argumentList.byName('widthFactor') == null &&
parentCreation.argumentList.byName('heightFactor') == null) {
_replaceNestedContainerProperty(
@@ -251,8 +251,7 @@
);
}
- if (parentCreation != null &&
- Flutter.isExactlyPaddingCreation(parentCreation)) {
+ if (parentCreation != null && parentCreation.isExactlyPaddingCreation) {
_replaceNestedContainerProperty(
containerProperty,
parentCreation,
@@ -373,7 +372,7 @@
var classEdgeInsets = _classEdgeInsets;
if (classEdgeInsets != null &&
- Flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
+ parameter.type.isExactEdgeInsetsGeometryType) {
propertyDescription.addEdgeInsetsNestedProperties(classEdgeInsets);
} else if (valueExpression is InstanceCreationExpression) {
var type = valueExpression.staticType;
@@ -420,22 +419,11 @@
Future<void> _fetchClassElements() async {
var sessionHelper = AnalysisSessionHelper(resolvedUnit.session);
- _classAlignment = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'Alignment',
- );
- _classAlignmentDirectional = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'AlignmentDirectional',
- );
- _classContainer = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'Container',
- );
- _classEdgeInsets = await sessionHelper.getClass(
- Flutter.widgetsUri,
- 'EdgeInsets',
- );
+ _classAlignment = await sessionHelper.getFlutterClass('Alignment');
+ _classAlignmentDirectional =
+ await sessionHelper.getFlutterClass('AlignmentDirectional');
+ _classContainer = await sessionHelper.getFlutterClass('Container');
+ _classEdgeInsets = await sessionHelper.getFlutterClass('EdgeInsets');
}
protocol.FlutterWidgetPropertyEditor? _getEditor(DartType type) {
@@ -467,7 +455,7 @@
enumItems: _enumItemsForEnum(classElement),
);
}
- if (Flutter.isExactAlignmentGeometry(classElement)) {
+ if (classElement.isExactAlignmentGeometry) {
var items = <protocol.FlutterWidgetPropertyValueEnumItem>[];
var classAlignment = _classAlignment;
if (classAlignment != null) {
@@ -546,8 +534,8 @@
if (field is FieldElement && field.isStatic) {
var enclosingClass = field.enclosingElement as InterfaceElement;
if (field.isEnumConstant ||
- Flutter.isExactAlignment(enclosingClass) ||
- Flutter.isExactAlignmentDirectional(enclosingClass)) {
+ enclosingClass.isExactAlignment ||
+ enclosingClass.isExactAlignmentDirectional) {
return protocol.FlutterWidgetPropertyValue(
enumValue: _toEnumItem(field),
);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
index 2a629f0..01ce4dd 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
@@ -10,7 +10,7 @@
import 'package:analysis_server/src/services/refactoring/legacy/refactoring_internal.dart';
import 'package:analysis_server/src/services/search/element_visitors.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
@@ -183,9 +183,9 @@
_enclosingClassNode = node?.thisOrAncestorOfType<ClassDeclaration>();
_enclosingClassElement = _enclosingClassNode?.declaredElement;
- // new MyWidget(...)
- var newExpression = Flutter.identifyNewExpression(node);
- if (Flutter.isWidgetCreation(newExpression)) {
+ // `new MyWidget(...)`
+ var newExpression = node.findInstanceCreationExpression;
+ if (newExpression?.isWidgetCreation ?? false) {
_expression = newExpression;
return RefactoringStatus();
}
@@ -203,7 +203,7 @@
if (statements.isNotEmpty) {
var lastStatement = statements.last;
if (lastStatement is ReturnStatement &&
- Flutter.isWidgetExpression(lastStatement.expression)) {
+ lastStatement.expression.isWidgetExpression) {
_statements = statements;
_statementsRange = range.startEnd(statements.first, statements.last);
return RefactoringStatus();
@@ -221,7 +221,7 @@
}
if (node is MethodDeclaration) {
var returnType = node.returnType?.type;
- if (Flutter.isWidgetType(returnType)) {
+ if (returnType.isWidgetType) {
_method = node;
return RefactoringStatus();
}
@@ -238,11 +238,9 @@
var result = RefactoringStatus();
Future<ClassElement?> getClass(String name) async {
- var element = await sessionHelper.getClass(Flutter.widgetsUri, name);
+ var element = await sessionHelper.getFlutterClass(name);
if (element == null) {
- result.addFatalError(
- "Unable to find '$name' in ${Flutter.widgetsUri}",
- );
+ result.addFatalError("Unable to find '$name' in $widgetsUri");
}
return element;
}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_unit_member.dart
index 06b8ed0..4bf10c5 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_unit_member.dart
@@ -11,7 +11,7 @@
import 'package:analysis_server/src/services/refactoring/legacy/rename.dart';
import 'package:analysis_server/src/services/search/element_visitors.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart' show Identifier;
import 'package:analyzer/dart/element/element.dart';
@@ -152,9 +152,10 @@
}
void _findFlutterStateClass() {
- if (Flutter.isStatefulWidgetDeclaration(element)) {
+ final element = this.element;
+ if (element is ClassElement && element.isStatefulWidgetDeclaration) {
var oldStateName = '${oldName}State';
- var library = element.library!;
+ var library = element.library;
_flutterWidgetState =
library.getClass(oldStateName) ?? library.getClass('_$oldStateName');
}
diff --git a/pkg/analysis_server/lib/src/services/snippets/snippet_producer.dart b/pkg/analysis_server/lib/src/services/snippets/snippet_producer.dart
index 5e01cbf..0e697ad 100644
--- a/pkg/analysis_server/lib/src/services/snippets/snippet_producer.dart
+++ b/pkg/analysis_server/lib/src/services/snippets/snippet_producer.dart
@@ -5,7 +5,7 @@
import 'package:analysis_server/src/services/correction/util.dart';
import 'package:analysis_server/src/services/snippets/dart_snippet_request.dart';
import 'package:analysis_server/src/services/snippets/snippet.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/code_style_options.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -72,7 +72,7 @@
FlutterSnippetProducer(super.request, {required super.elementImportCache});
Future<ClassElement?> getClass(String name) async {
- final class_ = await sessionHelper.getClass(Flutter.widgetsUri, name);
+ final class_ = await sessionHelper.getFlutterClass(name);
if (class_ != null) {
requiredElementImports.add(class_);
}
@@ -80,7 +80,7 @@
}
Future<MixinElement?> getMixin(String name) async {
- final mixin = await sessionHelper.getMixin(Flutter.widgetsUri, name);
+ final mixin = await sessionHelper.getMixin(widgetsUri, name);
if (mixin != null) {
requiredElementImports.add(mixin);
}
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/flutter.dart b/pkg/analysis_server/lib/src/utilities/extensions/flutter.dart
new file mode 100644
index 0000000..bea0d5d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/extensions/flutter.dart
@@ -0,0 +1,437 @@
+// Copyright (c) 2017, 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:analysis_server/src/utilities/strings.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:collection/collection.dart';
+
+const String widgetsUri = 'package:flutter/widgets.dart';
+const _nameAlign = 'Align';
+const _nameBuilder = 'Builder';
+const _nameCenter = 'Center';
+const _nameContainer = 'Container';
+const _namePadding = 'Padding';
+const _nameSizedBox = 'SizedBox';
+const _nameState = 'State';
+const _nameStatefulWidget = 'StatefulWidget';
+const _nameStatelessWidget = 'StatelessWidget';
+const _nameStreamBuilder = 'StreamBuilder';
+
+const _nameWidget = 'Widget';
+final Uri _uriAlignment = Uri.parse(
+ 'package:flutter/src/painting/alignment.dart',
+);
+final Uri _uriAsync = Uri.parse(
+ 'package:flutter/src/widgets/async.dart',
+);
+final Uri _uriBasic = Uri.parse(
+ 'package:flutter/src/widgets/basic.dart',
+);
+final Uri _uriContainer = Uri.parse(
+ 'package:flutter/src/widgets/container.dart',
+);
+final Uri _uriDiagnostics = Uri.parse(
+ 'package:flutter/src/foundation/diagnostics.dart',
+);
+final Uri _uriEdgeInsets = Uri.parse(
+ 'package:flutter/src/painting/edge_insets.dart',
+);
+final Uri _uriFramework = Uri.parse(
+ 'package:flutter/src/widgets/framework.dart',
+);
+final Uri _uriWidgetsIcon = Uri.parse(
+ 'package:flutter/src/widgets/icon.dart',
+);
+
+final Uri _uriWidgetsText = Uri.parse(
+ 'package:flutter/src/widgets/text.dart',
+);
+
+extension AstNodeExtension on AstNode? {
+ /// Returns the instance creation expression that surrounds this node, if any,
+ /// and otherwise `null`.
+ ///
+ /// This node may be the instance creation expression itself or an (optionally
+ /// prefixed) identifier that names the constructor.
+ InstanceCreationExpression? get findInstanceCreationExpression {
+ var node = this;
+ if (node is ImportPrefixReference) {
+ node = node.parent;
+ }
+ if (node is SimpleIdentifier) {
+ node = node.parent;
+ }
+ if (node is PrefixedIdentifier) {
+ node = node.parent;
+ }
+ if (node is NamedType) {
+ node = node.parent;
+ }
+ if (node is ConstructorName) {
+ node = node.parent;
+ }
+ if (node is InstanceCreationExpression) {
+ return node;
+ }
+ return null;
+ }
+
+ /// Attempts to find and return the closest expression that encloses this
+ /// and is an independent Flutter `Widget`.
+ ///
+ /// Returns `null` if nothing is found.
+ Expression? get findWidgetExpression {
+ for (var node = this; node != null; node = node.parent) {
+ if (!node.isWidgetExpression) {
+ if (node is ArgumentList || node is Statement || node is FunctionBody) {
+ return null;
+ }
+ continue;
+ }
+
+ if (node is AssignmentExpression) {
+ return null;
+ }
+
+ var parent = node.parent;
+
+ if (parent is AssignmentExpression) {
+ if (parent.rightHandSide == node) {
+ return node as Expression;
+ }
+ return null;
+ }
+
+ if (parent is ArgumentList ||
+ parent is ConditionalExpression && parent.thenExpression == node ||
+ parent is ConditionalExpression && parent.elseExpression == node ||
+ parent is ExpressionFunctionBody && parent.expression == node ||
+ parent is ForElement && parent.body == node ||
+ parent is IfElement && parent.thenElement == node ||
+ parent is IfElement && parent.elseElement == node ||
+ parent is ListLiteral ||
+ parent is NamedExpression && parent.expression == node ||
+ parent is Statement ||
+ parent is SwitchExpressionCase && parent.expression == node ||
+ parent is VariableDeclaration) {
+ return node as Expression;
+ }
+ }
+ return null;
+ }
+
+ /// Whether the given [node] is the Flutter class `Widget`, or its subtype.
+ bool get isWidgetExpression {
+ return switch (this) {
+ null => false,
+ AstNode(parent: NamedType()) ||
+ AstNode(parent: AstNode(parent: NamedType())) =>
+ false,
+ AstNode(parent: ConstructorName()) => false,
+ NamedExpression() => false,
+ Expression(:var staticType) => staticType.isWidgetType,
+ _ => false,
+ };
+ }
+
+ /// Finds the named expression whose name is the given [name] that is an
+ /// argument to a Flutter instance creation expression.
+ ///
+ /// Returns `null` if this is not a [SimpleIdentifier], or if any other
+ /// condition cannot be satisfied.
+ NamedExpression? findArgumentNamed(String name) {
+ var self = this;
+ if (self is! SimpleIdentifier) {
+ return null;
+ }
+ var parent = self.parent;
+ var grandParent = parent?.parent;
+ if (parent is Label && grandParent is NamedExpression) {
+ if (self.name != name) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ var invocation = grandParent.parent?.parent;
+ if (invocation is! InstanceCreationExpression ||
+ !invocation.isWidgetCreation) {
+ return null;
+ }
+ return grandParent;
+ }
+}
+
+extension ClassElementExtension on ClassElement {
+ /// Whether this is the Flutter class `State`.
+ bool get isExactState => _isExactly(_nameState, _uriFramework);
+
+ /// Whether this has the Flutter class `State` as a superclass.
+ bool get isState => _hasSupertype(_uriFramework, _nameState);
+
+ /// Whether this is a [ClassElement] that extends the Flutter class
+ /// `StatefulWidget`.
+ bool get isStatefulWidgetDeclaration => supertype.isExactlyStatefulWidgetType;
+}
+
+extension DartTypeExtension on DartType? {
+ /// Whether this is the 'dart.ui' class `Color`, or a subtype.
+ bool get isColor {
+ var self = this;
+ if (self is! InterfaceType) {
+ return false;
+ }
+
+ return [self, ...self.element.allSupertypes].any((t) =>
+ t.element.name == 'Color' && t.element.library.name == 'dart.ui');
+ }
+
+ /// Whether this is the Flutter mixin `Diagnosticable` or a subtype.
+ bool get isDiagnosticable {
+ var self = this;
+ if (self is! InterfaceType) {
+ return false;
+ }
+
+ return [self, ...self.element.allSupertypes].any((t) =>
+ t.element.name == 'Diagnosticable' &&
+ t.element.source.uri == _uriDiagnostics);
+ }
+
+ /// Whether this is the Flutter type `EdgeInsetsGeometry`.
+ bool get isExactEdgeInsetsGeometryType {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly('EdgeInsetsGeometry', _uriEdgeInsets);
+ }
+
+ /// Whether this is the Flutter class `StatefulWidget`.
+ bool get isExactlyStatefulWidgetType {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameStatefulWidget, _uriFramework);
+ }
+
+ /// Whether this is the Flutter class `StatelessWidget`.
+ bool get isExactlyStatelessWidgetType {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameStatelessWidget, _uriFramework);
+ }
+
+ /// Whether this is the Flutter class `Align`.
+ bool get isExactWidgetTypeAlign {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameAlign, _uriBasic);
+ }
+
+ /// Whether this is the Flutter class `StreamBuilder`.
+ bool get isExactWidgetTypeBuilder {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameBuilder, _uriBasic);
+ }
+
+ /// Whether this is the Flutter class `Center`.
+ bool get isExactWidgetTypeCenter {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameCenter, _uriBasic);
+ }
+
+ /// Whether this is the Flutter class `Container`.
+ bool get isExactWidgetTypeContainer {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameContainer, _uriContainer);
+ }
+
+ /// Whether this is the Flutter class `Padding`.
+ bool get isExactWidgetTypePadding {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_namePadding, _uriBasic);
+ }
+
+ /// Whether this is the Flutter class `SizedBox`.
+ bool get isExactWidgetTypeSizedBox {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameSizedBox, _uriBasic);
+ }
+
+ /// Whether this is the Flutter class `StreamBuilder`.
+ bool get isExactWidgetTypeStreamBuilder {
+ var self = this;
+ return self is InterfaceType &&
+ self.element._isExactly(_nameStreamBuilder, _uriAsync);
+ }
+
+ /// Whether this is the Flutter class `Widget`, or its subtype.
+ bool get isListOfWidgetsType {
+ var self = this;
+ return self is InterfaceType &&
+ self.isDartCoreList &&
+ self.typeArguments[0].isWidgetType;
+ }
+
+ /// Whether this is the vector_math_64 class `Matrix4`, or its
+ /// subtype.
+ bool get isMatrix4 {
+ var self = this;
+ if (self is! InterfaceType) {
+ return false;
+ }
+
+ return [self, ...self.element.allSupertypes].any((t) =>
+ t.element.name == 'Matrix4' &&
+ t.element.library.name == 'vector_math_64');
+ }
+
+ /// Whether this is the Flutter class `Widget`, or its subtype.
+ bool get isWidgetType {
+ var self = this;
+ return self is InterfaceType && self.element.isWidget;
+ }
+}
+
+extension ExpressionExtension on Expression {
+ /// Whether this is the `builder` argument.
+ bool get isBuilderArgument {
+ var self = this;
+ return self is NamedExpression && self.name.label.name == 'builder';
+ }
+
+ /// Whether this is the `child` argument.
+ bool get isChildArgument {
+ var self = this;
+ return self is NamedExpression && self.name.label.name == 'child';
+ }
+
+ /// Whether this is the `children` argument.
+ bool get isChildrenArgument {
+ var self = this;
+ return self is NamedExpression && self.name.label.name == 'children';
+ }
+}
+
+extension InstanceCreationExpressionExtension on InstanceCreationExpression {
+ /// The named expression representing the `builder` argument, or `null` if
+ /// there is none.
+ NamedExpression? get builderArgument => argumentList.arguments
+ .whereType<NamedExpression>()
+ .firstWhereOrNull((argument) => argument.isBuilderArgument);
+
+ /// The named expression representing the `child` argument, or `null` if there
+ /// is none.
+ NamedExpression? get childArgument => argumentList.arguments
+ .whereType<NamedExpression>()
+ .firstWhereOrNull((argument) => argument.isChildArgument);
+
+ /// The named expression representing the `children` argument, or `null` if
+ /// there is none.
+ NamedExpression? get childrenArgument => argumentList.arguments
+ .whereType<NamedExpression>()
+ .firstWhereOrNull((argument) => argument.isChildrenArgument);
+
+ bool get isExactlyAlignCreation => staticType.isExactWidgetTypeAlign;
+
+ bool get isExactlyContainerCreation => staticType.isExactWidgetTypeContainer;
+
+ bool get isExactlyPaddingCreation => staticType.isExactWidgetTypePadding;
+
+ /// Whether this is a constructor invocation for a class that has the Flutter
+ /// class `Widget` as a superclass.
+ bool get isWidgetCreation {
+ var element =
+ constructorName.staticElement?.enclosingElement.augmented.declaration;
+ return element.isWidget;
+ }
+
+ /// The presentation for this node.
+ String? get widgetPresentationText {
+ var element =
+ constructorName.staticElement?.enclosingElement.augmented.declaration;
+ if (!element.isWidget) {
+ return null;
+ }
+ var arguments = argumentList.arguments;
+ if (element._isExactly('Icon', _uriWidgetsIcon)) {
+ if (arguments.isNotEmpty) {
+ var text = arguments[0].toString();
+ var arg = shorten(text, 32);
+ return 'Icon($arg)';
+ } else {
+ return 'Icon';
+ }
+ }
+ if (element._isExactly('Text', _uriWidgetsText)) {
+ if (arguments.isNotEmpty) {
+ var text = arguments[0].toString();
+ var arg = shorten(text, 32);
+ return 'Text($arg)';
+ } else {
+ return 'Text';
+ }
+ }
+ return element?.name;
+ }
+}
+
+extension InterfaceElementExtension on InterfaceElement? {
+ /// Whether this is the Flutter class `Alignment`.
+ bool get isExactAlignment {
+ return _isExactly('Alignment', _uriAlignment);
+ }
+
+ /// Whether this is the Flutter class `AlignmentDirectional`.
+ bool get isExactAlignmentDirectional {
+ return _isExactly('AlignmentDirectional', _uriAlignment);
+ }
+
+ /// Whether this is the Flutter class `AlignmentGeometry`.
+ bool get isExactAlignmentGeometry {
+ return _isExactly('AlignmentGeometry', _uriAlignment);
+ }
+
+ /// Whether this is the Flutter class `Widget`, or a subtype.
+ bool get isWidget {
+ var self = this;
+ if (self is! ClassElement) {
+ return false;
+ }
+ if (_isExactly(_nameWidget, _uriFramework)) {
+ return true;
+ }
+ return self.allSupertypes
+ .any((type) => type.element._isExactly(_nameWidget, _uriFramework));
+ }
+
+ /// Whether this has a supertype with the [requiredName] defined in the file
+ /// with the [requiredUri].
+ bool _hasSupertype(Uri requiredUri, String requiredName) {
+ var self = this;
+ if (self == null) {
+ return false;
+ }
+ for (var type in self.allSupertypes) {
+ if (type.element.name == requiredName) {
+ var uri = type.element.source.uri;
+ if (uri == requiredUri) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /// Whether this is the exact [type] defined in the file with the given [uri].
+ bool _isExactly(String type, Uri uri) {
+ var self = this;
+ return self is ClassElement && self.name == type && self.source.uri == uri;
+ }
+}
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
deleted file mode 100644
index 49b9760..0000000
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ /dev/null
@@ -1,488 +0,0 @@
-// Copyright (c) 2017, 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:analysis_server/src/utilities/strings.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
-import 'package:collection/collection.dart';
-
-abstract final class Flutter {
- static const _nameAlign = 'Align';
- static const _nameBuilder = 'Builder';
- static const _nameCenter = 'Center';
- static const _nameContainer = 'Container';
- static const _namePadding = 'Padding';
- static const _nameSizedBox = 'SizedBox';
- static const _nameState = 'State';
- static const _nameStatefulWidget = 'StatefulWidget';
- static const _nameStatelessWidget = 'StatelessWidget';
- static const _nameStreamBuilder = 'StreamBuilder';
- static const _nameWidget = 'Widget';
-
- static final String widgetsUri = 'package:flutter/widgets.dart';
-
- static final Uri _uriAlignment = Uri.parse(
- 'package:flutter/src/painting/alignment.dart',
- );
- static final Uri _uriAsync = Uri.parse(
- 'package:flutter/src/widgets/async.dart',
- );
- static final Uri _uriBasic = Uri.parse(
- 'package:flutter/src/widgets/basic.dart',
- );
- static final Uri _uriContainer = Uri.parse(
- 'package:flutter/src/widgets/container.dart',
- );
- static final Uri _uriDiagnostics = Uri.parse(
- 'package:flutter/src/foundation/diagnostics.dart',
- );
- static final Uri _uriEdgeInsets = Uri.parse(
- 'package:flutter/src/painting/edge_insets.dart',
- );
- static final Uri _uriFramework = Uri.parse(
- 'package:flutter/src/widgets/framework.dart',
- );
- static final Uri _uriWidgetsIcon = Uri.parse(
- 'package:flutter/src/widgets/icon.dart',
- );
- static final Uri _uriWidgetsText = Uri.parse(
- 'package:flutter/src/widgets/text.dart',
- );
-
- static void convertChildToChildren2(
- DartFileEditBuilder builder,
- Expression childArg,
- NamedExpression namedExp,
- String eol,
- String Function(Expression) getNodeText,
- String Function(int) getLinePrefix,
- String oneIndent,
- String Function(int, int) getText,
- String Function(String, String, String,
- {bool includeLeading, bool ensureTrailingNewline})
- replaceSourceIndent,
- SourceRange Function(Expression) rangeNode) {
- var childLoc = namedExp.offset + 'child'.length;
- builder.addSimpleInsertion(childLoc, 'ren');
- var listLoc = childArg.offset;
- var childArgSrc = getNodeText(childArg);
- if (!childArgSrc.contains(eol)) {
- builder.addSimpleInsertion(listLoc, '[');
- builder.addSimpleInsertion(listLoc + childArg.length, ']');
- } else {
- var newlineLoc = childArgSrc.lastIndexOf(eol);
- if (newlineLoc == childArgSrc.length) {
- newlineLoc -= 1;
- }
- var indentOld = getLinePrefix(childArg.offset + eol.length + newlineLoc);
- var indentNew = '$indentOld$oneIndent';
- // The separator includes 'child:' but that has no newlines.
- var separator =
- getText(namedExp.offset, childArg.offset - namedExp.offset);
- var prefix = separator.contains(eol) ? '' : '$eol$indentNew';
- if (prefix.isEmpty) {
- builder.addSimpleInsertion(namedExp.offset + 'child:'.length, ' [');
- builder.addDeletion(SourceRange(childArg.offset - 2, 2));
- } else {
- builder.addSimpleInsertion(listLoc, '[');
- }
- var newChildArgSrc = replaceSourceIndent(
- childArgSrc,
- indentOld,
- indentNew,
- );
- newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
- builder.addSimpleReplacement(rangeNode(childArg), newChildArgSrc);
- }
- }
-
- /// Returns the named expression representing the `builder` argument of the
- /// given [newExpr], or `null` if none.
- static NamedExpression? findBuilderArgument(
- InstanceCreationExpression newExpr) =>
- newExpr.argumentList.arguments
- .whereType<NamedExpression>()
- .firstWhereOrNull((argument) => isBuilderArgument(argument));
-
- /// Returns the named expression representing the `child` argument of the
- /// given [newExpr], or `null` if none.
- static NamedExpression? findChildArgument(
- InstanceCreationExpression newExpr) =>
- newExpr.argumentList.arguments
- .whereType<NamedExpression>()
- .firstWhereOrNull((argument) => isChildArgument(argument));
-
- /// Returns the named expression representing the `children` argument of the
- /// given [newExpr], or `null` if none.
- static NamedExpression? findChildrenArgument(
- InstanceCreationExpression newExpr) =>
- newExpr.argumentList.arguments
- .whereType<NamedExpression>()
- .firstWhereOrNull((argument) => isChildrenArgument(argument));
-
- /// Returns the Flutter instance creation expression that is the value of the
- /// 'child' argument of the given [newExpr], or `null` if none.
- static InstanceCreationExpression? findChildWidget(
- InstanceCreationExpression newExpr) {
- var child = findChildArgument(newExpr);
- var widget = getChildWidget(child);
- if (widget is InstanceCreationExpression) {
- return widget;
- }
- return null;
- }
-
- /// If the given [node] is a simple identifier, finds the named expression
- /// whose name is the given [name] that is an argument to a Flutter instance
- /// creation expression.
- ///
- /// Returns `null` if any condition cannot be satisfied.
- static NamedExpression? findNamedExpression(AstNode node, String name) {
- if (node is! SimpleIdentifier) {
- return null;
- }
- var parent = node.parent;
- var grandParent = parent?.parent;
- if (parent is Label && grandParent is NamedExpression) {
- if (node.name != name) {
- return null;
- }
- } else {
- return null;
- }
- var invocation = grandParent.parent?.parent;
- if (invocation is! InstanceCreationExpression ||
- !isWidgetCreation(invocation)) {
- return null;
- }
- return grandParent;
- }
-
- /// Returns the expression that is a Flutter Widget that is the value of the
- /// given [child], or `null` if none.
- static Expression? getChildWidget(NamedExpression? child) {
- var expression = child?.expression;
- if (isWidgetExpression(expression)) {
- return expression;
- }
- return null;
- }
-
- /// Returns the presentation for the given Flutter `Widget` creation [node].
- static String? getWidgetPresentationText(InstanceCreationExpression node) {
- var element = node
- .constructorName.staticElement?.enclosingElement.augmented.declaration;
- if (!isWidget(element)) {
- return null;
- }
- var arguments = node.argumentList.arguments;
- if (_isExactWidget(element, 'Icon', _uriWidgetsIcon)) {
- if (arguments.isNotEmpty) {
- var text = arguments[0].toString();
- var arg = shorten(text, 32);
- return 'Icon($arg)';
- } else {
- return 'Icon';
- }
- }
- if (_isExactWidget(element, 'Text', _uriWidgetsText)) {
- if (arguments.isNotEmpty) {
- var text = arguments[0].toString();
- var arg = shorten(text, 32);
- return 'Text($arg)';
- } else {
- return 'Text';
- }
- }
- return element?.name;
- }
-
- /// Returns the instance creation expression that surrounds the given
- /// [node], if any, else null.
- ///
- /// The [node] may be the instance creation expression itself or an
- /// (optionally prefixed) identifier that names the constructor.
- static InstanceCreationExpression? identifyNewExpression(AstNode? node) {
- InstanceCreationExpression? newExpr;
- if (node is ImportPrefixReference) {
- node = node.parent;
- }
- if (node is SimpleIdentifier) {
- node = node.parent;
- }
- if (node is PrefixedIdentifier) {
- node = node.parent;
- }
- if (node is NamedType) {
- node = node.parent;
- }
- if (node is ConstructorName) {
- node = node.parent;
- }
- if (node is InstanceCreationExpression) {
- newExpr = node;
- }
- return newExpr;
- }
-
- /// Attempts to find and return the closest expression that encloses the [node]
- /// and is an independent Flutter `Widget`.
- ///
- /// Returns `null` if nothing is found.
- static Expression? identifyWidgetExpression(AstNode? node) {
- for (; node != null; node = node.parent) {
- if (isWidgetExpression(node)) {
- var parent = node.parent;
-
- if (node is AssignmentExpression) {
- return null;
- }
- if (parent is AssignmentExpression) {
- if (parent.rightHandSide == node) {
- return node as Expression;
- }
- return null;
- }
-
- if (parent is ArgumentList ||
- parent is ConditionalExpression && parent.thenExpression == node ||
- parent is ConditionalExpression && parent.elseExpression == node ||
- parent is ExpressionFunctionBody && parent.expression == node ||
- parent is ForElement && parent.body == node ||
- parent is IfElement && parent.thenElement == node ||
- parent is IfElement && parent.elseElement == node ||
- parent is ListLiteral ||
- parent is NamedExpression && parent.expression == node ||
- parent is Statement ||
- parent is SwitchExpressionCase && parent.expression == node ||
- parent is VariableDeclaration) {
- return node as Expression;
- }
- }
- if (node is ArgumentList || node is Statement || node is FunctionBody) {
- return null;
- }
- }
- return null;
- }
-
- /// Whether the given [argument] is the `builder` argument.
- static bool isBuilderArgument(Expression argument) =>
- argument is NamedExpression && argument.name.label.name == 'builder';
-
- /// Whether the given [argument] is the `child` argument.
- static bool isChildArgument(Expression argument) =>
- argument is NamedExpression && argument.name.label.name == 'child';
-
- /// Whether the given [argument] is the `child` argument.
- static bool isChildrenArgument(Expression argument) =>
- argument is NamedExpression && argument.name.label.name == 'children';
-
- /// Whether the given [type] is the 'dart.ui' class `Color`, or its subtype.
- static bool isColor(DartType? type) {
- if (type is! InterfaceType) {
- return false;
- }
-
- return [type, ...type.element.allSupertypes].any((t) =>
- t.element.name == 'Color' && t.element.library.name == 'dart.ui');
- }
-
- /// Whether the given [type] is the flutter mixin `Diagnosticable` or its
- /// subtype.
- static bool isDiagnosticable(DartType? type) {
- if (type is! InterfaceType) {
- return false;
- }
-
- return [type, ...type.element.allSupertypes].any((t) =>
- t.element.name == 'Diagnosticable' &&
- t.element.source.uri == _uriDiagnostics);
- }
-
- /// Whether the [element] is the Flutter class `Alignment`.
- static bool isExactAlignment(InterfaceElement element) {
- return _isExactWidget(element, 'Alignment', _uriAlignment);
- }
-
- /// Whether if the [element] is the Flutter class
- /// `AlignmentDirectional`.
- static bool isExactAlignmentDirectional(InterfaceElement element) {
- return _isExactWidget(element, 'AlignmentDirectional', _uriAlignment);
- }
-
- /// Whether if the [element] is the Flutter class `AlignmentGeometry`.
- static bool isExactAlignmentGeometry(InterfaceElement element) {
- return _isExactWidget(element, 'AlignmentGeometry', _uriAlignment);
- }
-
- /// Whether the [type] is the Flutter type `EdgeInsetsGeometry`.
- static bool isExactEdgeInsetsGeometryType(DartType type) {
- return type is InterfaceType &&
- _isExactWidget(type.element, 'EdgeInsetsGeometry', _uriEdgeInsets);
- }
-
- /// Whether the [node] is creation of `Align`.
- static bool isExactlyAlignCreation(InstanceCreationExpression node) =>
- isExactWidgetTypeAlign(node.staticType);
-
- /// Whether the [node] is creation of `Container`.
- static bool isExactlyContainerCreation(InstanceCreationExpression? node) =>
- isExactWidgetTypeContainer(node?.staticType);
-
- /// Whether the [node] is creation of `Padding`.
- static bool isExactlyPaddingCreation(InstanceCreationExpression node) =>
- isExactWidgetTypePadding(node.staticType);
-
- /// Whether the given [type] is the Flutter class `StatefulWidget`.
- static bool isExactlyStatefulWidgetType(DartType? type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameStatefulWidget, _uriFramework);
-
- /// Whether the given [type] is the Flutter class `StatelessWidget`.
- static bool isExactlyStatelessWidgetType(DartType type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameStatelessWidget, _uriFramework);
-
- /// Whether the given [element] is the Flutter class `State`.
- static bool isExactState(ClassElement element) =>
- _isExactWidget(element, _nameState, _uriFramework);
-
- /// Whether the given [type] is the Flutter class `Align`.
- static bool isExactWidgetTypeAlign(DartType? type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameAlign, _uriBasic);
-
- /// Whether the given [type] is the Flutter class `StreamBuilder`.
- static bool isExactWidgetTypeBuilder(DartType type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameBuilder, _uriBasic);
-
- /// Whether the given [type] is the Flutter class `Center`.
- static bool isExactWidgetTypeCenter(DartType type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameCenter, _uriBasic);
-
- /// Whether the given [type] is the Flutter class `Container`.
- static bool isExactWidgetTypeContainer(DartType? type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameContainer, _uriContainer);
-
- /// Whether the given [type] is the Flutter class `Padding`.
- static bool isExactWidgetTypePadding(DartType? type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _namePadding, _uriBasic);
-
- /// Whether the given [type] is the Flutter class `SizedBox`.
- static bool isExactWidgetTypeSizedBox(DartType type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameSizedBox, _uriBasic);
-
- /// Whether the given [type] is the Flutter class `StreamBuilder`.
- static bool isExactWidgetTypeStreamBuilder(DartType type) =>
- type is InterfaceType &&
- _isExactWidget(type.element, _nameStreamBuilder, _uriAsync);
-
- /// Whether the given [type] is the Flutter class `Widget`, or its subtype.
- static bool isListOfWidgetsType(DartType type) =>
- type is InterfaceType &&
- type.isDartCoreList &&
- isWidgetType(type.typeArguments[0]);
-
- /// Whether the given [type] is the vector_math_64 class `Matrix4`, or its
- /// subtype.
- static bool isMatrix4(DartType type) {
- if (type is! InterfaceType) {
- return false;
- }
-
- return [type, ...type.element.allSupertypes].any((t) =>
- t.element.name == 'Matrix4' &&
- t.element.library.name == 'vector_math_64');
- }
-
- /// Whether the given [element] has the Flutter class `State` as
- /// a superclass.
- static bool isState(ClassElement? element) =>
- _hasSupertype(element, _uriFramework, _nameState);
-
- /// Whether the given [element] is a [ClassElement] that extends the Flutter
- /// class `StatefulWidget`.
- static bool isStatefulWidgetDeclaration(Element element) =>
- element is ClassElement && isExactlyStatefulWidgetType(element.supertype);
-
- /// Whether the given [element] is the Flutter class `Widget`, or its
- /// subtype.
- static bool isWidget(InterfaceElement? element) {
- if (element is! ClassElement) {
- return false;
- }
- if (_isExactWidget(element, _nameWidget, _uriFramework)) {
- return true;
- }
- return element.allSupertypes.any(
- (type) => _isExactWidget(type.element, _nameWidget, _uriFramework));
- }
-
- /// Whether the given [expr] is a constructor invocation for a class that has
- /// the Flutter class `Widget` as a superclass.
- static bool isWidgetCreation(InstanceCreationExpression? expr) {
- var element = expr
- ?.constructorName.staticElement?.enclosingElement.augmented.declaration;
- return isWidget(element);
- }
-
- /// Whether the given [node] is the Flutter class `Widget`, or its subtype.
- static bool isWidgetExpression(AstNode? node) {
- if (node == null) {
- return false;
- }
- if (node.parent is NamedType || node.parent?.parent is NamedType) {
- return false;
- }
- if (node.parent is ConstructorName) {
- return false;
- }
- if (node is NamedExpression) {
- return false;
- }
- if (node is Expression) {
- return isWidgetType(node.staticType);
- }
- return false;
- }
-
- /// Whether the given [type] is the Flutter class `Widget`, or its subtype.
- static bool isWidgetType(DartType? type) =>
- type is InterfaceType && isWidget(type.element);
-
- /// Whether the given [element] has a supertype with the [requiredName]
- /// defined in the file with the [requiredUri].
- static bool _hasSupertype(
- InterfaceElement? element, Uri requiredUri, String requiredName) {
- if (element == null) {
- return false;
- }
- for (var type in element.allSupertypes) {
- if (type.element.name == requiredName) {
- var uri = type.element.source.uri;
- if (uri == requiredUri) {
- return true;
- }
- }
- }
- return false;
- }
-
- /// Whether the given [element] is the exact [type] defined in the file with
- /// the given [uri].
- static bool _isExactWidget(InterfaceElement? element, String type, Uri uri) =>
- element is ClassElement &&
- element.name == type &&
- element.source.uri == uri;
-}
diff --git a/pkg/analysis_server/test/lsp/flutter_outline_test.dart b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
index 569ee28..54df679 100644
--- a/pkg/analysis_server/test/lsp/flutter_outline_test.dart
+++ b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/lsp_protocol/protocol.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/src/test_utilities/test_code_format.dart';
import 'package:test/test.dart';
@@ -95,8 +95,8 @@
// Find the path to our mock 'package:flutter/widgets.dart'.
var driver = server.getAnalysisDriver(mainFilePath)!;
- var widgetsFilePath = driver.currentSession.uriConverter
- .uriToPath(Uri.parse(Flutter.widgetsUri))!;
+ var widgetsFilePath =
+ driver.currentSession.uriConverter.uriToPath(Uri.parse(widgetsUri))!;
var widgetsFileUri = Uri.file(widgetsFilePath);
// We have to provide content to open a file so just read it.
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 25f8053..978f2ca 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -2,7 +2,7 @@
// 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:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -25,76 +25,7 @@
);
}
- Future<void> test_getWidgetPresentationText_icon() async {
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = const Icon(Icons.book);
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), 'Icon(Icons.book)');
- }
-
- Future<void> test_getWidgetPresentationText_icon_withoutArguments() async {
- verifyNoTestUnitErrors = false;
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = const Icon();
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), 'Icon');
- }
-
- Future<void> test_getWidgetPresentationText_notWidget() async {
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = Object();
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), isNull);
- }
-
- Future<void> test_getWidgetPresentationText_text() async {
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = const Text('foo');
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), "Text('foo')");
- }
-
- Future<void> test_getWidgetPresentationText_text_longText() async {
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = const Text('${'abc' * 100}');
-''');
- var w = _getTopVariableCreation('w');
- expect(
- Flutter.getWidgetPresentationText(w),
- "Text('abcabcabcabcab...cabcabcabcabc')",
- );
- }
-
- Future<void> test_getWidgetPresentationText_text_withoutArguments() async {
- verifyNoTestUnitErrors = false;
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = const Text();
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), 'Text');
- }
-
- Future<void> test_getWidgetPresentationText_unresolved() async {
- verifyNoTestUnitErrors = false;
- await resolveTestCode('''
-import 'package:flutter/material.dart';
-var w = new Foo();
-''');
- var w = _getTopVariableCreation('w');
- expect(Flutter.getWidgetPresentationText(w), isNull);
- }
-
- Future<void> test_identifyWidgetExpression_node_instanceCreation() async {
+ Future<void> test_enclosingWidgetExpression_node_instanceCreation() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -120,14 +51,11 @@
var constructorName = creation.constructorName;
var namedType = constructorName.type;
var argumentList = creation.argumentList;
- expect(Flutter.identifyWidgetExpression(creation), creation);
- expect(Flutter.identifyWidgetExpression(constructorName), creation);
- expect(Flutter.identifyWidgetExpression(namedType), creation);
- expect(Flutter.identifyWidgetExpression(argumentList), isNull);
- expect(
- Flutter.identifyWidgetExpression(argumentList.arguments[0]),
- isNull,
- );
+ expect(creation.findWidgetExpression, creation);
+ expect(constructorName.findWidgetExpression, creation);
+ expect(namedType.findWidgetExpression, creation);
+ expect(argumentList.findWidgetExpression, isNull);
+ expect(argumentList.arguments[0].findWidgetExpression, isNull);
}
// MyWidget.named(5678);
@@ -137,19 +65,16 @@
var constructorName = creation.constructorName;
var namedType = constructorName.type;
var argumentList = creation.argumentList;
- expect(Flutter.identifyWidgetExpression(creation), creation);
- expect(Flutter.identifyWidgetExpression(constructorName), creation);
- expect(Flutter.identifyWidgetExpression(namedType), creation);
- expect(Flutter.identifyWidgetExpression(constructorName.name), creation);
- expect(Flutter.identifyWidgetExpression(argumentList), isNull);
- expect(
- Flutter.identifyWidgetExpression(argumentList.arguments[0]),
- isNull,
- );
+ expect(creation.findWidgetExpression, creation);
+ expect(constructorName.findWidgetExpression, creation);
+ expect(namedType.findWidgetExpression, creation);
+ expect(constructorName.name.findWidgetExpression, creation);
+ expect(argumentList.findWidgetExpression, isNull);
+ expect(argumentList.arguments[0].findWidgetExpression, isNull);
}
}
- Future<void> test_identifyWidgetExpression_node_invocation() async {
+ Future<void> test_enclosingWidgetExpression_node_invocation() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -163,24 +88,21 @@
''');
{
var invocation = findNode.methodInvocation('createEmptyText();');
- expect(Flutter.identifyWidgetExpression(invocation), invocation);
+ expect(invocation.findWidgetExpression, invocation);
var argumentList = invocation.argumentList;
- expect(Flutter.identifyWidgetExpression(argumentList), isNull);
+ expect(argumentList.findWidgetExpression, isNull);
}
{
var invocation = findNode.methodInvocation("createText('xyz');");
- expect(Flutter.identifyWidgetExpression(invocation), invocation);
+ expect(invocation.findWidgetExpression, invocation);
var argumentList = invocation.argumentList;
- expect(Flutter.identifyWidgetExpression(argumentList), isNull);
- expect(
- Flutter.identifyWidgetExpression(argumentList.arguments[0]),
- isNull,
- );
+ expect(argumentList.findWidgetExpression, isNull);
+ expect(argumentList.arguments[0].findWidgetExpression, isNull);
}
}
- Future<void> test_identifyWidgetExpression_node_namedExpression() async {
+ Future<void> test_enclosingWidgetExpression_node_namedExpression() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -191,11 +113,11 @@
Text createEmptyText() => Text('');
''');
var childExpression = findNode.namedExpression('child: ');
- expect(Flutter.identifyWidgetExpression(childExpression), isNull);
+ expect(childExpression.findWidgetExpression, isNull);
}
Future<void>
- test_identifyWidgetExpression_node_prefixedIdentifier_identifier() async {
+ test_enclosingWidgetExpression_node_prefixedIdentifier_identifier() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -210,11 +132,11 @@
}
''');
var bar = findNode.simple('bar; // ref');
- expect(Flutter.identifyWidgetExpression(bar), bar.parent);
+ expect(bar.findWidgetExpression, bar.parent);
}
Future<void>
- test_identifyWidgetExpression_node_prefixedIdentifier_prefix() async {
+ test_enclosingWidgetExpression_node_prefixedIdentifier_prefix() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -229,10 +151,10 @@
}
''');
var foo = findNode.simple('foo.bar');
- expect(Flutter.identifyWidgetExpression(foo), foo.parent);
+ expect(foo.findWidgetExpression, foo.parent);
}
- Future<void> test_identifyWidgetExpression_node_simpleIdentifier() async {
+ Future<void> test_enclosingWidgetExpression_node_simpleIdentifier() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -241,10 +163,10 @@
}
''');
var expression = findNode.simple('widget; // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_node_switchExpression() async {
+ Future<void> test_enclosingWidgetExpression_node_switchExpression() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -253,10 +175,10 @@
};
''');
var expression = findNode.instanceCreation('Container');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_null() async {
+ Future<void> test_enclosingWidgetExpression_null() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -267,19 +189,19 @@
Text createEmptyText() => Text('');
''');
- expect(Flutter.identifyWidgetExpression(null), isNull);
+ expect(null.findWidgetExpression, isNull);
{
var expression = findNode.integerLiteral('42;');
- expect(Flutter.identifyWidgetExpression(expression), isNull);
+ expect(expression.findWidgetExpression, isNull);
}
{
var expression = findNode.simple('intVariable;');
- expect(Flutter.identifyWidgetExpression(expression), isNull);
+ expect(expression.findWidgetExpression, isNull);
}
}
- Future<void> test_identifyWidgetExpression_parent_argumentList() async {
+ Future<void> test_enclosingWidgetExpression_parent_argumentList() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -291,11 +213,11 @@
void useWidget(Widget w) {}
''');
var expression = findNode.simple('text); // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
Future<void>
- test_identifyWidgetExpression_parent_assignmentExpression() async {
+ test_enclosingWidgetExpression_parent_assignmentExpression() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -309,24 +231,24 @@
// Assignment itself.
{
var expression = findNode.simple('text =');
- expect(Flutter.identifyWidgetExpression(expression), isNull);
+ expect(expression.findWidgetExpression, isNull);
}
// Left hand side.
{
var expression = findNode.assignment('text =');
- expect(Flutter.identifyWidgetExpression(expression), isNull);
+ expect(expression.findWidgetExpression, isNull);
}
// Right hand side.
{
var expression = findNode.instanceCreation('Text(');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
}
Future<void>
- test_identifyWidgetExpression_parent_conditionalExpression() async {
+ test_enclosingWidgetExpression_parent_conditionalExpression() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -335,25 +257,25 @@
}
''');
var thenWidget = findNode.simple('w1 :');
- expect(Flutter.identifyWidgetExpression(thenWidget), thenWidget);
+ expect(thenWidget.findWidgetExpression, thenWidget);
var elseWidget = findNode.simple('w2;');
- expect(Flutter.identifyWidgetExpression(elseWidget), elseWidget);
+ expect(elseWidget.findWidgetExpression, elseWidget);
}
Future<void>
- test_identifyWidgetExpression_parent_expressionFunctionBody() async {
+ test_enclosingWidgetExpression_parent_expressionFunctionBody() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
void f(Widget widget) => widget; // ref
''');
var expression = findNode.simple('widget; // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
Future<void>
- test_identifyWidgetExpression_parent_expressionStatement() async {
+ test_enclosingWidgetExpression_parent_expressionStatement() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -362,10 +284,10 @@
}
''');
var expression = findNode.simple('widget; // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_parent_forElement() async {
+ Future<void> test_enclosingWidgetExpression_parent_forElement() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -378,10 +300,10 @@
void useWidget(Widget w) {}
''');
var expression = findNode.instanceCreation('Container()');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_parent_ifElement() async {
+ Future<void> test_enclosingWidgetExpression_parent_ifElement() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -397,13 +319,13 @@
void useWidget(Widget w) {}
''');
var thenExpression = findNode.instanceCreation("Text('then')");
- expect(Flutter.identifyWidgetExpression(thenExpression), thenExpression);
+ expect(thenExpression.findWidgetExpression, thenExpression);
var elseExpression = findNode.instanceCreation("Text('else')");
- expect(Flutter.identifyWidgetExpression(elseExpression), elseExpression);
+ expect(elseExpression.findWidgetExpression, elseExpression);
}
- Future<void> test_identifyWidgetExpression_parent_listLiteral() async {
+ Future<void> test_enclosingWidgetExpression_parent_listLiteral() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -412,10 +334,10 @@
}
''');
var expression = findNode.simple('widget]; // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_parent_namedExpression() async {
+ Future<void> test_enclosingWidgetExpression_parent_namedExpression() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -427,10 +349,10 @@
void useWidget({required Widget child}) {}
''');
var expression = findNode.simple('text); // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
}
- Future<void> test_identifyWidgetExpression_parent_returnStatement() async {
+ Future<void> test_enclosingWidgetExpression_parent_returnStatement() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -439,7 +361,76 @@
}
''');
var expression = findNode.simple('widget; // ref');
- expect(Flutter.identifyWidgetExpression(expression), expression);
+ expect(expression.findWidgetExpression, expression);
+ }
+
+ Future<void> test_getWidgetPresentationText_icon() async {
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = const Icon(Icons.book);
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, 'Icon(Icons.book)');
+ }
+
+ Future<void> test_getWidgetPresentationText_icon_withoutArguments() async {
+ verifyNoTestUnitErrors = false;
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = const Icon();
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, 'Icon');
+ }
+
+ Future<void> test_getWidgetPresentationText_notWidget() async {
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = Object();
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, isNull);
+ }
+
+ Future<void> test_getWidgetPresentationText_text() async {
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = const Text('foo');
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, "Text('foo')");
+ }
+
+ Future<void> test_getWidgetPresentationText_text_longText() async {
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = const Text('${'abc' * 100}');
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(
+ widget.widgetPresentationText,
+ "Text('abcabcabcabcab...cabcabcabcabc')",
+ );
+ }
+
+ Future<void> test_getWidgetPresentationText_text_withoutArguments() async {
+ verifyNoTestUnitErrors = false;
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = const Text();
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, 'Text');
+ }
+
+ Future<void> test_getWidgetPresentationText_unresolved() async {
+ verifyNoTestUnitErrors = false;
+ await resolveTestCode('''
+import 'package:flutter/material.dart';
+var w = new Foo();
+''');
+ var widget = _getTopVariableCreation('w');
+ expect(widget.widgetPresentationText, isNull);
}
Future<void> test_isWidget() async {
@@ -453,19 +444,19 @@
class NotWidget extends State {}
''');
var myStatelessWidget = testUnitElement.getClass('MyStatelessWidget');
- expect(Flutter.isWidget(myStatelessWidget), isTrue);
+ expect(myStatelessWidget.isWidget, isTrue);
var myStatefulWidget = testUnitElement.getClass('MyStatefulWidget');
- expect(Flutter.isWidget(myStatefulWidget), isTrue);
+ expect(myStatefulWidget.isWidget, isTrue);
var myContainer = testUnitElement.getClass('MyContainer');
- expect(Flutter.isWidget(myContainer), isTrue);
+ expect(myContainer.isWidget, isTrue);
var notFlutter = testUnitElement.getClass('NotFlutter');
- expect(Flutter.isWidget(notFlutter), isFalse);
+ expect(notFlutter.isWidget, isFalse);
var notWidget = testUnitElement.getClass('NotWidget');
- expect(Flutter.isWidget(notWidget), isFalse);
+ expect(notWidget.isWidget, isFalse);
}
Future<void> test_isWidgetCreation() async {
@@ -475,13 +466,12 @@
var a = Object();
var b = Text('bbb');
''');
- expect(Flutter.isWidgetCreation(null), isFalse);
var a = _getTopVariableCreation('a');
- expect(Flutter.isWidgetCreation(a), isFalse);
+ expect(a.isWidgetCreation, isFalse);
var b = _getTopVariableCreation('b');
- expect(Flutter.isWidgetCreation(b), isTrue);
+ expect(b.isWidgetCreation, isTrue);
}
Future<void> test_isWidgetExpression() async {
@@ -506,44 +496,44 @@
''');
{
var expression = findNode.simple('named(); // use');
- expect(Flutter.isWidgetExpression(expression), isFalse);
+ expect(expression.isWidgetExpression, isFalse);
var creation = expression.parent?.parent as InstanceCreationExpression;
- expect(Flutter.isWidgetExpression(creation), isTrue);
+ expect(creation.isWidgetExpression, isTrue);
}
{
var expression = findNode.instanceCreation("Text('abc')");
- expect(Flutter.isWidgetExpression(expression), isTrue);
+ expect(expression.isWidgetExpression, isTrue);
}
{
var expression = findNode.simple('text;');
- expect(Flutter.isWidgetExpression(expression), isTrue);
+ expect(expression.isWidgetExpression, isTrue);
}
{
var expression = findNode.methodInvocation('createEmptyText();');
- expect(Flutter.isWidgetExpression(expression), isTrue);
+ expect(expression.isWidgetExpression, isTrue);
}
{
var expression = findNode.namedType('Container(');
- expect(Flutter.isWidgetExpression(expression), isFalse);
+ expect(expression.isWidgetExpression, isFalse);
}
{
var expression = findNode.namedExpression('child: ');
- expect(Flutter.isWidgetExpression(expression), isFalse);
+ expect(expression.isWidgetExpression, isFalse);
}
{
var expression = findNode.integerLiteral('42;');
- expect(Flutter.isWidgetExpression(expression), isFalse);
+ expect(expression.isWidgetExpression, isFalse);
}
{
var expression = findNode.simple('intVariable;');
- expect(Flutter.isWidgetExpression(expression), isFalse);
+ expect(expression.isWidgetExpression, isFalse);
}
}
diff --git a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
index 448004c..313b856 100644
--- a/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/flutter_metrics.dart
@@ -4,7 +4,7 @@
import 'dart:io' as io;
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -135,7 +135,7 @@
@override
void visitInstanceCreationExpression(InstanceCreationExpression node) {
var previousParentWidget = parentWidget;
- if (Flutter.isWidgetCreation(node)) {
+ if (node.isWidgetCreation) {
var element = node.constructorName.staticElement;
if (element == null) {
throw StateError(
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index f7caba7..f8e1040 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -9,7 +9,7 @@
import 'package:analysis_server/src/protocol_server.dart'
show convertElementToElementKind, ElementKind;
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -303,8 +303,8 @@
void visitArgumentList(ArgumentList node) {
var context = _argumentListContext(node);
var parent = node.parent;
- var inWidgetConstructor = parent is InstanceCreationExpression &&
- Flutter.isWidgetType(parent.staticType);
+ var inWidgetConstructor =
+ parent is InstanceCreationExpression && parent.staticType.isWidgetType;
for (var argument in node.arguments) {
var realArgument = argument;
var argumentKind = 'unnamed';
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index b1fdeec..3a7a79d 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -8,7 +8,7 @@
import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
import 'package:analysis_server/src/protocol_server.dart' show ElementKind;
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
-import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analysis_server/src/utilities/extensions/flutter.dart';
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/results.dart';
@@ -1276,7 +1276,7 @@
} else if (parent is FunctionExpressionInvocation) {
return 'function';
} else if (parent is InstanceCreationExpression) {
- if (Flutter.isWidgetType(parent.staticType)) {
+ if (parent.staticType.isWidgetType) {
return 'widgetConstructor';
}
return 'constructor';
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index 5c91570..19236b0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -18,7 +18,7 @@
AnalysisSessionHelper(this.session);
- /// Return the [ClassElement] with the given [className] that is exported
+ /// Returns the [ClassElement] with the given [className] that is exported
/// from the library with the given [libraryUri], or `null` if the library
/// does not export a class with such name.
Future<ClassElement?> getClass(String libraryUri, String className) async {
@@ -55,6 +55,12 @@
return null;
}
+ /// Returns the [ClassElement] with the given [className] that is exported
+ /// from the Flutter widgets library, or `null` if the library does not export
+ /// a class with such name.
+ Future<ClassElement?> getFlutterClass(String className) =>
+ getClass('package:flutter/widgets.dart', className);
+
/// Return the [MixinElement] with the given [name] that is exported
/// from the library with the given [libraryUri], or `null` if the library
/// does not export a class with such name.