A single result from a search request.
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 9d85d08bdd2eb..1280460f470c7 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -173,11 +173,10 @@ const String EDIT_REQUEST_ORGANIZE_DIRECTIVES = 'edit.organizeDirectives';
const String EDIT_REQUEST_ORGANIZE_DIRECTIVES_FILE = 'file';
const String EDIT_REQUEST_SORT_MEMBERS = 'edit.sortMembers';
const String EDIT_REQUEST_SORT_MEMBERS_FILE = 'file';
-const String EDIT_RESPONSE_DARTFIX_DESCRIPTION_OF_FIXES = 'descriptionOfFixes';
-const String EDIT_RESPONSE_DARTFIX_FIXES = 'fixes';
+const String EDIT_RESPONSE_DARTFIX_EDITS = 'edits';
const String EDIT_RESPONSE_DARTFIX_HAS_ERRORS = 'hasErrors';
-const String EDIT_RESPONSE_DARTFIX_OTHER_RECOMMENDATIONS =
- 'otherRecommendations';
+const String EDIT_RESPONSE_DARTFIX_OTHER_SUGGESTIONS = 'otherSuggestions';
+const String EDIT_RESPONSE_DARTFIX_SUGGESTIONS = 'suggestions';
const String EDIT_RESPONSE_FORMAT_EDITS = 'edits';
const String EDIT_RESPONSE_FORMAT_SELECTION_LENGTH = 'selectionLength';
const String EDIT_RESPONSE_FORMAT_SELECTION_OFFSET = 'selectionOffset';
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 2bbf169d20865..9fabb4c83ad2b 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -5931,6 +5931,105 @@ class ConvertMethodToGetterOptions extends RefactoringOptions
}
}
+/**
+ * DartFixSuggestion
+ *
+ * {
+ * "description": String
+ * "location": optional Location
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class DartFixSuggestion implements HasToJson {
+ String _description;
+
+ Location _location;
+
+ /**
+ * A human readable description of the suggested change.
+ */
+ String get description => _description;
+
+ /**
+ * A human readable description of the suggested change.
+ */
+ void set description(String value) {
+ assert(value != null);
+ this._description = value;
+ }
+
+ /**
+ * The location of the suggested change.
+ */
+ Location get location => _location;
+
+ /**
+ * The location of the suggested change.
+ */
+ void set location(Location value) {
+ this._location = value;
+ }
+
+ DartFixSuggestion(String description, {Location location}) {
+ this.description = description;
+ this.location = location;
+ }
+
+ factory DartFixSuggestion.fromJson(
+ JsonDecoder jsonDecoder, String jsonPath, Object json) {
+ if (json == null) {
+ json = {};
+ }
+ if (json is Map) {
+ String description;
+ if (json.containsKey("description")) {
+ description = jsonDecoder.decodeString(
+ jsonPath + ".description", json["description"]);
+ } else {
+ throw jsonDecoder.mismatch(jsonPath, "description");
+ }
+ Location location;
+ if (json.containsKey("location")) {
+ location = new Location.fromJson(
+ jsonDecoder, jsonPath + ".location", json["location"]);
+ }
+ return new DartFixSuggestion(description, location: location);
+ } else {
+ throw jsonDecoder.mismatch(jsonPath, "DartFixSuggestion", json);
+ }
+ }
+
+ @override
+ Map toJson() {
+ Map result = {};
+ result["description"] = description;
+ if (location != null) {
+ result["location"] = location.toJson();
+ }
+ return result;
+ }
+
+ @override
+ String toString() => json.encode(toJson());
+
+ @override
+ bool operator ==(other) {
+ if (other is DartFixSuggestion) {
+ return description == other.description && location == other.location;
+ }
+ return false;
+ }
+
+ @override
+ int get hashCode {
+ int hash = 0;
+ hash = JenkinsSmiHash.combine(hash, description.hashCode);
+ hash = JenkinsSmiHash.combine(hash, location.hashCode);
+ return JenkinsSmiHash.finish(hash);
+ }
+}
+
/**
* diagnostic.getDiagnostics params
*
@@ -6268,60 +6367,60 @@ class EditDartfixParams implements RequestParams {
* edit.dartfix result
*
* {
- * "descriptionOfFixes": List
- * "otherRecommendations": List
+ * "suggestions": List
+ * "otherSuggestions": List
* "hasErrors": bool
- * "fixes": List
+ * "edits": List
* }
*
* Clients may not extend, implement or mix-in this class.
*/
class EditDartfixResult implements ResponseResult {
- List _descriptionOfFixes;
+ List _suggestions;
- List _otherRecommendations;
+ List _otherSuggestions;
bool _hasErrors;
- List _fixes;
+ List _edits;
/**
- * A list of human readable changes made by applying the fixes.
+ * A list of recommended changes that can be automatically made by applying
+ * the 'edits' included in this response.
*/
- List get descriptionOfFixes => _descriptionOfFixes;
+ List get suggestions => _suggestions;
/**
- * A list of human readable changes made by applying the fixes.
+ * A list of recommended changes that can be automatically made by applying
+ * the 'edits' included in this response.
*/
- void set descriptionOfFixes(List value) {
+ void set suggestions(List value) {
assert(value != null);
- this._descriptionOfFixes = value;
+ this._suggestions = value;
}
/**
- * A list of human readable recommended changes that cannot be made
- * automatically.
+ * A list of recommended changes that could not be automatically made.
*/
- List get otherRecommendations => _otherRecommendations;
+ List get otherSuggestions => _otherSuggestions;
/**
- * A list of human readable recommended changes that cannot be made
- * automatically.
+ * A list of recommended changes that could not be automatically made.
*/
- void set otherRecommendations(List value) {
+ void set otherSuggestions(List value) {
assert(value != null);
- this._otherRecommendations = value;
+ this._otherSuggestions = value;
}
/**
* True if the analyzed source contains errors that might impact the
- * correctness of the recommended fixes that can be automatically applied.
+ * correctness of the recommended changes that can be automatically applied.
*/
bool get hasErrors => _hasErrors;
/**
* True if the analyzed source contains errors that might impact the
- * correctness of the recommended fixes that can be automatically applied.
+ * correctness of the recommended changes that can be automatically applied.
*/
void set hasErrors(bool value) {
assert(value != null);
@@ -6329,27 +6428,27 @@ class EditDartfixResult implements ResponseResult {
}
/**
- * The suggested fixes.
+ * A list of source edits to apply the recommended changes.
*/
- List get fixes => _fixes;
+ List get edits => _edits;
/**
- * The suggested fixes.
+ * A list of source edits to apply the recommended changes.
*/
- void set fixes(List value) {
+ void set edits(List value) {
assert(value != null);
- this._fixes = value;
+ this._edits = value;
}
EditDartfixResult(
- List descriptionOfFixes,
- List otherRecommendations,
+ List suggestions,
+ List otherSuggestions,
bool hasErrors,
- List fixes) {
- this.descriptionOfFixes = descriptionOfFixes;
- this.otherRecommendations = otherRecommendations;
+ List edits) {
+ this.suggestions = suggestions;
+ this.otherSuggestions = otherSuggestions;
this.hasErrors = hasErrors;
- this.fixes = fixes;
+ this.edits = edits;
}
factory EditDartfixResult.fromJson(
@@ -6358,23 +6457,25 @@ class EditDartfixResult implements ResponseResult {
json = {};
}
if (json is Map) {
- List descriptionOfFixes;
- if (json.containsKey("descriptionOfFixes")) {
- descriptionOfFixes = jsonDecoder.decodeList(
- jsonPath + ".descriptionOfFixes",
- json["descriptionOfFixes"],
- jsonDecoder.decodeString);
+ List suggestions;
+ if (json.containsKey("suggestions")) {
+ suggestions = jsonDecoder.decodeList(
+ jsonPath + ".suggestions",
+ json["suggestions"],
+ (String jsonPath, Object json) =>
+ new DartFixSuggestion.fromJson(jsonDecoder, jsonPath, json));
} else {
- throw jsonDecoder.mismatch(jsonPath, "descriptionOfFixes");
+ throw jsonDecoder.mismatch(jsonPath, "suggestions");
}
- List otherRecommendations;
- if (json.containsKey("otherRecommendations")) {
- otherRecommendations = jsonDecoder.decodeList(
- jsonPath + ".otherRecommendations",
- json["otherRecommendations"],
- jsonDecoder.decodeString);
+ List otherSuggestions;
+ if (json.containsKey("otherSuggestions")) {
+ otherSuggestions = jsonDecoder.decodeList(
+ jsonPath + ".otherSuggestions",
+ json["otherSuggestions"],
+ (String jsonPath, Object json) =>
+ new DartFixSuggestion.fromJson(jsonDecoder, jsonPath, json));
} else {
- throw jsonDecoder.mismatch(jsonPath, "otherRecommendations");
+ throw jsonDecoder.mismatch(jsonPath, "otherSuggestions");
}
bool hasErrors;
if (json.containsKey("hasErrors")) {
@@ -6383,18 +6484,18 @@ class EditDartfixResult implements ResponseResult {
} else {
throw jsonDecoder.mismatch(jsonPath, "hasErrors");
}
- List fixes;
- if (json.containsKey("fixes")) {
- fixes = jsonDecoder.decodeList(
- jsonPath + ".fixes",
- json["fixes"],
+ List edits;
+ if (json.containsKey("edits")) {
+ edits = jsonDecoder.decodeList(
+ jsonPath + ".edits",
+ json["edits"],
(String jsonPath, Object json) =>
new SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
} else {
- throw jsonDecoder.mismatch(jsonPath, "fixes");
+ throw jsonDecoder.mismatch(jsonPath, "edits");
}
return new EditDartfixResult(
- descriptionOfFixes, otherRecommendations, hasErrors, fixes);
+ suggestions, otherSuggestions, hasErrors, edits);
} else {
throw jsonDecoder.mismatch(jsonPath, "edit.dartfix result", json);
}
@@ -6410,11 +6511,14 @@ class EditDartfixResult implements ResponseResult {
@override
Map toJson() {
Map result = {};
- result["descriptionOfFixes"] = descriptionOfFixes;
- result["otherRecommendations"] = otherRecommendations;
+ result["suggestions"] =
+ suggestions.map((DartFixSuggestion value) => value.toJson()).toList();
+ result["otherSuggestions"] = otherSuggestions
+ .map((DartFixSuggestion value) => value.toJson())
+ .toList();
result["hasErrors"] = hasErrors;
- result["fixes"] =
- fixes.map((SourceFileEdit value) => value.toJson()).toList();
+ result["edits"] =
+ edits.map((SourceFileEdit value) => value.toJson()).toList();
return result;
}
@@ -6429,12 +6533,12 @@ class EditDartfixResult implements ResponseResult {
@override
bool operator ==(other) {
if (other is EditDartfixResult) {
- return listEqual(descriptionOfFixes, other.descriptionOfFixes,
- (String a, String b) => a == b) &&
- listEqual(otherRecommendations, other.otherRecommendations,
- (String a, String b) => a == b) &&
+ return listEqual(suggestions, other.suggestions,
+ (DartFixSuggestion a, DartFixSuggestion b) => a == b) &&
+ listEqual(otherSuggestions, other.otherSuggestions,
+ (DartFixSuggestion a, DartFixSuggestion b) => a == b) &&
hasErrors == other.hasErrors &&
- listEqual(fixes, other.fixes,
+ listEqual(edits, other.edits,
(SourceFileEdit a, SourceFileEdit b) => a == b);
}
return false;
@@ -6443,10 +6547,10 @@ class EditDartfixResult implements ResponseResult {
@override
int get hashCode {
int hash = 0;
- hash = JenkinsSmiHash.combine(hash, descriptionOfFixes.hashCode);
- hash = JenkinsSmiHash.combine(hash, otherRecommendations.hashCode);
+ hash = JenkinsSmiHash.combine(hash, suggestions.hashCode);
+ hash = JenkinsSmiHash.combine(hash, otherSuggestions.hashCode);
hash = JenkinsSmiHash.combine(hash, hasErrors.hashCode);
- hash = JenkinsSmiHash.combine(hash, fixes.hashCode);
+ hash = JenkinsSmiHash.combine(hash, edits.hashCode);
return JenkinsSmiHash.finish(hash);
}
}
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index 80b6c11d10599..80e7a05ac497f 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -122,25 +122,23 @@ class Driver {
}
Future applyFixes(EditDartfixResult result) async {
- showDescriptions('Recommended changes', result.descriptionOfFixes);
- showDescriptions(
- 'Recommended changes that cannot not be automatically applied',
- result.otherRecommendations,
- );
- if (result.descriptionOfFixes.isEmpty) {
+ showDescriptions('Recommended changes', result.suggestions);
+ showDescriptions('Recommended changes that cannot be automatically applied',
+ result.otherSuggestions);
+ if (result.suggestions.isEmpty) {
logger.stdout('');
- logger.stdout(result.otherRecommendations.isNotEmpty
- ? 'No recommended changes that cannot be automatically applied.'
+ logger.stdout(result.otherSuggestions.isNotEmpty
+ ? 'None of the recommended changes can be automatically applied.'
: 'No recommended changes.');
return;
}
logger.stdout('');
logger.stdout(ansi.emphasized('Files to be changed:'));
- for (SourceFileEdit fileEdit in result.fixes) {
+ for (SourceFileEdit fileEdit in result.edits) {
logger.stdout(' ${_relativePath(fileEdit.file)}');
}
if (shouldApplyChanges(result)) {
- for (SourceFileEdit fileEdit in result.fixes) {
+ for (SourceFileEdit fileEdit in result.edits) {
final file = new File(fileEdit.file);
String code = await file.readAsString();
for (SourceEdit edit in fileEdit.edits) {
@@ -152,13 +150,16 @@ class Driver {
}
}
- void showDescriptions(String title, List descriptions) {
- if (descriptions.isNotEmpty) {
+ void showDescriptions(String title, List suggestions) {
+ if (suggestions.isNotEmpty) {
logger.stdout('');
logger.stdout(ansi.emphasized('$title:'));
- List sorted = new List.from(descriptions)..sort();
- for (String line in sorted) {
- logger.stdout(' $line');
+ List sorted = new List.from(suggestions)
+ ..sort(compareSuggestions);
+ for (DartFixSuggestion suggestion in sorted) {
+ Location loc = suggestion.location;
+ logger.stdout(' ${_toSentenceFragment(suggestion.description)}'
+ '${loc == null ? "" : " • ${loc.startLine}:${loc.startColumn}"}');
}
}
}
@@ -327,6 +328,14 @@ class Driver {
}
}
+ int compareSuggestions(DartFixSuggestion s1, DartFixSuggestion s2) {
+ int result = s1.description.compareTo(s2.description);
+ if (result != 0) {
+ return result;
+ }
+ return (s2.location?.offset ?? 0) - (s1.location?.offset ?? 0);
+ }
+
bool shouldFilterError(AnalysisError error) {
// Do not show TODOs or errors that will be automatically fixed.