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() {