Chromium Code Reviews| 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 c611d3fa05f0402f5619d0fc61b65d45a984c310..3f3202ac711b4142963f6b595f738c98a81490a2 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,20 @@ class _RefactoringManager { |
| RefactoringStatus optionsStatus; |
| RefactoringStatus finalStatus; |
| - String requestId; |
| + bool _cancelled = false; |
| + 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 +317,23 @@ class _RefactoringManager { |
| refactoring is RenameRefactoring; |
| } |
| - void getRefactoring(Request request) { |
| + /** |
| + * Marks the current request as cancelled and clean ups. |
|
Paul Berry
2015/01/27 17:50:28
s/and clean ups/and cleans up/
scheglov
2015/01/27 19:23:55
Done.
|
| + */ |
| + void cancel() { |
| + _cancelled = true; |
| + onAnalysisStartedSubscription.cancel(); |
| + } |
| + |
| + 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) { |
| @@ -346,7 +376,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(); |
| }); |
| } |
| @@ -518,15 +548,19 @@ class _RefactoringManager { |
| } |
| void _sendResultResponse() { |
| + if (_cancelled) { |
| + server.sendResponse(new Response.refactoringRequestCancelled(request)); |
|
Paul Berry
2015/01/27 17:50:28
Why wait until here to send the response? Why not
scheglov
2015/01/27 19:23:55
Good idea!
Done.
|
| + return; |
| + } |
| 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; |
| } |