| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 // This code was auto-generated, is not intended to be edited, and is subject to | |
| 6 // significant change. Please see the README file for more information. | |
| 7 | |
| 8 library services.change; | |
| 9 | |
| 10 import 'dart:collection'; | |
| 11 import 'package:analyzer/src/generated/java_io.dart' show JavaFile; | |
| 12 import 'package:analyzer/src/generated/source.dart'; | |
| 13 | |
| 14 /** | |
| 15 * Describes some abstract operation to perform. | |
| 16 * | |
| 17 * [Change] implementations in "services" plugin cannot perform operation themse
lves, they are | |
| 18 * just descriptions of operation. Actual operation should be performed by clien
t. | |
| 19 */ | |
| 20 abstract class Change { | |
| 21 final String name; | |
| 22 | |
| 23 Change(this.name); | |
| 24 } | |
| 25 | |
| 26 /** | |
| 27 * Composition of several [Change]s. | |
| 28 */ | |
| 29 class CompositeChange extends Change { | |
| 30 List<Change> _children = []; | |
| 31 | |
| 32 CompositeChange(String name, [Iterable<Change> changes]) : super(name) { | |
| 33 if (changes != null) { | |
| 34 _children.addAll(changes); | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 /** | |
| 39 * Adds given [Change]s. | |
| 40 */ | |
| 41 void add(List<Change> changes) { | |
| 42 _children.addAll(changes); | |
| 43 } | |
| 44 | |
| 45 /** | |
| 46 * @return the children [Change]s. | |
| 47 */ | |
| 48 List<Change> get children => _children; | |
| 49 } | |
| 50 | |
| 51 /** | |
| 52 * [Change] to create new file. | |
| 53 */ | |
| 54 class CreateFileChange extends Change { | |
| 55 final JavaFile file; | |
| 56 | |
| 57 final String content; | |
| 58 | |
| 59 CreateFileChange(String name, this.file, this.content) : super(name); | |
| 60 } | |
| 61 | |
| 62 /** | |
| 63 * Describes a text edit. Edits are executed by applying them to a [Source]. | |
| 64 */ | |
| 65 class Edit { | |
| 66 /** | |
| 67 * The offset at which to apply the edit. | |
| 68 */ | |
| 69 final int offset; | |
| 70 | |
| 71 /** | |
| 72 * The length of the text interval to replace. | |
| 73 */ | |
| 74 final int length; | |
| 75 | |
| 76 /** | |
| 77 * The replacement text. | |
| 78 */ | |
| 79 final String replacement; | |
| 80 | |
| 81 /** | |
| 82 * Create an edit. | |
| 83 * | |
| 84 * @param offset the offset at which to apply the edit | |
| 85 * @param length the length of the text interval replace | |
| 86 * @param replacement the replacement text | |
| 87 */ | |
| 88 Edit(this.offset, this.length, this.replacement); | |
| 89 | |
| 90 /** | |
| 91 * Create an edit. | |
| 92 * | |
| 93 * @param range the [SourceRange] to replace | |
| 94 * @param replacement the replacement text | |
| 95 */ | |
| 96 Edit.range(SourceRange range, String replacement) : this(range.offset, range.l
ength, replacement); | |
| 97 | |
| 98 @override | |
| 99 String toString() => "${(offset < 0 ? "(" : "X(")}offset: ${offset}, length ${
length}, replacement :>${replacement}<:)"; | |
| 100 } | |
| 101 | |
| 102 /** | |
| 103 * Composition of two [CompositeChange]s. First change should be displayed in pr
eview, but | |
| 104 * merged into second one before execution. | |
| 105 */ | |
| 106 class MergeCompositeChange extends Change { | |
| 107 final CompositeChange previewChange; | |
| 108 | |
| 109 final CompositeChange executeChange; | |
| 110 | |
| 111 MergeCompositeChange(String name, this.previewChange, this.executeChange) : su
per(name); | |
| 112 } | |
| 113 | |
| 114 /** | |
| 115 * [Change] to apply to single [Source]. | |
| 116 */ | |
| 117 class SourceChange extends Change { | |
| 118 final Source source; | |
| 119 | |
| 120 final List<Edit> edits = []; | |
| 121 | |
| 122 Map<String, List<Edit>> _editGroups = new LinkedHashMap(); | |
| 123 | |
| 124 /** | |
| 125 * @param name the name of this change to display in UI | |
| 126 * @param source the [Source] to change | |
| 127 */ | |
| 128 SourceChange(String name, this.source) : super(name); | |
| 129 | |
| 130 /** | |
| 131 * Adds the [Edit] to apply. | |
| 132 */ | |
| 133 void addEdit(Edit edit, [String description = '']) { | |
| 134 // add to all edits | |
| 135 edits.add(edit); | |
| 136 // add to group | |
| 137 { | |
| 138 List<Edit> group = _editGroups[description]; | |
| 139 if (group == null) { | |
| 140 group = []; | |
| 141 _editGroups[description] = group; | |
| 142 } | |
| 143 group.add(edit); | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 /** | |
| 148 * @return the [Edit]s grouped by their descriptions. | |
| 149 */ | |
| 150 Map<String, List<Edit>> get editGroups => _editGroups; | |
| 151 } | |
| 152 | |
| 153 /** | |
| 154 * Manages multiple [SourceChange] objects. | |
| 155 */ | |
| 156 class SourceChangeManager { | |
| 157 Map<Source, SourceChange> _changeMap = {}; | |
| 158 | |
| 159 /** | |
| 160 * @return the [SourceChange] to record modifications for given [Source]. | |
| 161 */ | |
| 162 SourceChange get(Source source) { | |
| 163 SourceChange change = _changeMap[source]; | |
| 164 if (change == null) { | |
| 165 change = new SourceChange(source.shortName, source); | |
| 166 _changeMap[source] = change; | |
| 167 } | |
| 168 return change; | |
| 169 } | |
| 170 | |
| 171 /** | |
| 172 * @return all [SourceChange] in this manager. | |
| 173 */ | |
| 174 List<SourceChange> get changes { | |
| 175 Iterable<SourceChange> changes = _changeMap.values; | |
| 176 return new List.from(changes); | |
| 177 } | |
| 178 } | |
| OLD | NEW |