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

Side by Side Diff: pkg/analysis_server/lib/src/services/correction/change.dart

Issue 479683005: Make more use of generated code in analysis server. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library services.correction.change; 5 library services.correction.change;
6 6
7 import 'package:analysis_server/src/constants.dart'; 7 import 'package:analysis_server/src/constants.dart';
8 import 'package:analysis_server/src/protocol2.dart'; 8 import 'package:analysis_server/src/protocol2.dart';
9 import 'package:analysis_server/src/services/json.dart'; 9 import 'package:analysis_server/src/services/json.dart';
10 10
11 11
12 /** 12 /**
13 * A description of a single change to one or more files.  13 * A description of a single change to one or more files. 
14 */ 14 */
15 class Change implements HasToJson { 15 class Change implements HasToJson {
16 /** 16 /**
17 * A textual description of the change to be applied.  17 * A textual description of the change to be applied. 
18 */ 18 */
19 final String message; 19 final String message;
20 20
21 /** 21 /**
22 * A list of the [FileEdit]s used to effect the change.  22 * A list of the [FileEdit]s used to effect the change. 
23 */ 23 */
24 final List<FileEdit> fileEdits = <FileEdit>[]; 24 final List<SourceFileEdit> fileEdits = <SourceFileEdit>[];
25 25
26 /** 26 /**
27 * A list of the [LinkedEditGroup]s in the change.  27 * A list of the [LinkedEditGroup]s in the change. 
28 */ 28 */
29 final List<LinkedEditGroup> linkedEditGroups = <LinkedEditGroup>[]; 29 final List<LinkedEditGroup> linkedEditGroups = <LinkedEditGroup>[];
30 30
31 /** 31 /**
32 * The position that should be selected after the edits have been applied. 32 * The position that should be selected after the edits have been applied.
33 */ 33 */
34 Position selection; 34 Position selection;
35 35
36 Change(this.message); 36 Change(this.message);
37 37
38 /** 38 /**
39 * Adds [edit] to the [FileEdit] for the given [file]. 39 * Adds [edit] to the [FileEdit] for the given [file].
40 */ 40 */
41 void addEdit(String file, SourceEdit edit) { 41 void addEdit(String file, SourceEdit edit) {
42 FileEdit fileEdit = getFileEdit(file); 42 SourceFileEdit fileEdit = getFileEdit(file);
43 if (fileEdit == null) { 43 if (fileEdit == null) {
44 fileEdit = new FileEdit(file); 44 fileEdit = new SourceFileEdit(file, <SourceEdit>[]);
scheglov 2014/08/21 18:03:22 Can we get rid of the second parameter in the cons
Paul Berry 2014/08/21 20:00:44 I think so. I'll work on this in a separate CL.
45 addFileEdit(fileEdit); 45 addFileEdit(fileEdit);
46 } 46 }
47 fileEdit.add(edit); 47 fileEdit.add(edit);
48 } 48 }
49 49
50 /** 50 /**
51 * Adds the given [FileEdit]. 51 * Adds the given [FileEdit].
52 */ 52 */
53 void addFileEdit(FileEdit edit) { 53 void addFileEdit(SourceFileEdit edit) {
54 fileEdits.add(edit); 54 fileEdits.add(edit);
55 } 55 }
56 56
57 /** 57 /**
58 * Adds the given [LinkedEditGroup]. 58 * Adds the given [LinkedEditGroup].
59 */ 59 */
60 void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) { 60 void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) {
61 linkedEditGroups.add(linkedEditGroup); 61 linkedEditGroups.add(linkedEditGroup);
62 } 62 }
63 63
64 /** 64 /**
65 * Returns the [FileEdit] for the given [file], maybe `null`. 65 * Returns the [FileEdit] for the given [file], maybe `null`.
66 */ 66 */
67 FileEdit getFileEdit(String file) { 67 SourceFileEdit getFileEdit(String file) {
68 for (FileEdit fileEdit in fileEdits) { 68 for (SourceFileEdit fileEdit in fileEdits) {
69 if (fileEdit.file == file) { 69 if (fileEdit.file == file) {
70 return fileEdit; 70 return fileEdit;
71 } 71 }
72 } 72 }
73 return null; 73 return null;
74 } 74 }
75 75
76 @override 76 @override
77 Map<String, Object> toJson() { 77 Map<String, Object> toJson() {
78 Map<String, Object> json = { 78 Map<String, Object> json = {
79 MESSAGE: message, 79 MESSAGE: message,
80 EDITS: objectToJson(fileEdits), 80 EDITS: objectToJson(fileEdits),
81 LINKED_EDIT_GROUPS: objectToJson(linkedEditGroups) 81 LINKED_EDIT_GROUPS: objectToJson(linkedEditGroups)
82 }; 82 };
83 if (selection != null) { 83 if (selection != null) {
84 json[SELECTION] = selection.toJson(); 84 json[SELECTION] = selection.toJson();
85 } 85 }
86 return json; 86 return json;
87 } 87 }
88 88
89 @override 89 @override
90 String toString() => 90 String toString() =>
91 'Change(message=$message, edits=$fileEdits, ' 91 'Change(message=$message, edits=$fileEdits, '
92 'linkedEditGroups=$linkedEditGroups, selection=$selection)'; 92 'linkedEditGroups=$linkedEditGroups, selection=$selection)';
93 } 93 }
94 94
95 95
96 /** 96 /**
97 * A description of a set of changes to a single file.
98 *
99 * [Edit]s are added in the order of decreasing offset, so they are easy to
100 * apply to the original file content without correcting offsets.
101 */
102 class FileEdit implements HasToJson {
103 /**
104 * The file to be modified.
105 */
106 final String file;
107
108 /**
109 * A list of the [Edit]s used to effect the change. 
110 */
111 final List<SourceEdit> edits = <SourceEdit>[];
112
113 FileEdit(this.file);
114
115 /**
116 * Adds the given [Edit] to the list.
117 */
118 void add(SourceEdit edit) {
119 int index = 0;
120 while (index < edits.length && edits[index].offset > edit.offset) {
121 index++;
122 }
123 edits.insert(index, edit);
124 }
125
126 /**
127 * Adds the given [Edit]s.
128 */
129 void addAll(Iterable<SourceEdit> edits) {
130 edits.forEach(add);
131 }
132
133 @override
134 Map<String, Object> toJson() {
135 return {
136 FILE: file,
137 EDITS: objectToJson(edits)
138 };
139 }
140
141 @override
142 String toString() => "FileEdit(file=$file, edits=$edits)";
143 }
144
145
146 /**
147 * A group of linked [Position]s in multiple files that are simultaneously 97 * A group of linked [Position]s in multiple files that are simultaneously
148 * modified - if one gets edited, all other positions in a group are edited the 98 * modified - if one gets edited, all other positions in a group are edited the
149 * same way. All linked positions in a group have the same content. 99 * same way. All linked positions in a group have the same content.
150 */ 100 */
151 class LinkedEditGroup implements HasToJson { 101 class LinkedEditGroup implements HasToJson {
152 int length; 102 int length;
153 final List<Position> positions = <Position>[]; 103 final List<Position> positions = <Position>[];
154 final List<LinkedEditSuggestion> suggestions = <LinkedEditSuggestion>[]; 104 final List<LinkedEditSuggestion> suggestions = <LinkedEditSuggestion>[];
155 105
156 void addPosition(Position position, int length) { 106 void addPosition(Position position, int length) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 static const PARAMETER = const LinkedEditSuggestionKind('PARAMETER'); 165 static const PARAMETER = const LinkedEditSuggestionKind('PARAMETER');
216 static const TYPE = const LinkedEditSuggestionKind('TYPE'); 166 static const TYPE = const LinkedEditSuggestionKind('TYPE');
217 static const VARIABLE = const LinkedEditSuggestionKind('VARIABLE'); 167 static const VARIABLE = const LinkedEditSuggestionKind('VARIABLE');
218 final String name; 168 final String name;
219 169
220 const LinkedEditSuggestionKind(this.name); 170 const LinkedEditSuggestionKind(this.name);
221 171
222 @override 172 @override
223 String toString() => name; 173 String toString() => name;
224 } 174 }
225
226
227 /**
228 * A position in a file.
229 */
230 class Position implements HasToJson {
231 final String file;
232 final int offset;
233
234 Position(this.file, this.offset);
235
236 int get hashCode {
237 int hash = file.hashCode;
238 hash = hash * 31 + offset;
239 return hash;
240 }
241
242 bool operator ==(other) {
243 if (other is Position) {
244 return other.file == file && other.offset == offset;
245 }
246 return false;
247 }
248
249 @override
250 Map<String, Object> toJson() {
251 return {
252 FILE: file,
253 OFFSET: offset
254 };
255 }
256
257 @override
258 String toString() => 'Position(file=$file, offset=$offset)';
259 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698