Version 2.18.0-181.0.dev

Merge commit '1b9554d481ab61ab4c9196e0d2af5628987ae34d' into 'dev'
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 0dc2490..a9d3bc5 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
@@ -733,6 +733,7 @@
           // Let the user know that we are going to insert a complete statement.
           displayText: 'setState(() {});',
         ),
+        textToMatchOverride: 'setState',
       );
       return;
     }
diff --git a/pkg/analysis_server/test/analysis_server_base.dart b/pkg/analysis_server/test/analysis_server_base.dart
index 411aa3f..be54d67 100644
--- a/pkg/analysis_server/test/analysis_server_base.dart
+++ b/pkg/analysis_server/test/analysis_server_base.dart
@@ -21,6 +21,7 @@
 import 'package:test/test.dart';
 
 import 'mocks.dart';
+import 'src/utilities/mock_packages.dart';
 
 /// TODO(scheglov) this is duplicate
 class AnalysisOptionsFileConfig {
@@ -309,6 +310,8 @@
   void writeTestPackageConfig({
     PackageConfigFileBuilder? config,
     String? languageVersion,
+    bool flutter = false,
+    bool meta = false,
   }) {
     if (config == null) {
       config = PackageConfigFileBuilder();
@@ -322,6 +325,22 @@
       languageVersion: languageVersion,
     );
 
+    if (meta || flutter) {
+      var libFolder = MockPackages.instance.addMeta(resourceProvider);
+      config.add(name: 'meta', rootPath: libFolder.parent.path);
+    }
+
+    if (flutter) {
+      {
+        var libFolder = MockPackages.instance.addUI(resourceProvider);
+        config.add(name: 'ui', rootPath: libFolder.parent.path);
+      }
+      {
+        var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+        config.add(name: 'flutter', rootPath: libFolder.parent.path);
+      }
+    }
+
     writePackageConfig(testPackageRoot, config);
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index 0a2ffad..313959e 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -185,6 +185,14 @@
     );
   }
 
+  @useResult
+  CheckTarget<bool?> get hasNamedParameters {
+    return nest(
+      value.suggestion.hasNamedParameters,
+      (selected) => 'has hasNamedParameters ${valueStr(selected)}',
+    );
+  }
+
   void get isClass {
     kind.isIdentifier;
     element.isNotNull.kind.isClass;
@@ -312,6 +320,14 @@
   }
 
   @useResult
+  CheckTarget<List<String>?> get parameterNames {
+    return nest(
+      value.suggestion.parameterNames,
+      (selected) => 'has parameterNames ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<String?> get parameterType {
     return nest(
       value.suggestion.parameterType,
@@ -319,6 +335,14 @@
     );
   }
 
+  @useResult
+  CheckTarget<List<String>?> get parameterTypes {
+    return nest(
+      value.suggestion.parameterTypes,
+      (selected) => 'has parameterTypes ${valueStr(selected)}',
+    );
+  }
+
   /// Return the effective replacement length.
   @useResult
   CheckTarget<int> get replacementLength {
@@ -338,6 +362,14 @@
   }
 
   @useResult
+  CheckTarget<int?> get requiredParameterCount {
+    return nest(
+      value.suggestion.requiredParameterCount,
+      (selected) => 'has requiredParameterCount ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<String?> get returnType {
     return nest(
       value.suggestion.returnType,
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index db03ff4..f8fccbe 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -2771,42 +2771,6 @@
     assertNoSuggestions();
   }
 
-  Future<void> test_flutter_setState_hasPrefix() async {
-    var spaces_4 = ' ' * 4;
-    var spaces_6 = ' ' * 6;
-    await _check_flutter_setState(
-        '    setSt',
-        '''
-setState(() {
-$spaces_6
-$spaces_4});''',
-        20);
-  }
-
-  Future<void> test_flutter_setState_longPrefix() async {
-    var spaces_6 = ' ' * 6;
-    var spaces_8 = ' ' * 8;
-    await _check_flutter_setState(
-        '      setSt',
-        '''
-setState(() {
-$spaces_8
-$spaces_6});''',
-        22);
-  }
-
-  Future<void> test_flutter_setState_noPrefix() async {
-    var spaces_4 = ' ' * 4;
-    var spaces_6 = ' ' * 6;
-    await _check_flutter_setState(
-        '    ',
-        '''
-setState(() {
-$spaces_6
-$spaces_4});''',
-        20);
-  }
-
   Future<void> test_forEachPartsWithIdentifier_class() async {
     addTestSource('''
 class C {}
@@ -6366,36 +6330,4 @@
 
     assertSuggestLocalVariable('value', null);
   }
-
-  Future<void> _check_flutter_setState(
-      String line, String completion, int selectionOffset) async {
-    writeTestPackageConfig(flutter: true);
-    addTestSource('''
-import 'package:flutter/widgets.dart';
-
-class TestWidget extends StatefulWidget {
-  @override
-  State<TestWidget> createState() {
-    return new TestWidgetState();
-  }
-}
-
-class TestWidgetState extends State<TestWidget> {
-  @override
-  Widget build(BuildContext context) {
-$line^
-  }
-}
-''');
-    await computeSuggestions();
-    var cs = assertSuggest(completion, selectionOffset: selectionOffset);
-    expect(cs.selectionLength, 0);
-
-    // It is an invocation, but we don't need any additional info for it.
-    // So, all parameter information is absent.
-    expect(cs.parameterNames, isNull);
-    expect(cs.parameterTypes, isNull);
-    expect(cs.requiredParameterCount, isNull);
-    expect(cs.hasNamedParameters, isNull);
-  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/block_test.dart b/pkg/analysis_server/test/services/completion/dart/location/block_test.dart
new file mode 100644
index 0000000..bf80f1b
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/location/block_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(BlockTest1);
+    defineReflectiveTests(BlockTest2);
+  });
+}
+
+@reflectiveTest
+class BlockTest1 extends AbstractCompletionDriverTest with BlockTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class BlockTest2 extends AbstractCompletionDriverTest with BlockTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin BlockTestCases on AbstractCompletionDriverTest {
+  static final spaces_4 = ' ' * 4;
+  static final spaces_6 = ' ' * 6;
+  static final spaces_8 = ' ' * 8;
+
+  Future<void> test_flutter_setState_indent6_hasPrefix() async {
+    await _check_flutter_setState(
+      line: '${spaces_6}setSt^',
+      completion: '''
+setState(() {
+$spaces_8
+$spaces_6});''',
+      selectionOffset: 22,
+    );
+  }
+
+  Future<void> test_flutter_setState_indent_hasPrefix() async {
+    await _check_flutter_setState(
+      line: '${spaces_4}setSt^',
+      completion: '''
+setState(() {
+$spaces_6
+$spaces_4});''',
+      selectionOffset: 20,
+    );
+  }
+
+  Future<void> test_flutter_setState_indent_noPrefix() async {
+    await _check_flutter_setState(
+      line: '$spaces_4^',
+      completion: '''
+setState(() {
+$spaces_6
+$spaces_4});''',
+      selectionOffset: 20,
+    );
+  }
+
+  Future<void> _check_flutter_setState({
+    required String line,
+    required String completion,
+    required int selectionOffset,
+  }) async {
+    writeTestPackageConfig(flutter: true);
+
+    var response = await getTestCodeSuggestions('''
+import 'package:flutter/widgets.dart';
+
+class TestWidget extends StatefulWidget {
+  @override
+  State<TestWidget> createState() {
+    return TestWidgetState();
+  }
+}
+
+class TestWidgetState extends State<TestWidget> {
+  @override
+  Widget build(BuildContext context) {
+$line
+  }
+}
+''');
+
+    check(response).suggestions.includesAll([
+      (suggestion) => suggestion
+        ..completion.startsWith('setState')
+        ..completion.isEqualTo(completion)
+        ..hasSelection(offset: selectionOffset)
+        // It is an invocation, but we don't need any additional info for it.
+        // So, all parameter information is absent.
+        ..kind.isInvocation
+        ..parameterNames.isNull
+        ..parameterTypes.isNull
+        ..requiredParameterCount.isNull
+        ..hasNamedParameters.isNull,
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
index 467a484..139de2f 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'block_test.dart' as block;
 import 'class_body_test.dart' as class_body;
 import 'compilation_unit_test.dart' as compilation_unit;
 import 'directive_uri_test.dart' as directive_uri;
@@ -16,6 +17,7 @@
 /// Tests suggestions produced at specific locations.
 void main() {
   defineReflectiveSuite(() {
+    block.main();
     class_body.main();
     compilation_unit.main();
     directive_uri.main();
diff --git a/tools/VERSION b/tools/VERSION
index edc1e69..e94213d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 180
+PRERELEASE 181
 PRERELEASE_PATCH 0
\ No newline at end of file