Skip to content

Commit

Permalink
Add 'textToMatchOverride' for 'setState' completion.
Browse files Browse the repository at this point in the history
Bug: #49233
Change-Id: I74fd86fc7f49c932e6698e474842078ff823f3cf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247933
Commit-Queue: Konstantin Shcheglov <[email protected]>
Reviewed-by: Brian Wilkerson <[email protected]>
  • Loading branch information
scheglov authored and Commit Bot committed Jun 13, 2022
1 parent 503e723 commit 1b9554d
Show file tree
Hide file tree
Showing 6 changed files with 161 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,7 @@ class SuggestionBuilder {
// Let the user know that we are going to insert a complete statement.
displayText: 'setState(() {});',
),
textToMatchOverride: 'setState',
);
return;
}
Expand Down
19 changes: 19 additions & 0 deletions pkg/analysis_server/test/analysis_server_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import 'package:meta/meta.dart';
import 'package:test/test.dart';

import 'mocks.dart';
import 'src/utilities/mock_packages.dart';

/// TODO(scheglov) this is duplicate
class AnalysisOptionsFileConfig {
Expand Down Expand Up @@ -309,6 +310,8 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest {
void writeTestPackageConfig({
PackageConfigFileBuilder? config,
String? languageVersion,
bool flutter = false,
bool meta = false,
}) {
if (config == null) {
config = PackageConfigFileBuilder();
Expand All @@ -322,6 +325,22 @@ class PubPackageAnalysisServerTest extends ContextResolutionTest {
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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,14 @@ extension CompletionSuggestionExtension
);
}

@useResult
CheckTarget<bool?> get hasNamedParameters {
return nest(
value.suggestion.hasNamedParameters,
(selected) => 'has hasNamedParameters ${valueStr(selected)}',
);
}

void get isClass {
kind.isIdentifier;
element.isNotNull.kind.isClass;
Expand Down Expand Up @@ -311,6 +319,14 @@ extension CompletionSuggestionExtension
);
}

@useResult
CheckTarget<List<String>?> get parameterNames {
return nest(
value.suggestion.parameterNames,
(selected) => 'has parameterNames ${valueStr(selected)}',
);
}

@useResult
CheckTarget<String?> get parameterType {
return nest(
Expand All @@ -319,6 +335,14 @@ extension CompletionSuggestionExtension
);
}

@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 {
Expand All @@ -337,6 +361,14 @@ extension CompletionSuggestionExtension
);
}

@useResult
CheckTarget<int?> get requiredParameterCount {
return nest(
value.suggestion.requiredParameterCount,
(selected) => 'has requiredParameterCount ${valueStr(selected)}',
);
}

@useResult
CheckTarget<String?> get returnType {
return nest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2771,42 +2771,6 @@ class A {
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 {}
Expand Down Expand Up @@ -6366,36 +6330,4 @@ void f() async* {

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);
}
}
Original file line number Diff line number Diff line change
@@ -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,
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -16,6 +17,7 @@ import 'super_formal_parameter_test.dart' as super_formal_parameter;
/// Tests suggestions produced at specific locations.
void main() {
defineReflectiveSuite(() {
block.main();
class_body.main();
compilation_unit.main();
directive_uri.main();
Expand Down

0 comments on commit 1b9554d

Please sign in to comment.