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

Side by Side Diff: pkg/analysis_server/lib/src/utilities/change_builder_core.dart

Issue 1110583002: Add utilities for creating SourceChanges (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add missed files Created 5 years, 7 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
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
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.
4
5 library analysis_server.src.utilities.change_builder_core;
6
7 import 'package:analysis_server/src/protocol.dart';
8 import 'package:analysis_server/utilities/change_builder_core.dart';
9 import 'package:analyzer/src/generated/source.dart';
10
11 /**
12 * A builder used to build a [SourceChange].
13 */
14 class ChangeBuilderImpl implements ChangeBuilder {
15 /**
16 * The end-of-line marker used in the file being edited, or `null` if the
17 * default marker should be used.
18 */
19 String eol = null;
20
21 /**
22 * The change that is being built.
23 */
24 final SourceChange _change = new SourceChange('');
25
26 /**
27 * A table mapping group ids to the associated linked edit groups.
28 */
29 final Map<String, LinkedEditGroup> _linkedEditGroups =
30 <String, LinkedEditGroup>{};
31
32 /**
33 * Initialize a newly created change builder.
34 */
35 ChangeBuilderImpl();
36
37 @override
38 SourceChange get sourceChange {
39 _linkedEditGroups.forEach((String name, LinkedEditGroup group) {
40 _change.addLinkedEditGroup(group);
41 });
42 _linkedEditGroups.clear();
43 return _change;
44 }
45
46 @override
47 void addFileEdit(Source source, int fileStamp,
48 void buildFileEdit(FileEditBuilder builder)) {
49 FileEditBuilderImpl builder = createFileEditBuilder(source, fileStamp);
50 try {
51 buildFileEdit(builder);
52 } finally {
53 _change.addFileEdit(builder.fileEdit);
54 }
55 }
56
57 /**
58 * Create and return a [FileEditBuilder] that can be used to build edits to
59 * the given [source].
60 */
61 FileEditBuilderImpl createFileEditBuilder(Source source, int fileStamp) {
62 return new FileEditBuilderImpl(this, source, fileStamp);
63 }
64
65 /**
66 * Return the linked edit group with the given [groupName], creating it if it
67 * did not already exist.
68 */
69 LinkedEditGroup getLinkedEditGroup(String groupName) {
70 LinkedEditGroup group = _linkedEditGroups[groupName];
Paul Berry 2015/05/04 16:00:28 This could be written more compactly as: return _
71 if (group == null) {
72 group = new LinkedEditGroup.empty();
73 _linkedEditGroups[groupName] = group;
74 }
75 return group;
76 }
77 }
78
79 /**
80 * A builder used to build a [SourceEdit] as part of a [SourceFileEdit].
81 */
82 class EditBuilderImpl implements EditBuilder {
83 /**
84 * The builder being used to create the source file edit of which the source
85 * edit will be a part.
86 */
87 final FileEditBuilderImpl fileEditBuilder;
88
89 /**
90 * The offset of the region being replaced.
91 */
92 final int offset;
93
94 /**
95 * The length of the region being replaced.
96 */
97 final int length;
98
99 /**
100 * The end-of-line marker used in the file being edited, or `null` if the
101 * default marker should be used.
102 */
103 String _eol = null;
104
105 /**
106 * The buffer in which the content of the edit is being composed.
107 */
108 final StringBuffer _buffer = new StringBuffer();
109
110 /**
111 * Initialize a newly created builder to build a source edit.
112 */
113 EditBuilderImpl(this.fileEditBuilder, this.offset, this.length) {
114 _eol = fileEditBuilder.changeBuilder.eol;
115 }
116
117 /**
118 * Create and return an edit representing the replacement of a region of the
119 * file with the accumulated text.
120 */
121 SourceEdit get sourceEdit =>
122 new SourceEdit(offset, length, _buffer.toString());
123
124 @override
125 void addLinkedEdit(
126 String groupName, void buildLinkedEdit(LinkedEditBuilder builder)) {
127 LinkedEditBuilderImpl builder = createLinkedEditBuilder();
128 int start = offset + _buffer.length;
129 try {
130 buildLinkedEdit(builder);
131 } finally {
132 int end = offset + _buffer.length;
133 int length = end - start;
134 Position position = new Position(fileEditBuilder.fileEdit.file, start);
135 LinkedEditGroup group =
136 fileEditBuilder.changeBuilder.getLinkedEditGroup(groupName);
137 group.addPosition(position, length);
138 for (LinkedEditSuggestion suggestion in builder.suggestions) {
139 group.addSuggestion(suggestion);
140 }
141 }
142 }
143
144 LinkedEditBuilderImpl createLinkedEditBuilder() {
145 return new LinkedEditBuilderImpl(this);
146 }
147
148 @override
149 void write(String string) {
150 _buffer.write(string);
151 }
152
153 @override
154 void writeln([String string]) {
155 _buffer.write(string);
156 if (_eol == null) {
157 _buffer.writeln();
158 } else {
159 _buffer.write(_eol);
160 }
161 }
162 }
163
164 /**
165 * A builder used to build a [SourceFileEdit] within a [SourceChange].
166 */
167 class FileEditBuilderImpl implements FileEditBuilder {
168 /**
169 * The builder being used to create the source change of which the source file
170 * edit will be a part.
171 */
172 final ChangeBuilderImpl changeBuilder;
173
174 /**
175 * The source file edit that is being built.
176 */
177 final SourceFileEdit fileEdit;
178
179 /**
180 * Initialize a newly created builder to build a source file edit within the
181 * change being built by the given [changeBuilder]. The file being edited has
182 * the given [timeStamp] and [timeStamp].
183 */
184 FileEditBuilderImpl(this.changeBuilder, Source source, int timeStamp)
185 : fileEdit = new SourceFileEdit(source.fullName, timeStamp);
186
187 @override
188 void addInsertion(int offset, void buildEdit(EditBuilder builder)) {
189 EditBuilderImpl builder = createEditBuilder(offset, 0);
190 try {
191 buildEdit(builder);
192 } finally {
193 fileEdit.add(builder.sourceEdit);
194 }
195 }
196
197 @override
198 void addLinkedPosition(int offset, int length, String groupName) {
199 LinkedEditGroup group = changeBuilder.getLinkedEditGroup(groupName);
200 Position position = new Position(fileEdit.file, offset);
201 group.addPosition(position, length);
202 }
203
204 @override
205 void addReplacement(
206 int offset, int length, void buildEdit(EditBuilder builder)) {
207 EditBuilderImpl builder = createEditBuilder(offset, length);
208 try {
209 buildEdit(builder);
210 } finally {
211 fileEdit.add(builder.sourceEdit);
212 }
213 }
214
215 EditBuilderImpl createEditBuilder(int offset, int length) {
216 return new EditBuilderImpl(this, offset, length);
217 }
218 }
219
220 /**
221 * A builder used to build a [LinkedEdit] region within an edit.
222 */
223 class LinkedEditBuilderImpl implements LinkedEditBuilder {
224 final EditBuilderImpl editBuilder;
225
226 final List<LinkedEditSuggestion> suggestions = <LinkedEditSuggestion>[];
227
228 LinkedEditBuilderImpl(this.editBuilder);
229
230 @override
231 void addSuggestion(LinkedEditSuggestionKind kind, String value) {
232 suggestions.add(new LinkedEditSuggestion(value, kind));
233 }
234
235 @override
236 void addSuggestions(LinkedEditSuggestionKind kind, List<String> values) {
237 values.forEach((value) => addSuggestion(kind, value));
238 }
239
240 @override
241 void write(String string) {
242 editBuilder.write(string);
243 }
244
245 @override
246 void writeln([String string]) {
247 editBuilder.writeln(string);
248 }
249 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698