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