Elements. Use identical() to compare ElementImpl(s), other elements.

Change-Id: If2abddeaea0551fa4646027ad8aa1bb4fd255660
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/401760
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 9ae427c..3513b15 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:collection';
+
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/source.dart';
@@ -182,7 +184,13 @@
 
   @override
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async {
-    var allElements = <Element2>{};
+    var allElements = HashSet<Element2>(
+      hashCode: (e) => e.name3.hashCode,
+      equals: (a, b) {
+        return a.lookupName == b.lookupName &&
+            a.library2?.uri == b.library2?.uri;
+      },
+    );
     var regExp = RegExp(pattern);
     var drivers = _drivers.toList();
     for (var driver in drivers) {
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 96a10d7..a364dab 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -2799,6 +2799,7 @@
   }
 
   Future<void> test_localVariable_finalCheck_shadowError() {
+    setPriorityFiles([testFile]);
     addTestFile('''
 void f() {
   var newName;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0103158..4f79009 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1179,10 +1179,6 @@
       typeAliases.cast<TypeAliasFragment>();
 
   @override
-  bool operator ==(Object other) =>
-      other is CompilationUnitElementImpl && source == other.source;
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitCompilationUnitElement(this);
 
@@ -3393,14 +3389,7 @@
 
   @override
   bool operator ==(Object other) {
-    if (identical(this, other)) {
-      return true;
-    }
-    return other is ElementImpl2 &&
-        other.kind == kind &&
-        other.location == location &&
-        other.nonSynthetic2.firstFragment.nameOffset2 ==
-            nonSynthetic2.firstFragment.nameOffset2;
+    return identical(this, other);
   }
 
   /// Append a textual representation of this element to the given [builder].
@@ -6593,9 +6582,6 @@
   @override
   List<PatternVariableFragment> get variables2 =>
       variables.cast<PatternVariableFragment>();
-
-  @override
-  bool operator ==(Object other) => identical(other, this);
 }
 
 class JoinPatternVariableElementImpl2 extends PatternVariableElementImpl2
@@ -7297,11 +7283,6 @@
   ElementKind get kind => ElementKind.EXPORT;
 
   @override
-  bool operator ==(Object other) {
-    return identical(this, other);
-  }
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitLibraryExportElement(this);
   }
@@ -7391,11 +7372,6 @@
   }
 
   @override
-  bool operator ==(Object other) {
-    return identical(this, other);
-  }
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitLibraryImportElement(this);
   }
@@ -10940,20 +10916,6 @@
   set variance(shared.Variance? newVariance) => _variance = newVariance;
 
   @override
-  bool operator ==(Object other) {
-    if (identical(other, this)) {
-      return true;
-    }
-    if (other is TypeParameterElement) {
-      if (other.enclosingElement3 == null || enclosingElement3 == null) {
-        return identical(other, this);
-      }
-      return other.location == location;
-    }
-    return false;
-  }
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitTypeParameterElement(this);
 
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 20b3092..86c1315 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -2668,6 +2668,7 @@
   }
 
   test_searchReferences_TypeParameterElement_ofLocalFunction() async {
+    makeFilePriority(testFile);
     await resolveTestCode('''
 main() {
   void foo<T>(T a) {
diff --git a/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
index 6bc70b8..0dec2ea 100644
--- a/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_parameter_element_test.dart
@@ -17,28 +17,13 @@
 
 @reflectiveTest
 class TypeParameterElementTest extends AbstractTypeSystemTest {
-  test_equal_elementElement_sameLocation() {
+  test_equal() {
     var T1 = typeParameter('T');
     var T2 = typeParameter('T');
-    var U = typeParameter('U');
-    class_(name: 'A', typeParameters: [T1, T2, U]);
 
     expect(T1 == T1, isTrue);
     expect(T2 == T2, isTrue);
-    expect(U == U, isTrue);
 
-    expect(T1 == T2, isTrue);
-    expect(T2 == T1, isTrue);
-
-    expect(U == T1, isFalse);
-    expect(T1 == U, isFalse);
-  }
-
-  test_equal_elementElement_synthetic() {
-    var T1 = typeParameter('T');
-    var T2 = typeParameter('T');
-    expect(T1 == T1, isTrue);
-    expect(T2 == T2, isTrue);
     expect(T1 == T2, isFalse);
     expect(T2 == T1, isFalse);
   }
@@ -46,59 +31,47 @@
 
 @reflectiveTest
 class TypeParameterTypeTest extends AbstractTypeSystemTest {
-  test_equal_equalElements() {
+  test_equal_differentElements() {
     var T1 = typeParameter('T');
     var T2 = typeParameter('T');
-    class_(name: 'A', typeParameters: [T1, T2]);
-
-    _assertEqual(typeParameterTypeNone(T1), typeParameterTypeNone(T2), isTrue);
-    _assertEqual(typeParameterTypeNone(T2), typeParameterTypeNone(T1), isTrue);
 
     _assertEqual(
       typeParameterTypeNone(T1),
-      typeParameterTypeQuestion(T2),
-      isFalse,
-    );
-    _assertEqual(
-      typeParameterTypeNone(T1),
-      typeParameterTypeQuestion(T2),
+      typeParameterTypeNone(T2),
       isFalse,
     );
   }
 
-  test_equal_equalElements_withRecursiveBounds() {
-    var A = class_(name: 'A', typeParameters: [typeParameter('E')]);
-
-    var T1 = typeParameter('T');
-    T1.bound = interfaceTypeNone(A, typeArguments: [
-      typeParameterTypeNone(T1),
-    ]);
-
-    var T2 = typeParameter('T');
-    T2.bound = interfaceTypeNone(A, typeArguments: [
-      typeParameterTypeNone(T2),
-    ]);
-
-    class_(name: 'B', typeParameters: [T1, T2]);
-
-    _assertEqual(typeParameterTypeNone(T1), typeParameterTypeNone(T2), isTrue);
-    _assertEqual(typeParameterTypeNone(T2), typeParameterTypeNone(T1), isTrue);
+  test_equal_sameElement() {
+    var T = typeParameter('T');
 
     _assertEqual(
-      typeParameterTypeNone(T1),
-      typeParameterTypeQuestion(T2),
+      typeParameterTypeNone(T),
+      typeParameterTypeNone(T),
+      isTrue,
+    );
+
+    _assertEqual(
+      typeParameterTypeNone(T),
+      typeParameterTypeQuestion(T),
       isFalse,
     );
+
     _assertEqual(
-      typeParameterTypeQuestion(T1),
-      typeParameterTypeNone(T2),
+      typeParameterTypeQuestion(T),
+      typeParameterTypeNone(T),
       isFalse,
     );
+
+    _assertEqual(
+      typeParameterTypeQuestion(T),
+      typeParameterTypeQuestion(T),
+      isTrue,
+    );
   }
 
   test_equal_sameElement_promotedBounds() {
     var T = typeParameter('T');
-    class_(name: 'A', typeParameters: [T]);
 
     _assertEqual(
       promotedTypeParameterTypeNone(T, intNone),
@@ -125,34 +98,6 @@
     );
   }
 
-  test_equal_sameElements() {
-    var T = typeParameter('T');
-
-    _assertEqual(
-      typeParameterTypeNone(T),
-      typeParameterTypeNone(T),
-      isTrue,
-    );
-
-    _assertEqual(
-      typeParameterTypeNone(T),
-      typeParameterTypeQuestion(T),
-      isFalse,
-    );
-
-    _assertEqual(
-      typeParameterTypeQuestion(T),
-      typeParameterTypeNone(T),
-      isFalse,
-    );
-
-    _assertEqual(
-      typeParameterTypeQuestion(T),
-      typeParameterTypeQuestion(T),
-      isTrue,
-    );
-  }
-
   void _assertEqual(DartType T1, DartType T2, matcher) {
     expect(T1 == T2, matcher);
   }