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

Unified Diff: pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart

Issue 2997073002: Correctly update positions when adding edits before them (issue 30444) (Closed)
Patch Set: Created 3 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 66860037644c9979a7c26d9b93880d5ee2c7f362..e95657d4736f7fba8bbc0de1fec4719940657882 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
+import 'dart:math' as math;
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -77,6 +78,29 @@ class ChangeBuilderImpl implements ChangeBuilder {
void setSelection(Position position) {
_change.selection = position;
}
+
+ /**
+ * Update the offsets of any positions that occur at or after the given
+ * [offset] such that the positions are offset by the given [delta]. Positions
+ * occur in linked edit groups and as the post-change selection.
+ */
+ void _updatePositions(int offset, int delta) {
+ void _updatePosition(Position position) {
+ if (position.offset >= offset) {
+ position.offset = position.offset + delta;
+ }
+ }
+
+ for (LinkedEditGroup group in _linkedEditGroups.values) {
+ for (Position position in group.positions) {
+ _updatePosition(position);
+ }
+ }
+ Position selection = _change.selection;
+ if (selection != null) {
+ _updatePosition(selection);
+ }
+ }
}
/**
@@ -219,7 +243,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
@override
void addDeletion(SourceRange range) {
EditBuilderImpl builder = createEditBuilder(range.offset, range.length);
- fileEdit.add(builder.sourceEdit);
+ _addEdit(builder);
}
@override
@@ -228,9 +252,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
try {
buildEdit(builder);
} finally {
- SourceEdit edit = builder.sourceEdit;
- fileEdit.add(edit);
- _captureSelection(builder, edit);
+ _addEdit(builder);
}
}
@@ -248,9 +270,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
try {
buildEdit(builder);
} finally {
- SourceEdit edit = builder.sourceEdit;
- fileEdit.add(edit);
- _captureSelection(builder, edit);
+ _addEdit(builder);
}
}
@@ -260,9 +280,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
try {
builder.write(text);
} finally {
- SourceEdit edit = builder.sourceEdit;
- fileEdit.add(edit);
- _captureSelection(builder, edit);
+ _addEdit(builder);
}
}
@@ -272,9 +290,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
try {
builder.write(text);
} finally {
- SourceEdit edit = builder.sourceEdit;
- fileEdit.add(edit);
- _captureSelection(builder, edit);
+ _addEdit(builder);
}
}
@@ -290,6 +306,18 @@ class FileEditBuilderImpl implements FileEditBuilder {
}
/**
+ * Add the edit from the given [builder] to the edits associates with the
+ * current file.
+ */
+ void _addEdit(EditBuilderImpl builder) {
+ SourceEdit edit = builder.sourceEdit;
+ fileEdit.add(edit);
+ int delta = _editDelta(edit);
+ changeBuilder._updatePositions(edit.offset + math.max(0, delta), delta);
+ _captureSelection(builder, edit);
+ }
+
+ /**
* Capture the selection offset if one was set.
*/
void _captureSelection(EditBuilderImpl builder, SourceEdit edit) {
@@ -312,7 +340,7 @@ class FileEditBuilderImpl implements FileEditBuilder {
int delta = 0;
for (SourceEdit edit in fileEdit.edits) {
if (edit.offset < targetEdit.offset) {
- delta += edit.replacement.length - edit.length;
+ delta += _editDelta(edit);
}
}
return delta;
@@ -328,11 +356,16 @@ class FileEditBuilderImpl implements FileEditBuilder {
int delta = 0;
for (SourceEdit edit in fileEdit.edits) {
if (edit.offset <= offset) {
- delta += edit.replacement.length - edit.length;
+ delta += _editDelta(edit);
}
}
return delta;
}
+
+ /**
+ * Return the delta introduced by the given `edit`.
+ */
+ int _editDelta(SourceEdit edit) => edit.replacement.length - edit.length;
}
/**

Powered by Google App Engine
This is Rietveld 408576698