diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 2689506f371..85a4474eac5 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -141,6 +141,7 @@ const String COMPLETION_REQUEST_GET_SUGGESTIONS2 = 'completion.getSuggestions2';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 8cd904d16f8..082036f72f7 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@ class CompletionGetSuggestions2Params implements RequestParams {
/// to true.
int maxResults;
- CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+ /// The approximate time in milliseconds that the server should spend. The
+ /// server will perform some steps anyway, even if it takes longer than the
+ /// specified timeout. This field is intended to be used for benchmarking,
+ /// and usually should not be provided, so that the default timeout is used.
+ int? timeout;
+
+ CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+ {this.timeout});
factory CompletionGetSuggestions2Params.fromJson(
JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@ class CompletionGetSuggestions2Params implements RequestParams {
} else {
throw jsonDecoder.mismatch(jsonPath, 'maxResults');
}
- return CompletionGetSuggestions2Params(file, offset, maxResults);
+ int? timeout;
+ if (json.containsKey('timeout')) {
+ timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+ }
+ return CompletionGetSuggestions2Params(file, offset, maxResults,
+ timeout: timeout);
} else {
throw jsonDecoder.mismatch(
jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@ class CompletionGetSuggestions2Params implements RequestParams {
result['file'] = file;
result['offset'] = offset;
result['maxResults'] = maxResults;
+ var timeout = this.timeout;
+ if (timeout != null) {
+ result['timeout'] = timeout;
+ }
return result;
}
@@ -4757,7 +4773,8 @@ class CompletionGetSuggestions2Params implements RequestParams {
if (other is CompletionGetSuggestions2Params) {
return file == other.file &&
offset == other.offset &&
- maxResults == other.maxResults;
+ maxResults == other.maxResults &&
+ timeout == other.timeout;
}
return false;
}
@@ -4767,6 +4784,7 @@ class CompletionGetSuggestions2Params implements RequestParams {
file,
offset,
maxResults,
+ timeout,
);
}
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index cfc49ebba7a..60c81b6a84b 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -267,12 +267,17 @@ class CompletionDomainHandler extends AbstractRequestHandler {
/// Implement the 'completion.getSuggestions2' request.
void getSuggestions2(Request request) async {
- var budget = CompletionBudget(budgetDuration);
-
var params = CompletionGetSuggestions2Params.fromRequest(request);
var file = params.file;
var offset = params.offset;
+ var timeoutMilliseconds = params.timeout;
+ var budget = CompletionBudget(
+ timeoutMilliseconds != null
+ ? Duration(milliseconds: timeoutMilliseconds)
+ : budgetDuration,
+ );
+
var provider = server.resourceProvider;
var pathContext = provider.pathContext;
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index 9a707cfd852..aa0d470a9a4 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1020,9 +1020,11 @@ abstract class IntegrationTestMixin {
/// True if the number of suggestions after filtering was greater than the
/// requested maxResults.
Future sendCompletionGetSuggestions2(
- String file, int offset, int maxResults) async {
- var params =
- CompletionGetSuggestions2Params(file, offset, maxResults).toJson();
+ String file, int offset, int maxResults,
+ {int? timeout}) async {
+ var params = CompletionGetSuggestions2Params(file, offset, maxResults,
+ timeout: timeout)
+ .toJson();
var result = await server.send('completion.getSuggestions2', params);
var decoder = ResponseDecoder(null);
return CompletionGetSuggestions2Result.fromJson(decoder, 'result', result);
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 5fd8c3cfaf1..70848d4a6ba 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -2139,7 +2139,8 @@ final Matcher isCompletionGetSuggestionDetailsResult = LazyMatcher(() =>
/// }
final Matcher isCompletionGetSuggestions2Params = LazyMatcher(() =>
MatchesJsonObject('completion.getSuggestions2 params',
- {'file': isFilePath, 'offset': isInt, 'maxResults': isInt}));
+ {'file': isFilePath, 'offset': isInt, 'maxResults': isInt},
+ optionalFields: {'timeout': isInt}));
/// completion.getSuggestions2 result
///
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 9f7e268f747..21085163fc0 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -441,8 +441,12 @@ public interface AnalysisServer {
* @param offset The offset within the file at which suggestions are to be made.
* @param maxResults The maximum number of suggestions to return. If the number of suggestions
* after filtering is greater than the maxResults, then isIncomplete is set to true.
+ * @param timeout The approximate time in milliseconds that the server should spend. The server
+ * will perform some steps anyway, even if it takes longer than the specified timeout. This
+ * field is intended to be used for benchmarking, and usually should not be provided, so
+ * that the default timeout is used.
*/
- public void completion_getSuggestions2(String file, int offset, int maxResults, GetSuggestions2Consumer consumer);
+ public void completion_getSuggestions2(String file, int offset, int maxResults, int timeout, GetSuggestions2Consumer consumer);
/**
* {@code completion.registerLibraryPaths}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index aa08d7450a5..d89a44b8f07 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1482,6 +1482,16 @@
then isIncomplete is set to true.
+
+ [int]
+
+ The approximate time in milliseconds that the server should spend.
+ The server will perform some steps anyway, even if it takes longer
+ than the specified timeout. This field is intended to be used for
+ benchmarking, and usually should not be provided, so that the
+ default timeout is used.
+
+
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 2689506f371..85a4474eac5 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -141,6 +141,7 @@ const String COMPLETION_REQUEST_GET_SUGGESTIONS2 = 'completion.getSuggestions2';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index 2dcbd32b065..2ebd67f4bb3 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@ class CompletionGetSuggestions2Params implements RequestParams {
/// to true.
int maxResults;
- CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+ /// The approximate time in milliseconds that the server should spend. The
+ /// server will perform some steps anyway, even if it takes longer than the
+ /// specified timeout. This field is intended to be used for benchmarking,
+ /// and usually should not be provided, so that the default timeout is used.
+ int? timeout;
+
+ CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+ {this.timeout});
factory CompletionGetSuggestions2Params.fromJson(
JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@ class CompletionGetSuggestions2Params implements RequestParams {
} else {
throw jsonDecoder.mismatch(jsonPath, 'maxResults');
}
- return CompletionGetSuggestions2Params(file, offset, maxResults);
+ int? timeout;
+ if (json.containsKey('timeout')) {
+ timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+ }
+ return CompletionGetSuggestions2Params(file, offset, maxResults,
+ timeout: timeout);
} else {
throw jsonDecoder.mismatch(
jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@ class CompletionGetSuggestions2Params implements RequestParams {
result['file'] = file;
result['offset'] = offset;
result['maxResults'] = maxResults;
+ var timeout = this.timeout;
+ if (timeout != null) {
+ result['timeout'] = timeout;
+ }
return result;
}
@@ -4757,7 +4773,8 @@ class CompletionGetSuggestions2Params implements RequestParams {
if (other is CompletionGetSuggestions2Params) {
return file == other.file &&
offset == other.offset &&
- maxResults == other.maxResults;
+ maxResults == other.maxResults &&
+ timeout == other.timeout;
}
return false;
}
@@ -4767,6 +4784,7 @@ class CompletionGetSuggestions2Params implements RequestParams {
file,
offset,
maxResults,
+ timeout,
);
}