Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Unified Diff: pkg/analysis_server/lib/src/edit/edit_domain.dart

Issue 884453002: Issue 22157. Cancel a pending refactoring request on receiving a new one. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Tweaks for review comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/doc/api.html ('k') | pkg/analysis_server/lib/src/generated_protocol.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/edit/edit_domain.dart
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 22d01654654b05b5deb1e6f5fc899491154d5003..5e2723cf33e8ab1fe768f740eba8a8d4212083ef 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -53,7 +53,7 @@ class EditDomainHandler implements RequestHandler {
*/
EditDomainHandler(this.server) {
searchEngine = server.searchEngine;
- refactoringManager = new _RefactoringManager(server, searchEngine);
+ _newRefactoringManager();
}
Response format(Request request) {
@@ -192,8 +192,7 @@ class EditDomainHandler implements RequestHandler {
} else if (requestName == EDIT_GET_FIXES) {
return getFixes(request);
} else if (requestName == EDIT_GET_REFACTORING) {
- refactoringManager.getRefactoring(request);
- return Response.DELAYED_RESPONSE;
+ return _getRefactoring(request);
} else if (requestName == EDIT_SORT_MEMBERS) {
return sortMembers(request);
}
@@ -239,6 +238,22 @@ class EditDomainHandler implements RequestHandler {
SourceFileEdit fileEdit = new SourceFileEdit(file, fileStamp, edits: edits);
return new EditSortMembersResult(fileEdit).toResponse(request.id);
}
+
+ Response _getRefactoring(Request request) {
+ if (refactoringManager.hasPendingRequest) {
+ refactoringManager.cancel();
+ _newRefactoringManager();
+ }
+ refactoringManager.getRefactoring(request);
+ return Response.DELAYED_RESPONSE;
+ }
+
+ /**
+ * Initializes [refactoringManager] with a new instance.
+ */
+ void _newRefactoringManager() {
+ refactoringManager = new _RefactoringManager(server, searchEngine);
+ }
}
@@ -259,6 +274,7 @@ class _RefactoringManager {
final AnalysisServer server;
final SearchEngine searchEngine;
+ StreamSubscription onAnalysisStartedSubscription;
RefactoringKind kind;
String file;
@@ -270,14 +286,19 @@ class _RefactoringManager {
RefactoringStatus optionsStatus;
RefactoringStatus finalStatus;
- String requestId;
+ Request request;
EditGetRefactoringResult result;
_RefactoringManager(this.server, this.searchEngine) {
- server.onAnalysisStarted.listen(_reset);
+ onAnalysisStartedSubscription = server.onAnalysisStarted.listen(_reset);
_reset();
}
+ /**
+ * Returns `true` if a response for the current request has not yet been sent.
+ */
+ bool get hasPendingRequest => request != null;
+
bool get _hasFatalError {
return initStatus.hasFatalError ||
optionsStatus.hasFatalError ||
@@ -295,15 +316,24 @@ class _RefactoringManager {
refactoring is RenameRefactoring;
}
- void getRefactoring(Request request) {
+ /**
+ * Cancels processing of the current request and cleans up.
+ */
+ void cancel() {
+ onAnalysisStartedSubscription.cancel();
+ server.sendResponse(new Response.refactoringRequestCancelled(request));
+ request = null;
+ }
+
+ void getRefactoring(Request _request) {
// prepare for processing the request
- requestId = request.id;
+ request = _request;
result = new EditGetRefactoringResult(
EMPTY_PROBLEM_LIST,
EMPTY_PROBLEM_LIST,
EMPTY_PROBLEM_LIST);
// process the request
- var params = new EditGetRefactoringParams.fromRequest(request);
+ var params = new EditGetRefactoringParams.fromRequest(_request);
runZoned(() async {
await _init(params.kind, params.file, params.offset, params.length);
if (initStatus.hasFatalError) {
@@ -351,7 +381,7 @@ class _RefactoringManager {
}, onError: (exception, stackTrace) {
server.instrumentationService.logException(exception, stackTrace);
server.sendResponse(
- new Response.serverError(request, exception, stackTrace));
+ new Response.serverError(_request, exception, stackTrace));
_reset();
});
}
@@ -524,15 +554,20 @@ class _RefactoringManager {
}
void _sendResultResponse() {
+ // ignore if was cancelled
+ if (request == null) {
+ return;
+ }
+ // set feedback
result.feedback = feedback;
// set problems
result.initialProblems = initStatus.problems;
result.optionsProblems = optionsStatus.problems;
result.finalProblems = finalStatus.problems;
// send the response
- server.sendResponse(result.toResponse(requestId));
+ server.sendResponse(result.toResponse(request.id));
// done with this request
- requestId = null;
+ request = null;
result = null;
}
« no previous file with comments | « pkg/analysis_server/doc/api.html ('k') | pkg/analysis_server/lib/src/generated_protocol.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698