Skip to content

Commit 738e65b

Browse files
keertipCommit Queue
authored and
Commit Queue
committed
[Code completion] Add a SetStateMethodSuggestion for completions of the setState method.
Change-Id: I86a0955d45a7d62b3063c9683c883c47fe5a88dd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380964 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Keerti Parthasarathy <[email protected]>
1 parent 334a131 commit 738e65b

File tree

4 files changed

+126
-35
lines changed

4 files changed

+126
-35
lines changed

pkg/analysis_server/lib/src/services/completion/dart/candidate_suggestion.dart

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,75 @@ final class RecordLiteralNamedFieldSuggestion extends CandidateSuggestion {
763763
String get completion => field.name;
764764
}
765765

766+
/// The information about a candidate suggestion for Flutter's `setState` method.
767+
final class SetStateMethodSuggestion extends ExecutableSuggestion
768+
with MemberSuggestion {
769+
@override
770+
final MethodElement element;
771+
772+
late String _completion;
773+
774+
/// The element defined by the declaration in which the suggestion is to be
775+
/// applied, or `null` if the completion is in a static context.
776+
@override
777+
final InterfaceElement? referencingInterface;
778+
779+
/// The identation to be used for a multi-line completion.
780+
final String indent;
781+
782+
// Indicates whether _completion, _displayText, and _selectionOffset have been initialized.
783+
bool _initialized = false;
784+
785+
late int _selectionOffset;
786+
787+
late String _displayText;
788+
789+
/// Initialize a newly created candidate suggestion to suggest the [element].
790+
SetStateMethodSuggestion(
791+
{required this.element,
792+
required super.importData,
793+
required this.referencingInterface,
794+
required super.matcherScore,
795+
required this.indent,
796+
super.kind = CompletionSuggestionKind.INVOCATION});
797+
798+
@override
799+
String get completion {
800+
_init();
801+
return _completion;
802+
}
803+
804+
/// Text to be displayed in a completion pop-up.
805+
String get displayText {
806+
_init();
807+
return _displayText;
808+
}
809+
810+
/// The offset, from the beginning of the inserted text, where the cursor
811+
/// should be positioned.
812+
int get selectionOffset {
813+
_init();
814+
return _selectionOffset;
815+
}
816+
817+
void _init() {
818+
if (_initialized) {
819+
return;
820+
}
821+
// Build the completion and the selection offset.
822+
var buffer = StringBuffer();
823+
buffer.writeln('setState(() {');
824+
buffer.write('$indent ');
825+
_selectionOffset = buffer.length;
826+
buffer.writeln();
827+
buffer.write('$indent});');
828+
_completion = buffer.toString();
829+
_displayText = 'setState(() {});';
830+
831+
_initialized = true;
832+
}
833+
}
834+
766835
/// The information about a candidate suggestion based on a static field in a
767836
/// location where the name of the field must be qualified by the name of the
768837
/// enclosing element.
@@ -1066,6 +1135,18 @@ extension SuggestionBuilderExtension on SuggestionBuilder {
10661135
appendColon: suggestion.appendColon,
10671136
appendComma: suggestion.appendComma,
10681137
);
1138+
case SetStateMethodSuggestion():
1139+
var inheritanceDistance =
1140+
suggestion.inheritanceDistance(request.featureComputer);
1141+
suggestSetStateMethod(
1142+
suggestion.element,
1143+
kind: suggestion.kind,
1144+
completion: suggestion.completion,
1145+
displayText: suggestion.displayText,
1146+
selectionOffset: suggestion.selectionOffset,
1147+
inheritanceDistance: inheritanceDistance,
1148+
relevance: relevance,
1149+
);
10691150
case StaticFieldSuggestion():
10701151
suggestStaticField(suggestion.element,
10711152
prefix: suggestion.prefix, relevance: relevance);

pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:analysis_server/src/services/completion/dart/completion_state.da
1010
import 'package:analysis_server/src/services/completion/dart/not_imported_completion_pass.dart';
1111
import 'package:analysis_server/src/services/completion/dart/suggestion_collector.dart';
1212
import 'package:analysis_server/src/services/completion/dart/visibility_tracker.dart';
13+
import 'package:analysis_server/src/utilities/extensions/flutter.dart';
1314
import 'package:analyzer/dart/ast/ast.dart';
1415
import 'package:analyzer/dart/element/element.dart';
1516
import 'package:analyzer/dart/element/type.dart';
@@ -1662,6 +1663,19 @@ class DeclarationHelper {
16621663
}
16631664
var matcherScore = state.matcher.score(method.displayName);
16641665
if (matcherScore != -1) {
1666+
var enclosingElement = method.enclosingElement;
1667+
if (method.name == 'setState' &&
1668+
enclosingElement is ClassElement &&
1669+
enclosingElement.isExactState) {
1670+
var suggestion = SetStateMethodSuggestion(
1671+
element: method,
1672+
importData: importData,
1673+
referencingInterface: referencingInterface,
1674+
matcherScore: matcherScore,
1675+
indent: state.indent);
1676+
collector.addSuggestion(suggestion);
1677+
return;
1678+
}
16651679
var suggestion = MethodSuggestion(
16661680
kind: _executableSuggestionKind,
16671681
element: method,

pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ class RelevanceComputer {
191191
);
192192
case RecordLiteralNamedFieldSuggestion():
193193
return Relevance.requiredNamedArgument;
194+
case SetStateMethodSuggestion():
195+
return _computeMethodRelevance(
196+
suggestion.element,
197+
suggestion.inheritanceDistance(featureComputer),
198+
suggestion.isNotImported,
199+
);
194200
case StaticFieldSuggestion():
195201
return _computeStaticFieldRelevance(
196202
suggestion.element,

pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -744,41 +744,6 @@ class SuggestionBuilder {
744744
inheritanceDistance: inheritanceDistance,
745745
);
746746

747-
var enclosingElement = method.enclosingElement;
748-
if (method.name == 'setState' &&
749-
enclosingElement is ClassElement &&
750-
enclosingElement.isExactState) {
751-
// TODO(brianwilkerson): Make this more efficient by creating the correct
752-
// suggestion in the first place.
753-
// Find the line indentation.
754-
var indent = getRequestLineIndent(request);
755-
756-
// Build the completion and the selection offset.
757-
var buffer = StringBuffer();
758-
buffer.writeln('setState(() {');
759-
buffer.write('$indent ');
760-
var selectionOffset = buffer.length;
761-
buffer.writeln();
762-
buffer.write('$indent});');
763-
764-
_addSuggestion(
765-
DartCompletionSuggestion(
766-
kind,
767-
relevance,
768-
buffer.toString(),
769-
selectionOffset,
770-
0,
771-
false,
772-
false,
773-
// Let the user know that we are going to insert a complete statement.
774-
displayText: 'setState(() {});',
775-
elementLocation: method.location,
776-
),
777-
textToMatchOverride: 'setState',
778-
);
779-
return;
780-
}
781-
782747
_addBuilder(
783748
_createCompletionSuggestionBuilder(
784749
method,
@@ -1038,6 +1003,31 @@ class SuggestionBuilder {
10381003
);
10391004
}
10401005

1006+
/// Add a suggestion for the Flutter's `setState` method.
1007+
void suggestSetStateMethod(MethodElement method,
1008+
{required CompletionSuggestionKind kind,
1009+
required String completion,
1010+
required String displayText,
1011+
required int selectionOffset,
1012+
required double inheritanceDistance,
1013+
required int relevance}) {
1014+
_addSuggestion(
1015+
DartCompletionSuggestion(
1016+
kind,
1017+
relevance,
1018+
completion,
1019+
selectionOffset,
1020+
0,
1021+
false,
1022+
false,
1023+
// Let the user know that we are going to insert a complete statement.
1024+
displayText: displayText,
1025+
elementLocation: method.location,
1026+
),
1027+
textToMatchOverride: 'setState',
1028+
);
1029+
}
1030+
10411031
/// Add a suggestion for a static field declared within a class or extension.
10421032
/// If the field is synthetic, add the corresponding getter instead.
10431033
///

0 commit comments

Comments
 (0)