OLD | NEW |
---|---|
(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 } | |
OLD | NEW |