mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 23:19:47 +00:00
Retry when fixes cannot be computed because of an inconsistent session (issue 32635)
Change-Id: I47df681dd16faa509d20440d90af0f35b158c299 Reviewed-on: https://dart-review.googlesource.com/47900 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
parent
04f5d1b974
commit
014bd821e6
|
@ -25,6 +25,7 @@ import 'package:analysis_server/src/services/correction/sort_members.dart';
|
|||
import 'package:analysis_server/src/services/correction/status.dart';
|
||||
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
|
||||
import 'package:analysis_server/src/services/search/search_engine.dart';
|
||||
import 'package:analyzer/dart/analysis/session.dart';
|
||||
import 'package:analyzer/dart/ast/ast.dart';
|
||||
import 'package:analyzer/dart/ast/standard_resolution_map.dart';
|
||||
import 'package:analyzer/dart/element/element.dart';
|
||||
|
@ -207,11 +208,9 @@ class EditDomainHandler extends AbstractRequestHandler {
|
|||
}
|
||||
|
||||
Future getFixes(Request request) async {
|
||||
var params = new EditGetFixesParams.fromRequest(request);
|
||||
EditGetFixesParams params = new EditGetFixesParams.fromRequest(request);
|
||||
String file = params.file;
|
||||
int offset = params.offset;
|
||||
|
||||
List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
|
||||
//
|
||||
// Allow plugins to start computing fixes.
|
||||
//
|
||||
|
@ -228,29 +227,12 @@ class EditDomainHandler extends AbstractRequestHandler {
|
|||
//
|
||||
// Compute fixes associated with server-generated errors.
|
||||
//
|
||||
AnalysisResult result = await server.getAnalysisResult(file);
|
||||
if (result != null) {
|
||||
CompilationUnit unit = result.unit;
|
||||
LineInfo lineInfo = result.lineInfo;
|
||||
int requestLine = lineInfo.getLocation(offset).lineNumber;
|
||||
for (engine.AnalysisError error in result.errors) {
|
||||
int errorLine = lineInfo.getLocation(error.offset).lineNumber;
|
||||
if (errorLine == requestLine) {
|
||||
var context = new _DartFixContextImpl(server.resourceProvider,
|
||||
result.driver, new AstProviderForDriver(driver), unit, error);
|
||||
List<Fix> fixes =
|
||||
await new DefaultFixContributor().internalComputeFixes(context);
|
||||
if (fixes.isNotEmpty) {
|
||||
fixes.sort(Fix.SORT_BY_RELEVANCE);
|
||||
AnalysisError serverError =
|
||||
newAnalysisError_fromEngine(lineInfo, error);
|
||||
AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
|
||||
errorFixesList.add(errorFixes);
|
||||
fixes.forEach((fix) {
|
||||
errorFixes.fixes.add(fix.change);
|
||||
});
|
||||
}
|
||||
}
|
||||
List<AnalysisErrorFixes> errorFixesList = null;
|
||||
while (errorFixesList == null) {
|
||||
try {
|
||||
errorFixesList = await _computeServerErrorFixes(driver, file, offset);
|
||||
} on InconsistentAnalysisException {
|
||||
// Loop around to try again to compute the fixes.
|
||||
}
|
||||
}
|
||||
//
|
||||
|
@ -531,6 +513,41 @@ class EditDomainHandler extends AbstractRequestHandler {
|
|||
new EditSortMembersResult(fileEdit).toResponse(request.id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute and return the fixes associated with server-generated errors.
|
||||
*/
|
||||
Future<List<AnalysisErrorFixes>> _computeServerErrorFixes(
|
||||
AnalysisDriver driver, String file, int offset) async {
|
||||
List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
|
||||
AnalysisResult result = await server.getAnalysisResult(file);
|
||||
if (result != null) {
|
||||
CompilationUnit unit = result.unit;
|
||||
LineInfo lineInfo = result.lineInfo;
|
||||
int requestLine = lineInfo.getLocation(offset).lineNumber;
|
||||
for (engine.AnalysisError error in result.errors) {
|
||||
int errorLine = lineInfo.getLocation(error.offset).lineNumber;
|
||||
if (errorLine == requestLine) {
|
||||
AstProvider astProvider = new AstProviderForDriver(driver);
|
||||
DartFixContext context = new _DartFixContextImpl(
|
||||
server.resourceProvider, result.driver, astProvider, unit, error);
|
||||
List<Fix> fixes =
|
||||
await new DefaultFixContributor().internalComputeFixes(context);
|
||||
if (fixes.isNotEmpty) {
|
||||
fixes.sort(Fix.SORT_BY_RELEVANCE);
|
||||
AnalysisError serverError =
|
||||
newAnalysisError_fromEngine(lineInfo, error);
|
||||
AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
|
||||
errorFixesList.add(errorFixes);
|
||||
fixes.forEach((fix) {
|
||||
errorFixes.fixes.add(fix.change);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return errorFixesList;
|
||||
}
|
||||
|
||||
Response _getAvailableRefactorings(Request request) {
|
||||
_getAvailableRefactoringsImpl(request);
|
||||
return Response.DELAYED_RESPONSE;
|
||||
|
|
Loading…
Reference in a new issue