diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart index d2be4fc54698..b1abe78e2e0f 100644 --- a/pkg/analysis_server/lib/src/computer/computer_outline.dart +++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart @@ -16,10 +16,8 @@ import 'package:analyzer_plugin/protocol/protocol_common.dart'; class DartUnitOutlineComputer { final ResolvedUnitResult resolvedUnit; final bool withBasicFlutter; - final Flutter flutter; - DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter = false}) - : flutter = Flutter.of(resolvedUnit); + DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter = false}); /// Returns the computed outline, not `null`. Outline compute() { @@ -409,6 +407,8 @@ class _FunctionBodyOutlinesVisitor extends RecursiveAstVisitor { _FunctionBodyOutlinesVisitor(this.outlineComputer, this.contents); + Flutter get _flutter => Flutter.instance; + /// Return `true` if the given [element] is the method 'group' defined in the /// test package. bool isGroup(engine.ExecutableElement element) { @@ -438,13 +438,12 @@ class _FunctionBodyOutlinesVisitor extends RecursiveAstVisitor { @override void visitInstanceCreationExpression(InstanceCreationExpression node) { - if (outlineComputer.withBasicFlutter && - outlineComputer.flutter.isWidgetCreation(node)) { + if (outlineComputer.withBasicFlutter && _flutter.isWidgetCreation(node)) { var children = []; node.argumentList .accept(_FunctionBodyOutlinesVisitor(outlineComputer, children)); - var text = outlineComputer.flutter.getWidgetPresentationText(node); + var text = _flutter.getWidgetPresentationText(node); 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 9e9990d90032..b2540c65490c 100644 --- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart +++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart @@ -13,20 +13,19 @@ import 'package:analyzer/dart/element/element.dart'; /// Computer for Flutter specific outlines. class FlutterOutlineComputer { final ResolvedUnitResult resolvedUnit; - Flutter flutter; final List _depthFirstOrder = []; FlutterOutlineComputer(this.resolvedUnit); + Flutter get _flutter => Flutter.instance; + protocol.FlutterOutline compute() { var dartOutline = DartUnitOutlineComputer( resolvedUnit, withBasicFlutter: false, ).compute(); - flutter = Flutter.of(resolvedUnit); - // Convert Dart outlines into Flutter outlines. var flutterDartOutline = _convert(dartOutline); @@ -131,7 +130,7 @@ class FlutterOutlineComputer { /// a widget reference outline item. protocol.FlutterOutline _createOutline(Expression node, bool withGeneric) { var type = node.staticType; - if (!flutter.isWidgetType(type)) { + if (!_flutter.isWidgetType(type)) { return null; } var className = type.element.displayName; @@ -140,9 +139,9 @@ class FlutterOutlineComputer { var attributes = []; var children = []; for (var argument in node.argumentList.arguments) { - var isWidgetArgument = flutter.isWidgetType(argument.staticType); + var isWidgetArgument = _flutter.isWidgetType(argument.staticType); var isWidgetListArgument = - flutter.isListOfWidgetsType(argument.staticType); + _flutter.isListOfWidgetsType(argument.staticType); String parentAssociationLabel; Expression childrenExpression; diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart index 14fbe05e13a6..cc88ab0ee635 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart @@ -163,7 +163,7 @@ class ArgListContributor extends DartCompletionContributor { } bool _isInFlutterCreation() { - var flutter = Flutter.of(request.result); + var flutter = Flutter.instance; var containingNode = request.target?.containingNode; var newExpr = containingNode != null ? flutter.identifyNewExpression(containingNode.parent) 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 6e3ebea3879c..6be637426473 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 @@ -164,17 +164,12 @@ class SuggestionBuilder { /// computed. In the latter case, [_hasContainingMemberName] will be `false`. String _cachedContainingMemberName; - /// The cached instance of the flutter utilities, or `null` if it hasn't been - /// created yet. - Flutter _flutter; - /// Initialize a newly created suggestion builder to build suggestions for the /// given [request]. SuggestionBuilder(this.request, {this.listener}); - /// Return an object that can answer questions about Flutter code based on the - /// flavor of Flutter being used. - Flutter get flutter => _flutter ??= Flutter.of(request.result); + /// Return an object that can answer questions about Flutter code. + Flutter get flutter => Flutter.instance; /// Return an iterable that can be used to access the completion suggestions /// that have been built. @@ -803,8 +798,7 @@ class SuggestionBuilder { // todo (pq): revisit this special casing; likely it can be generalized away var element = parameter.enclosingElement; if (element is ConstructorElement) { - var flutter = Flutter.of(request.result); - if (flutter.isWidget(element.enclosingElement)) { + if (Flutter.instance.isWidget(element.enclosingElement)) { var defaultValue = getDefaultStringParameterValue(parameter); // TODO(devoncarew): Should we remove the check here? We would then // suggest values for param types like closures. diff --git a/pkg/analysis_server/lib/src/services/correction/base_processor.dart b/pkg/analysis_server/lib/src/services/correction/base_processor.dart index 0bb0cffc9bc5..836467adb204 100644 --- a/pkg/analysis_server/lib/src/services/correction/base_processor.dart +++ b/pkg/analysis_server/lib/src/services/correction/base_processor.dart @@ -23,7 +23,6 @@ abstract class BaseProcessor { final String file; final TypeProvider typeProvider; - final Flutter flutter; final AnalysisSession session; final AnalysisSessionHelper sessionHelper; @@ -38,13 +37,14 @@ abstract class BaseProcessor { @required this.resolvedResult, @required this.workspace, }) : file = resolvedResult.path, - flutter = Flutter.of(resolvedResult), session = resolvedResult.session, sessionHelper = AnalysisSessionHelper(resolvedResult.session), typeProvider = resolvedResult.typeProvider, selectionEnd = (selectionOffset ?? 0) + (selectionLength ?? 0), utils = CorrectionUtils(resolvedResult); + Flutter get flutter => Flutter.instance; + @protected bool setupCompute() { final locator = NodeLocator(selectionOffset, selectionEnd); diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart index bf2c9f226a19..b580f69c8cc2 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart @@ -252,7 +252,6 @@ class CorrectionProducerContext { final String file; final TypeProvider typeProvider; - final Flutter flutter; final AnalysisSession session; final AnalysisSessionHelper sessionHelper; @@ -272,7 +271,6 @@ class CorrectionProducerContext { this.selectionOffset = -1, this.selectionLength = 0, }) : file = resolvedResult.path, - flutter = Flutter.of(resolvedResult), session = resolvedResult.session, sessionHelper = AnalysisSessionHelper(resolvedResult.session), typeProvider = resolvedResult.typeProvider, @@ -344,7 +342,7 @@ abstract class _AbstractCorrectionProducer { String get file => _context.file; - Flutter get flutter => _context.flutter; + Flutter get flutter => Flutter.instance; /// Return the library element for the library in which a correction is being /// produced. 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 174a9a26b9de..6476f4672bc4 100644 --- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart +++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart @@ -131,9 +131,6 @@ class _WidgetDescriptionComputer { /// The offset of the widget expression. final int widgetOffset; - /// The instance of [Flutter] support. - final Flutter flutter; - ClassElement _classAlignment; ClassElement _classAlignmentDirectional; ClassElement _classContainer; @@ -143,11 +140,13 @@ class _WidgetDescriptionComputer { this.classRegistry, this.resolvedUnit, this.widgetOffset, - ) : flutter = Flutter.of(resolvedUnit); + ); + + Flutter get _flutter => Flutter.instance; Future<_WidgetDescription> compute() async { var node = NodeLocator2(widgetOffset).searchWithin(resolvedUnit.unit); - var instanceCreation = flutter.identifyNewExpression(node); + var instanceCreation = _flutter.identifyNewExpression(node); if (instanceCreation == null) { return null; } @@ -173,7 +172,7 @@ class _WidgetDescriptionComputer { List properties, InstanceCreationExpression widgetCreation, ) { - if (!flutter.isWidgetCreation(widgetCreation)) { + if (!_flutter.isWidgetCreation(widgetCreation)) { return; } @@ -190,7 +189,7 @@ class _WidgetDescriptionComputer { } PropertyDescription containerProperty; - if (flutter.isExactlyContainerCreation(parentCreation)) { + if (_flutter.isExactlyContainerCreation(parentCreation)) { containerProperty = PropertyDescription( resolvedUnit: resolvedUnit, instanceCreation: parentCreation, @@ -236,9 +235,9 @@ class _WidgetDescriptionComputer { classDescription: containerDescription, ); - if (flutter.isExactlyAlignCreation(parentCreation) && - flutter.findNamedArgument(parentCreation, 'widthFactor') == null && - flutter.findNamedArgument(parentCreation, 'heightFactor') == null) { + if (_flutter.isExactlyAlignCreation(parentCreation) && + _flutter.findNamedArgument(parentCreation, 'widthFactor') == null && + _flutter.findNamedArgument(parentCreation, 'heightFactor') == null) { _replaceNestedContainerProperty( containerProperty, parentCreation, @@ -246,7 +245,7 @@ class _WidgetDescriptionComputer { ); } - if (flutter.isExactlyPaddingCreation(parentCreation)) { + if (_flutter.isExactlyPaddingCreation(parentCreation)) { _replaceNestedContainerProperty( containerProperty, parentCreation, @@ -347,7 +346,7 @@ class _WidgetDescriptionComputer { var propertyDescription = PropertyDescription( parent: parent, resolvedUnit: resolvedUnit, - flutter: flutter, + flutter: _flutter, classDescription: classDescription, instanceCreation: instanceCreation, argumentExpression: argumentExpression, @@ -366,7 +365,7 @@ class _WidgetDescriptionComputer { ); properties.add(propertyDescription); - if (flutter.isExactEdgeInsetsGeometryType(parameter.type)) { + if (_flutter.isExactEdgeInsetsGeometryType(parameter.type)) { propertyDescription.addEdgeInsetsNestedProperties(_classEdgeInsets); } else if (valueExpression is InstanceCreationExpression) { var type = valueExpression.staticType; @@ -414,19 +413,19 @@ class _WidgetDescriptionComputer { Future _fetchClassElements() async { var sessionHelper = AnalysisSessionHelper(resolvedUnit.session); _classAlignment = await sessionHelper.getClass( - flutter.widgetsUri, + _flutter.widgetsUri, 'Alignment', ); _classAlignmentDirectional = await sessionHelper.getClass( - flutter.widgetsUri, + _flutter.widgetsUri, 'AlignmentDirectional', ); _classContainer = await sessionHelper.getClass( - flutter.widgetsUri, + _flutter.widgetsUri, 'Container', ); _classEdgeInsets = await sessionHelper.getClass( - flutter.widgetsUri, + _flutter.widgetsUri, 'EdgeInsets', ); } @@ -460,7 +459,7 @@ class _WidgetDescriptionComputer { enumItems: _enumItemsForEnum(classElement), ); } - if (flutter.isExactAlignmentGeometry(classElement)) { + if (_flutter.isExactAlignmentGeometry(classElement)) { var items = []; items.addAll( _enumItemsForStaticFields(_classAlignment), @@ -484,7 +483,7 @@ class _WidgetDescriptionComputer { InstanceCreationExpression parentCreation, String name, ) { - var argument = flutter.findNamedArgument(parentCreation, name); + var argument = _flutter.findNamedArgument(parentCreation, name); if (argument != null) { var replacements = []; _addProperty( @@ -536,8 +535,8 @@ class _WidgetDescriptionComputer { if (field is FieldElement && field.isStatic) { var enclosingClass = field.enclosingElement as ClassElement; if (field.isEnumConstant || - flutter.isExactAlignment(enclosingClass) || - flutter.isExactAlignmentDirectional(enclosingClass)) { + _flutter.isExactAlignment(enclosingClass) || + _flutter.isExactAlignmentDirectional(enclosingClass)) { return protocol.FlutterWidgetPropertyValue( enumValue: _toEnumItem(field), ); diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart index 6726707be9ac..aa74c38561ba 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart @@ -37,7 +37,6 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl final int length; CorrectionUtils utils; - Flutter flutter; ClassElement classBuildContext; ClassElement classKey; @@ -78,7 +77,6 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl this.searchEngine, this.resolveResult, this.offset, this.length) : sessionHelper = AnalysisSessionHelper(resolveResult.session) { utils = CorrectionUtils(resolveResult); - flutter = Flutter.of(resolveResult); } @override @@ -90,6 +88,8 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl return resolveResult.unit.featureSet; } + Flutter get _flutter => Flutter.instance; + bool get _isNonNullable => _featureSet.isEnabled(Feature.non_nullable); @override @@ -184,8 +184,8 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl _enclosingClassElement = _enclosingClassNode?.declaredElement; // new MyWidget(...) - var newExpression = flutter.identifyNewExpression(node); - if (flutter.isWidgetCreation(newExpression)) { + var newExpression = _flutter.identifyNewExpression(node); + if (_flutter.isWidgetCreation(newExpression)) { _expression = newExpression; return RefactoringStatus(); } @@ -203,7 +203,7 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl if (statements.isNotEmpty) { var lastStatement = statements.last; if (lastStatement is ReturnStatement && - flutter.isWidgetExpression(lastStatement.expression)) { + _flutter.isWidgetExpression(lastStatement.expression)) { _statements = statements; _statementsRange = range.startEnd(statements.first, statements.last); return RefactoringStatus(); @@ -221,7 +221,7 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl } if (node is MethodDeclaration) { var returnType = node.returnType?.type; - if (flutter.isWidgetType(returnType) && node.body != null) { + if (_flutter.isWidgetType(returnType) && node.body != null) { _method = node; return RefactoringStatus(); } @@ -238,10 +238,10 @@ class ExtractWidgetRefactoringImpl extends RefactoringImpl var result = RefactoringStatus(); Future getClass(String name) async { - var element = await sessionHelper.getClass(flutter.widgetsUri, name); + var element = await sessionHelper.getClass(_flutter.widgetsUri, name); if (element == null) { result.addFatalError( - "Unable to find '$name' in ${flutter.widgetsUri}", + "Unable to find '$name' in ${_flutter.widgetsUri}", ); } return element; diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart index b3c18efbaaf5..b8d9705a63f0 100644 --- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart +++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart @@ -141,8 +141,7 @@ class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl { } void _findFlutterStateClass() { - var flutter = Flutter.of(resolvedUnit); - if (flutter.isStatefulWidgetDeclaration(element)) { + if (Flutter.instance.isStatefulWidgetDeclaration(element)) { var oldStateName = oldName + 'State'; _flutterWidgetState = element.library.getType(oldStateName) ?? element.library.getType('_' + oldStateName); diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart index 0a9b690847f9..d8cc17b3640c 100644 --- a/pkg/analysis_server/lib/src/utilities/flutter.dart +++ b/pkg/analysis_server/lib/src/utilities/flutter.dart @@ -3,15 +3,15 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analysis_server/src/utilities/strings.dart'; -import 'package:analyzer/dart/analysis/results.dart'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart'; class Flutter { + static final Flutter instance = Flutter(); + static const _nameAlign = 'Align'; static const _nameCenter = 'Center'; static const _nameContainer = 'Container'; @@ -22,60 +22,32 @@ class Flutter { static const _nameStreamBuilder = 'StreamBuilder'; static const _nameWidget = 'Widget'; - static final mobile = Flutter._('flutter', 'package:flutter'); - static final web = Flutter._('flutter_web', 'package:flutter_web'); - - static final _uriFlutterMobileWidgets = - Uri.parse('package:flutter/widgets.dart'); - - static final _uriFlutterWebWidgets = - Uri.parse('package:flutter_web/widgets.dart'); - - final String packageName; - final String widgetsUri; - - final Uri _uriAlignment; - final Uri _uriAsync; - final Uri _uriBasic; - final Uri _uriContainer; - final Uri _uriEdgeInsets; - final Uri _uriFramework; - final Uri _uriWidgetsIcon; - final Uri _uriWidgetsText; - - factory Flutter.of(ResolvedUnitResult resolvedUnit) { - var uriConverter = resolvedUnit.session.uriConverter; - var isMobile = uriConverter.uriToPath(_uriFlutterMobileWidgets) != null; - var isWeb = uriConverter.uriToPath(_uriFlutterWebWidgets) != null; - - if (isMobile && isWeb) { - var visitor = _IdentifyMobileOrWeb(); - resolvedUnit.unit.accept(visitor); - isMobile = visitor.isMobile; - isWeb = visitor.isWeb; - } - - if (isMobile) { - return mobile; - } - - if (isWeb) { - return web; - } - - return mobile; - } - - Flutter._(this.packageName, String uriPrefix) - : widgetsUri = '$uriPrefix/widgets.dart', - _uriAlignment = Uri.parse('$uriPrefix/src/painting/alignment.dart'), - _uriAsync = Uri.parse('$uriPrefix/src/widgets/async.dart'), - _uriBasic = Uri.parse('$uriPrefix/src/widgets/basic.dart'), - _uriContainer = Uri.parse('$uriPrefix/src/widgets/container.dart'), - _uriEdgeInsets = Uri.parse('$uriPrefix/src/painting/edge_insets.dart'), - _uriFramework = Uri.parse('$uriPrefix/src/widgets/framework.dart'), - _uriWidgetsIcon = Uri.parse('$uriPrefix/src/widgets/icon.dart'), - _uriWidgetsText = Uri.parse('$uriPrefix/src/widgets/text.dart'); + final String widgetsUri = 'package:flutter/widgets.dart'; + + 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 _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', + ); /// Return the argument with the given [index], or `null` if none. Expression argumentByIndex(List arguments, int index) { @@ -579,27 +551,3 @@ class Flutter { return element != null && element.name == type && element.source.uri == uri; } } - -class _IdentifyMobileOrWeb extends GeneralizingAstVisitor { - bool isMobile = false; - bool isWeb = false; - - @override - void visitExpression(Expression node) { - if (isMobile || isWeb) { - return; - } - - if (Flutter.mobile.isWidgetExpression(node)) { - isMobile = true; - return; - } - - if (Flutter.web.isWidgetExpression(node)) { - isWeb = true; - return; - } - - super.visitExpression(node); - } -} diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart index 8cda4ec4f32e..da82d9c0e534 100644 --- a/pkg/analysis_server/test/src/services/flutter/widget_description.dart +++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart @@ -7,7 +7,6 @@ import 'dart:convert'; import 'package:analysis_server/protocol/protocol_generated.dart' as protocol; import 'package:analysis_server/src/protocol_server.dart'; import 'package:analysis_server/src/services/flutter/widget_descriptions.dart'; -import 'package:analysis_server/src/utilities/flutter.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -15,7 +14,6 @@ import '../../../abstract_single_unit.dart'; @reflectiveTest class WidgetDescriptionBase extends AbstractSingleUnitTest { - final flutter = Flutter.mobile; final descriptions = WidgetDescriptions(); void assertExpectedChange(SetPropertyValueResult result, String expected) { diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart index 4e52effcce12..b7d9636e821e 100644 --- a/pkg/analysis_server/test/src/utilities/flutter_test.dart +++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart @@ -17,7 +17,7 @@ void main() { @reflectiveTest class FlutterTest extends AbstractSingleUnitTest { - final flutter = Flutter.mobile; + Flutter get _flutter => Flutter.instance; @override void setUp() { @@ -31,7 +31,7 @@ import 'package:flutter/material.dart'; var w = const Icon(Icons.book); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), 'Icon(Icons.book)'); + expect(_flutter.getWidgetPresentationText(w), 'Icon(Icons.book)'); } Future test_getWidgetPresentationText_icon_withoutArguments() async { @@ -41,7 +41,7 @@ import 'package:flutter/material.dart'; var w = const Icon(); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), 'Icon'); + expect(_flutter.getWidgetPresentationText(w), 'Icon'); } Future test_getWidgetPresentationText_notWidget() async { @@ -50,7 +50,7 @@ import 'package:flutter/material.dart'; var w = new Object(); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), isNull); + expect(_flutter.getWidgetPresentationText(w), isNull); } Future test_getWidgetPresentationText_text() async { @@ -59,7 +59,7 @@ import 'package:flutter/material.dart'; var w = const Text('foo'); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), "Text('foo')"); + expect(_flutter.getWidgetPresentationText(w), "Text('foo')"); } Future test_getWidgetPresentationText_text_longText() async { @@ -69,7 +69,7 @@ var w = const Text('${'abc' * 100}'); '''); var w = _getTopVariableCreation('w'); expect( - flutter.getWidgetPresentationText(w), + _flutter.getWidgetPresentationText(w), "Text('abcabcabcabcab...cabcabcabcabc')", ); } @@ -81,7 +81,7 @@ import 'package:flutter/material.dart'; var w = const Text(); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), 'Text'); + expect(_flutter.getWidgetPresentationText(w), 'Text'); } Future test_getWidgetPresentationText_unresolved() async { @@ -91,7 +91,7 @@ import 'package:flutter/material.dart'; var w = new Foo(); '''); var w = _getTopVariableCreation('w'); - expect(flutter.getWidgetPresentationText(w), isNull); + expect(_flutter.getWidgetPresentationText(w), isNull); } Future test_identifyWidgetExpression_node_instanceCreation() async { @@ -120,12 +120,12 @@ class MyWidget extends StatelessWidget { var constructorName = creation.constructorName; var typeName = constructorName.type; var argumentList = creation.argumentList; - expect(flutter.identifyWidgetExpression(creation), creation); - expect(flutter.identifyWidgetExpression(constructorName), creation); - expect(flutter.identifyWidgetExpression(typeName), creation); - expect(flutter.identifyWidgetExpression(argumentList), isNull); + expect(_flutter.identifyWidgetExpression(creation), creation); + expect(_flutter.identifyWidgetExpression(constructorName), creation); + expect(_flutter.identifyWidgetExpression(typeName), creation); + expect(_flutter.identifyWidgetExpression(argumentList), isNull); expect( - flutter.identifyWidgetExpression(argumentList.arguments[0]), + _flutter.identifyWidgetExpression(argumentList.arguments[0]), isNull, ); } @@ -137,14 +137,14 @@ class MyWidget extends StatelessWidget { var constructorName = creation.constructorName; var typeName = constructorName.type; var argumentList = creation.argumentList; - expect(flutter.identifyWidgetExpression(creation), creation); - expect(flutter.identifyWidgetExpression(constructorName), creation); - expect(flutter.identifyWidgetExpression(typeName), creation); - expect(flutter.identifyWidgetExpression(typeName.name), creation); - expect(flutter.identifyWidgetExpression(constructorName.name), creation); - expect(flutter.identifyWidgetExpression(argumentList), isNull); + expect(_flutter.identifyWidgetExpression(creation), creation); + expect(_flutter.identifyWidgetExpression(constructorName), creation); + expect(_flutter.identifyWidgetExpression(typeName), creation); + expect(_flutter.identifyWidgetExpression(typeName.name), creation); + expect(_flutter.identifyWidgetExpression(constructorName.name), creation); + expect(_flutter.identifyWidgetExpression(argumentList), isNull); expect( - flutter.identifyWidgetExpression(argumentList.arguments[0]), + _flutter.identifyWidgetExpression(argumentList.arguments[0]), isNull, ); } @@ -165,19 +165,19 @@ Text createText(String txt) => new Text(txt); { MethodInvocation invocation = findNodeAtString( 'createEmptyText();', (node) => node is MethodInvocation); - expect(flutter.identifyWidgetExpression(invocation), invocation); + expect(_flutter.identifyWidgetExpression(invocation), invocation); var argumentList = invocation.argumentList; - expect(flutter.identifyWidgetExpression(argumentList), isNull); + expect(_flutter.identifyWidgetExpression(argumentList), isNull); } { MethodInvocation invocation = findNodeAtString( "createText('xyz');", (node) => node is MethodInvocation); - expect(flutter.identifyWidgetExpression(invocation), invocation); + expect(_flutter.identifyWidgetExpression(invocation), invocation); var argumentList = invocation.argumentList; - expect(flutter.identifyWidgetExpression(argumentList), isNull); + expect(_flutter.identifyWidgetExpression(argumentList), isNull); expect( - flutter.identifyWidgetExpression(argumentList.arguments[0]), + _flutter.identifyWidgetExpression(argumentList.arguments[0]), isNull, ); } @@ -194,7 +194,7 @@ main() { Text createEmptyText() => new Text(''); '''); Expression childExpression = findNodeAtString('child: '); - expect(flutter.identifyWidgetExpression(childExpression), isNull); + expect(_flutter.identifyWidgetExpression(childExpression), isNull); } Future @@ -211,7 +211,7 @@ main(Foo foo) { } '''); SimpleIdentifier bar = findNodeAtString('bar; // ref'); - expect(flutter.identifyWidgetExpression(bar), bar.parent); + expect(_flutter.identifyWidgetExpression(bar), bar.parent); } Future @@ -228,7 +228,7 @@ main(Foo foo) { } '''); SimpleIdentifier foo = findNodeAtString('foo.bar'); - expect(flutter.identifyWidgetExpression(foo), foo.parent); + expect(_flutter.identifyWidgetExpression(foo), foo.parent); } Future test_identifyWidgetExpression_node_simpleIdentifier() async { @@ -240,7 +240,7 @@ main(Widget widget) { } '''); Expression expression = findNodeAtString('widget; // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_identifyWidgetExpression_null() async { @@ -254,15 +254,15 @@ main() { Text createEmptyText() => new Text(''); '''); - expect(flutter.identifyWidgetExpression(null), isNull); + expect(_flutter.identifyWidgetExpression(null), isNull); { Expression expression = findNodeAtString('42;'); - expect(flutter.identifyWidgetExpression(expression), isNull); + expect(_flutter.identifyWidgetExpression(expression), isNull); } { Expression expression = findNodeAtString('intVariable;'); - expect(flutter.identifyWidgetExpression(expression), isNull); + expect(_flutter.identifyWidgetExpression(expression), isNull); } } @@ -278,7 +278,7 @@ main() { void useWidget(Widget w) {} '''); Expression expression = findNodeAtString('text); // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future @@ -296,19 +296,19 @@ void useWidget(Widget w) {} // Assignment itself. { var expression = findNode.simple('text ='); - expect(flutter.identifyWidgetExpression(expression), isNull); + expect(_flutter.identifyWidgetExpression(expression), isNull); } // Left hand side. { var expression = findNode.assignment('text ='); - expect(flutter.identifyWidgetExpression(expression), isNull); + expect(_flutter.identifyWidgetExpression(expression), isNull); } // Right hand side. { var expression = findNode.instanceCreation('Text('); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } } @@ -322,10 +322,10 @@ main(bool condition, Widget w1, Widget w2) { } '''); Expression thenWidget = findNodeAtString('w1 :'); - expect(flutter.identifyWidgetExpression(thenWidget), thenWidget); + expect(_flutter.identifyWidgetExpression(thenWidget), thenWidget); Expression elseWidget = findNodeAtString('w2;'); - expect(flutter.identifyWidgetExpression(elseWidget), elseWidget); + expect(_flutter.identifyWidgetExpression(elseWidget), elseWidget); } Future @@ -336,7 +336,7 @@ import 'package:flutter/widgets.dart'; main(Widget widget) => widget; // ref '''); Expression expression = findNodeAtString('widget; // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future @@ -349,7 +349,7 @@ main(Widget widget) { } '''); Expression expression = findNodeAtString('widget; // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_identifyWidgetExpression_parent_forElement() async { @@ -365,7 +365,7 @@ main(bool b) { void useWidget(Widget w) {} '''); var expression = findNode.instanceCreation('Container()'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_identifyWidgetExpression_parent_ifElement() async { @@ -384,10 +384,10 @@ main(bool b) { void useWidget(Widget w) {} '''); var thenExpression = findNode.instanceCreation("Text('then')"); - expect(flutter.identifyWidgetExpression(thenExpression), thenExpression); + expect(_flutter.identifyWidgetExpression(thenExpression), thenExpression); var elseExpression = findNode.instanceCreation("Text('else')"); - expect(flutter.identifyWidgetExpression(elseExpression), elseExpression); + expect(_flutter.identifyWidgetExpression(elseExpression), elseExpression); } Future test_identifyWidgetExpression_parent_listLiteral() async { @@ -399,7 +399,7 @@ main(Widget widget) { } '''); Expression expression = findNodeAtString('widget]; // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_identifyWidgetExpression_parent_namedExpression() async { @@ -414,7 +414,7 @@ main() { void useWidget({Widget child}) {} '''); Expression expression = findNodeAtString('text); // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_identifyWidgetExpression_parent_returnStatement() async { @@ -426,7 +426,7 @@ main(Widget widget) { } '''); Expression expression = findNodeAtString('widget; // ref'); - expect(flutter.identifyWidgetExpression(expression), expression); + expect(_flutter.identifyWidgetExpression(expression), expression); } Future test_isWidget() async { @@ -440,19 +440,19 @@ class NotFlutter {} class NotWidget extends State {} '''); var myStatelessWidget = testUnitElement.getType('MyStatelessWidget'); - expect(flutter.isWidget(myStatelessWidget), isTrue); + expect(_flutter.isWidget(myStatelessWidget), isTrue); var myStatefulWidget = testUnitElement.getType('MyStatefulWidget'); - expect(flutter.isWidget(myStatefulWidget), isTrue); + expect(_flutter.isWidget(myStatefulWidget), isTrue); var myContainer = testUnitElement.getType('MyContainer'); - expect(flutter.isWidget(myContainer), isTrue); + expect(_flutter.isWidget(myContainer), isTrue); var notFlutter = testUnitElement.getType('NotFlutter'); - expect(flutter.isWidget(notFlutter), isFalse); + expect(_flutter.isWidget(notFlutter), isFalse); var notWidget = testUnitElement.getType('NotWidget'); - expect(flutter.isWidget(notWidget), isFalse); + expect(_flutter.isWidget(notWidget), isFalse); } Future test_isWidgetCreation() async { @@ -462,13 +462,13 @@ import 'package:flutter/widgets.dart'; var a = new Object(); var b = new Text('bbb'); '''); - expect(flutter.isWidgetCreation(null), isFalse); + expect(_flutter.isWidgetCreation(null), isFalse); var a = _getTopVariableCreation('a'); - expect(flutter.isWidgetCreation(a), isFalse); + expect(_flutter.isWidgetCreation(a), isFalse); var b = _getTopVariableCreation('b'); - expect(flutter.isWidgetCreation(b), isTrue); + expect(_flutter.isWidgetCreation(b), isTrue); } Future test_isWidgetExpression() async { @@ -493,46 +493,46 @@ Text createEmptyText() => new Text(''); '''); { Expression expression = findNodeAtString('named(); // use'); - expect(flutter.isWidgetExpression(expression), isFalse); + expect(_flutter.isWidgetExpression(expression), isFalse); var creation = expression.parent.parent as InstanceCreationExpression; - expect(flutter.isWidgetExpression(creation), isTrue); + expect(_flutter.isWidgetExpression(creation), isTrue); } { Expression expression = findNodeAtString("new Text('abc')"); - expect(flutter.isWidgetExpression(expression), isTrue); + expect(_flutter.isWidgetExpression(expression), isTrue); } { Expression expression = findNodeAtString('text;'); - expect(flutter.isWidgetExpression(expression), isTrue); + expect(_flutter.isWidgetExpression(expression), isTrue); } { Expression expression = findNodeAtString( 'createEmptyText();', (node) => node is MethodInvocation); - expect(flutter.isWidgetExpression(expression), isTrue); + expect(_flutter.isWidgetExpression(expression), isTrue); } { SimpleIdentifier expression = findNodeAtString('Container('); - expect(flutter.isWidgetExpression(expression), isFalse); + expect(_flutter.isWidgetExpression(expression), isFalse); } { NamedExpression expression = findNodeAtString('child: ', (n) => n is NamedExpression); - expect(flutter.isWidgetExpression(expression), isFalse); + expect(_flutter.isWidgetExpression(expression), isFalse); } { Expression expression = findNodeAtString('42;'); - expect(flutter.isWidgetExpression(expression), isFalse); + expect(_flutter.isWidgetExpression(expression), isFalse); } { Expression expression = findNodeAtString('intVariable;'); - expect(flutter.isWidgetExpression(expression), isFalse); + expect(_flutter.isWidgetExpression(expression), isFalse); } } diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart index 4dc635238de9..d1da6d32666f 100644 --- a/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart +++ b/pkg/analysis_server/tool/completion_metrics/relevance_metrics.dart @@ -267,9 +267,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { /// The relevance data being collected. final RelevanceData data; - /// The object used to determine Flutter-specific features. - Flutter flutter; - InheritanceManager3 inheritanceManager = InheritanceManager3(); /// The library containing the compilation unit being visited. @@ -292,11 +289,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { /// [data]. RelevanceDataCollector(this.data); - /// Initialize this collector prior to visiting the unit in the [result]. - void initializeFrom(ResolvedUnitResult result) { - flutter = Flutter.of(result); - } - @override void visitAdjacentStrings(AdjacentStrings node) { // There are no completions. @@ -314,7 +306,7 @@ class RelevanceDataCollector extends RecursiveAstVisitor { var context = _argumentListContext(node); var parent = node.parent; var inWidgetConstructor = parent is InstanceCreationExpression && - flutter.isWidgetType(parent.staticType); + Flutter.instance.isWidgetType(parent.staticType); for (var argument in node.arguments) { var realArgument = argument; var argumentKind = 'unnamed'; @@ -1981,7 +1973,6 @@ class RelevanceMetricsComputer { continue; } - collector.initializeFrom(resolvedUnitResult); resolvedUnitResult.unit.accept(collector); } catch (exception, stacktrace) { print('Exception caught analyzing: "$filePath"'); diff --git a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart index 4b6d1dc18e57..dacc489a6071 100644 --- a/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart +++ b/pkg/analysis_server/tool/completion_metrics/relevance_table_generator.dart @@ -215,9 +215,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { /// The compilation unit in which data is currently being collected. CompilationUnit unit; - /// The object used to determine Flutter-specific features. - Flutter flutter; - InheritanceManager3 inheritanceManager = InheritanceManager3(); /// The library containing the compilation unit being visited. @@ -239,7 +236,6 @@ class RelevanceDataCollector extends RecursiveAstVisitor { /// Initialize this collector prior to visiting the unit in the [result]. void initializeFrom(ResolvedUnitResult result) { unit = result.unit; - flutter = Flutter.of(result); } @override @@ -1203,7 +1199,7 @@ class RelevanceDataCollector extends RecursiveAstVisitor { } else if (parent is FunctionExpressionInvocation) { return 'function'; } else if (parent is InstanceCreationExpression) { - if (flutter.isWidgetType(parent.staticType)) { + if (Flutter.instance.isWidgetType(parent.staticType)) { return 'widgetConstructor'; } return 'constructor';