Fix for wrong occurrences when different expression with the same prefix.
R=brianwilkerson@google.com
Change-Id: I6bc00e2c30a8bf7b2e761e86310ad69e22ca956c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107195
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index f850b80..1886f88 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -381,7 +381,7 @@
hashCode: (Token t) => t.lexeme.hashCode);
expr.accept(new _TokenLocalElementVisitor(map));
// map and join tokens
- return tokens.map((Token token) {
+ var result = tokens.map((Token token) {
String tokenString = token.lexeme;
// append token's Element id
Element element = map[token];
@@ -394,6 +394,7 @@
// done
return tokenString;
}).join(_TOKEN_SEPARATOR);
+ return result + _TOKEN_SEPARATOR;
}
/**
@@ -693,7 +694,7 @@
int endTokenIndex =
countMatches(nodeSource.substring(0, lastIndex), _TOKEN_SEPARATOR);
Token startToken = nodeTokens[startTokenIndex];
- Token endToken = nodeTokens[endTokenIndex];
+ Token endToken = nodeTokens[endTokenIndex - 1];
// add occurrence range
int start = nodeOffset + startToken.offset;
int end = nodeOffset + endToken.end;
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index 157d574..5725680 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -734,6 +734,36 @@
expect(refactoring.isAvailable(), isTrue);
}
+ test_occurrences_differentName_samePrefix() async {
+ await indexTestUnit('''
+void main(A a) {
+ if (a.foo != 1) {
+ } else if (a.foo2 != 2) {
+ }
+}
+
+class A {
+ int foo;
+ int foo2;
+}
+''');
+ _createRefactoringWithSuffix('a.foo', ' != 1');
+ // apply refactoring
+ await _assertSuccessfulRefactoring('''
+void main(A a) {
+ var res = a.foo;
+ if (res != 1) {
+ } else if (a.foo2 != 2) {
+ }
+}
+
+class A {
+ int foo;
+ int foo2;
+}
+''');
+ }
+
test_occurrences_differentVariable() async {
await indexTestUnit('''
main() {