Use textual dumps for index.

Change-Id: I400d675a5c3a6c1c046583538873c0dec2f1e2e0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/282901
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 319a3a7..94f4853 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -7,14 +7,17 @@
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:collection/collection.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../resolution/context_collection_resolution.dart';
+import '../resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IndexTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -33,6 +36,15 @@
 
 @reflectiveTest
 class IndexTest extends PubPackageResolutionTest with _IndexMixin {
+  void assertElementIndexText(Element element, String expected) {
+    var actual = _getRelationsText(element);
+    if (actual != expected) {
+      print(actual);
+      NodeTextExpectationsCollector.add(actual);
+    }
+    expect(actual, expected);
+  }
+
   test_fieldFormalParameter_noSuchField() async {
     await _indexTestUnit('''
 class B<T> {
@@ -57,15 +69,22 @@
 class C4 implements B2 {}
 class M extends Object with A {}
 ''');
-    ClassElement classElementA = findElement.class_('A');
-    assertThat(classElementA)
-      ..isAncestorOf('B1 extends A', length: 2)
-      ..isAncestorOf('B2 implements A', length: 2)
-      ..isAncestorOf('C1 extends B1', length: 2)
-      ..isAncestorOf('C2 extends B2', length: 2)
-      ..isAncestorOf('C3 implements B1', length: 2)
-      ..isAncestorOf('C4 implements B2', length: 2)
-      ..isAncestorOf('M extends Object with A', length: 1);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+17 + 2: IS_ANCESTOR_OF
+28 + 1: IS_EXTENDED_BY
+28 + 1: IS_REFERENCED_BY
+39 + 2: IS_ANCESTOR_OF
+53 + 1: IS_IMPLEMENTED_BY
+53 + 1: IS_REFERENCED_BY
+64 + 2: IS_ANCESTOR_OF
+87 + 2: IS_ANCESTOR_OF
+110 + 2: IS_ANCESTOR_OF
+136 + 2: IS_ANCESTOR_OF
+162 + 1: IS_ANCESTOR_OF
+184 + 1: IS_MIXED_IN_BY
+184 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_hasAncestor_ClassTypeAlias() async {
@@ -75,12 +94,24 @@
 class C1 = Object with A;
 class C2 = Object with B;
 ''');
-    ClassElement classElementA = findElement.class_('A');
-    ClassElement classElementB = findElement.class_('B');
-    assertThat(classElementA)
-      ..isAncestorOf('C1 = Object with A', length: 2)
-      ..isAncestorOf('C2 = Object with B', length: 2);
-    assertThat(classElementB).isAncestorOf('C2 = Object with B', length: 2);
+
+    final elementA = findElement.class_('A');
+    assertElementIndexText(elementA, r'''
+17 + 1: IS_ANCESTOR_OF
+27 + 1: IS_EXTENDED_BY
+27 + 1: IS_REFERENCED_BY
+38 + 2: IS_ANCESTOR_OF
+55 + 1: IS_MIXED_IN_BY
+55 + 1: IS_REFERENCED_BY
+64 + 2: IS_ANCESTOR_OF
+''');
+
+    final elementB = findElement.class_('B');
+    assertElementIndexText(elementB, r'''
+64 + 2: IS_ANCESTOR_OF
+81 + 1: IS_MIXED_IN_BY
+81 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_hasAncestor_MixinDeclaration() async {
@@ -94,14 +125,21 @@
 mixin M4 implements B {}
 mixin M5 on M2 {}
 ''');
-    ClassElement classElementA = findElement.class_('A');
-    assertThat(classElementA)
-      ..isAncestorOf('B extends A', length: 1)
-      ..isAncestorOf('M1 on A', length: 2)
-      ..isAncestorOf('M2 on B', length: 2)
-      ..isAncestorOf('M3 implements A', length: 2)
-      ..isAncestorOf('M4 implements B', length: 2)
-      ..isAncestorOf('M5 on M2', length: 2);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+17 + 1: IS_ANCESTOR_OF
+27 + 1: IS_EXTENDED_BY
+27 + 1: IS_REFERENCED_BY
+39 + 2: IS_ANCESTOR_OF
+45 + 1: CONSTRAINS
+45 + 1: IS_REFERENCED_BY
+56 + 2: IS_ANCESTOR_OF
+73 + 2: IS_ANCESTOR_OF
+87 + 1: IS_IMPLEMENTED_BY
+87 + 1: IS_REFERENCED_BY
+98 + 2: IS_ANCESTOR_OF
+123 + 2: IS_ANCESTOR_OF
+''');
   }
 
   test_isConstraint_MixinDeclaration_onClause() async {
@@ -109,10 +147,12 @@
 class A {} // 1
 mixin M on A {} // 2
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isConstraintAt('A {} // 2', false)
-      ..isReferencedAt('A {} // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+27 + 1: CONSTRAINS
+27 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isExtendedBy_ClassDeclaration_isQualified() async {
@@ -123,19 +163,26 @@
 import 'lib.dart' as p;
 class B extends p.A {} // 2
 ''');
-    ClassElement elementA = importFindLib().class_('A');
-    assertThat(elementA)
-      ..isExtendedAt('A {} // 2', true)
-      ..hasPrefixes('p');
+    final element = importFindLib().class_('A');
+    assertElementIndexText(element, r'''
+30 + 1: IS_ANCESTOR_OF
+42 + 1: IS_EXTENDED_BY qualified
+42 + 1: IS_REFERENCED_BY qualified
+42 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isExtendedBy_ClassDeclaration_Object() async {
     await _indexTestUnit('''
 class A {}
 ''');
-    ClassElement elementA = findElement.class_('A');
+    final elementA = findElement.class_('A');
     final elementObject = elementA.supertype!.element;
-    assertThat(elementObject).isExtendedAt('A {}', true, length: 0);
+    assertElementIndexText(elementObject, r'''
+6 + 1: IS_ANCESTOR_OF
+6 + 0: IS_EXTENDED_BY qualified
+''');
   }
 
   test_isExtendedBy_ClassDeclaration_TypeAliasElement() async {
@@ -144,10 +191,11 @@
 typedef B = A<int>;
 class C extends B {}
 ''');
-    var B = findElement.typeAlias('B');
-    assertThat(B)
-      ..isExtendedAt('B {}', false)
-      ..isReferencedAt('B {}', false);
+    final element = findElement.typeAlias('B');
+    assertElementIndexText(element, r'''
+50 + 1: IS_EXTENDED_BY
+50 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isExtendedBy_ClassTypeAlias() async {
@@ -156,10 +204,12 @@
 class B {}
 class C = A with B;
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isExtendedAt('A with', false)
-      ..isReferencedAt('A with', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+28 + 1: IS_ANCESTOR_OF
+32 + 1: IS_EXTENDED_BY
+32 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isExtendedBy_ClassTypeAlias_isQualified() async {
@@ -171,11 +221,14 @@
 class B {}
 class C = p.A with B;
 ''');
-    ClassElement elementA = importFindLib().class_('A');
-    assertThat(elementA)
-      ..isExtendedAt('A with', true)
-      ..isReferencedAt('A with', true)
-      ..hasPrefixes('p');
+    final element = importFindLib().class_('A');
+    assertElementIndexText(element, r'''
+41 + 1: IS_ANCESTOR_OF
+47 + 1: IS_EXTENDED_BY qualified
+47 + 1: IS_REFERENCED_BY qualified
+47 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isImplementedBy_ClassDeclaration() async {
@@ -183,10 +236,12 @@
 class A {} // 1
 class B implements A {} // 2
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isImplementedAt('A {} // 2', false)
-      ..isReferencedAt('A {} // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+35 + 1: IS_IMPLEMENTED_BY
+35 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isImplementedBy_ClassDeclaration_isQualified() async {
@@ -197,11 +252,14 @@
 import 'lib.dart' as p;
 class B implements p.A {} // 2
 ''');
-    ClassElement elementA = importFindLib().class_('A');
-    assertThat(elementA)
-      ..isImplementedAt('A {} // 2', true)
-      ..isReferencedAt('A {} // 2', true)
-      ..hasPrefixes('p');
+    final element = importFindLib().class_('A');
+    assertElementIndexText(element, r'''
+30 + 1: IS_ANCESTOR_OF
+45 + 1: IS_IMPLEMENTED_BY qualified
+45 + 1: IS_REFERENCED_BY qualified
+45 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isImplementedBy_ClassDeclaration_TypeAliasElement() async {
@@ -210,10 +268,11 @@
 typedef B = A<int>;
 class C implements B {}
 ''');
-    var B = findElement.typeAlias('B');
-    assertThat(B)
-      ..isImplementedAt('B {}', false)
-      ..isReferencedAt('B {}', false);
+    final element = findElement.typeAlias('B');
+    assertElementIndexText(element, r'''
+53 + 1: IS_IMPLEMENTED_BY
+53 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isImplementedBy_ClassTypeAlias() async {
@@ -222,10 +281,12 @@
 class B {} // 2
 class C = Object with A implements B; // 3
 ''');
-    ClassElement elementB = findElement.class_('B');
-    assertThat(elementB)
-      ..isImplementedAt('B; // 3', false)
-      ..isReferencedAt('B; // 3', false);
+    final element = findElement.class_('B');
+    assertElementIndexText(element, r'''
+38 + 1: IS_ANCESTOR_OF
+67 + 1: IS_IMPLEMENTED_BY
+67 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isImplementedBy_enum() async {
@@ -235,10 +296,12 @@
   v;
 }
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isImplementedAt('A { // 2', false)
-      ..isReferencedAt('A { // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+21 + 1: IS_ANCESTOR_OF
+34 + 1: IS_IMPLEMENTED_BY
+34 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isImplementedBy_MixinDeclaration_implementsClause() async {
@@ -246,10 +309,12 @@
 class A {} // 1
 mixin M implements A {} // 2
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isImplementedAt('A {} // 2', false)
-      ..isReferencedAt('A {} // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+35 + 1: IS_IMPLEMENTED_BY
+35 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isInvokedBy_FunctionElement() async {
@@ -264,10 +329,11 @@
   pref.foo(); // q
   foo(); // nq
 }''');
-    FunctionElement element = importFindLib().topFunction('foo');
-    assertThat(element)
-      ..isInvokedAt('foo(); // q', true)
-      ..isInvokedAt('foo(); // nq', false);
+    final element = importFindLib().topFunction('foo');
+    assertElementIndexText(element, r'''
+64 + 3: IS_INVOKED_BY qualified
+78 + 3: IS_INVOKED_BY
+''');
   }
 
   test_isInvokedBy_FunctionElement_synthetic_loadLibrary() async {
@@ -279,9 +345,11 @@
 }
 ''');
     LibraryElement mathLib = findElement.import('dart:math').importedLibrary!;
-    FunctionElement element = mathLib.loadLibraryFunction;
-    assertThat(element).isInvokedAt('loadLibrary(); // 1', true);
-    assertThat(element).isInvokedAt('loadLibrary(); // 2', true);
+    final element = mathLib.loadLibraryFunction;
+    assertElementIndexText(element, r'''
+55 + 11: IS_INVOKED_BY qualified
+82 + 11: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_MethodElement_class() async {
@@ -293,10 +361,11 @@
     foo(); // nq
   }
 }''');
-    MethodElement element = findElement.method('foo');
-    assertThat(element)
-      ..isInvokedAt('foo(); // q', true)
-      ..isInvokedAt('foo(); // nq', false);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+43 + 3: IS_INVOKED_BY qualified
+59 + 3: IS_INVOKED_BY
+''');
   }
 
   test_isInvokedBy_MethodElement_enum() async {
@@ -313,10 +382,12 @@
   e.foo(); // q2
 }
 ''');
-    assertThat(findElement.method('foo'))
-      ..isInvokedAt('foo(); // q1', true)
-      ..isInvokedAt('foo(); // nq', false)
-      ..isInvokedAt('foo(); // q2', true);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+54 + 3: IS_INVOKED_BY qualified
+71 + 3: IS_INVOKED_BY
+108 + 3: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_MethodElement_ofNamedExtension_instance() async {
@@ -329,8 +400,10 @@
   0.foo();
 }
 ''');
-    MethodElement element = findElement.method('foo');
-    assertThat(element).isInvokedAt('foo();', true);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+55 + 3: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_MethodElement_ofNamedExtension_static() async {
@@ -343,8 +416,10 @@
   E.foo();
 }
 ''');
-    MethodElement element = findElement.method('foo');
-    assertThat(element).isInvokedAt('foo();', true);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+62 + 3: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_MethodElement_ofUnnamedExtension_instance() async {
@@ -364,12 +439,14 @@
 ''');
 
     var intMethod = findNode.methodDeclaration('foo() {} // int');
-    assertThat(intMethod.declaredElement!)
-        .isInvokedAt('foo(); // int ref', true);
+    assertElementIndexText(intMethod.declaredElement!, r'''
+111 + 3: IS_INVOKED_BY qualified
+''');
 
     var doubleMethod = findNode.methodDeclaration('foo() {} // double');
-    assertThat(doubleMethod.declaredElement!)
-        .isInvokedAt('foo(); // double ref', true);
+    assertElementIndexText(doubleMethod.declaredElement!, r'''
+137 + 3: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_MethodElement_propagatedType() async {
@@ -382,8 +459,10 @@
   a.foo();
 }
 ''');
-    MethodElement element = findElement.method('foo');
-    assertThat(element).isInvokedAt('foo();', true);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+57 + 3: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_class_binary() async {
@@ -398,12 +477,13 @@
   a++;
 }
 ''');
-    MethodElement element = findElement.method('+');
-    assertThat(element)
-      ..isInvokedAt('+ 1', true, length: 1)
-      ..isInvokedAt('+= 2', true, length: 2)
-      ..isInvokedAt('++a', true, length: 2)
-      ..isInvokedAt('++;', true, length: 2);
+    final element = findElement.method('+');
+    assertElementIndexText(element, r'''
+65 + 1: IS_INVOKED_BY qualified
+75 + 2: IS_INVOKED_BY qualified
+83 + 2: IS_INVOKED_BY qualified
+91 + 2: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_class_index() async {
@@ -417,10 +497,15 @@
   a[1] = 42;
 }
 ''');
-    MethodElement readElement = findElement.method('[]');
-    MethodElement writeElement = findElement.method('[]=');
-    assertThat(readElement).isInvokedAt('[0]', true, length: 1);
-    assertThat(writeElement).isInvokedAt('[1]', true, length: 1);
+    final readElement = findElement.method('[]');
+    assertElementIndexText(readElement, r'''
+85 + 1: IS_INVOKED_BY qualified
+''');
+
+    final writeElement = findElement.method('[]=');
+    assertElementIndexText(writeElement, r'''
+94 + 1: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_class_prefix() async {
@@ -432,8 +517,10 @@
   print(~a);
 }
 ''');
-    MethodElement element = findElement.method('~');
-    assertThat(element).isInvokedAt('~a', true, length: 1);
+    final element = findElement.method('~');
+    assertElementIndexText(element, r'''
+60 + 1: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_enum_binary() async {
@@ -449,11 +536,13 @@
   e++;
 }
 ''');
-    assertThat(findElement.method('+'))
-      ..isInvokedAt('+ 1', true, length: 1)
-      ..isInvokedAt('+= 2', true, length: 2)
-      ..isInvokedAt('++e', true, length: 2)
-      ..isInvokedAt('++;', true, length: 2);
+    final element = findElement.method('+');
+    assertElementIndexText(element, r'''
+64 + 1: IS_INVOKED_BY qualified
+73 + 2: IS_INVOKED_BY qualified
+81 + 2: IS_INVOKED_BY qualified
+89 + 2: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_enum_index() async {
@@ -468,10 +557,15 @@
   e[1] = 42;
 }
 ''');
-    MethodElement readElement = findElement.method('[]');
-    MethodElement writeElement = findElement.method('[]=');
-    assertThat(readElement).isInvokedAt('[0]', true, length: 1);
-    assertThat(writeElement).isInvokedAt('[1]', true, length: 1);
+    final readElement = findElement.method('[]');
+    assertElementIndexText(readElement, r'''
+108 + 1: IS_INVOKED_BY qualified
+''');
+
+    final writeElement = findElement.method('[]=');
+    assertElementIndexText(writeElement, r'''
+116 + 1: IS_INVOKED_BY qualified
+''');
   }
 
   test_isInvokedBy_operator_enum_prefix() async {
@@ -484,8 +578,10 @@
   ~e;
 }
 ''');
-    MethodElement element = findElement.method('~');
-    assertThat(element).isInvokedAt('~e', true, length: 1);
+    final element = findElement.method('~');
+    assertElementIndexText(element, r'''
+57 + 1: IS_INVOKED_BY qualified
+''');
   }
 
   test_isMixedBy_ClassDeclaration_TypeAliasElement() async {
@@ -494,10 +590,11 @@
 typedef B = A<int>;
 class C extends Object with B {}
 ''');
-    var B = findElement.typeAlias('B');
-    assertThat(B)
-      ..isMixedInAt('B {}', false)
-      ..isReferencedAt('B {}', false);
+    final element = findElement.typeAlias('B');
+    assertElementIndexText(element, r'''
+62 + 1: IS_MIXED_IN_BY
+62 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isMixedInBy_ClassDeclaration_class() async {
@@ -505,10 +602,12 @@
 class A {} // 1
 class B extends Object with A {} // 2
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA)
-      ..isMixedInAt('A {} // 2', false)
-      ..isReferencedAt('A {} // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+44 + 1: IS_MIXED_IN_BY
+44 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isMixedInBy_ClassDeclaration_isQualified() async {
@@ -519,10 +618,15 @@
 import 'lib.dart' as p;
 class B extends Object with p.A {} // 2
 ''');
-    ClassElement elementA = importFindLib().class_('A');
-    assertThat(elementA)
-      ..isMixedInAt('A {} // 2', true)
-      ..hasPrefixes('p');
+    final element = importFindLib().class_('A');
+    // TODO(scheglov) Why do we have duplicate?
+    assertElementIndexText(element, r'''
+30 + 1: IS_ANCESTOR_OF
+54 + 1: IS_MIXED_IN_BY qualified
+54 + 1: IS_REFERENCED_BY qualified
+54 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isMixedInBy_ClassDeclaration_mixin() async {
@@ -530,10 +634,12 @@
 mixin A {} // 1
 class B extends Object with A {} // 2
 ''');
-    final elementA = findElement.mixin('A');
-    assertThat(elementA)
-      ..isMixedInAt('A {} // 2', false)
-      ..isReferencedAt('A {} // 2', false);
+    final element = findElement.mixin('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+44 + 1: IS_MIXED_IN_BY
+44 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isMixedInBy_ClassTypeAlias_class() async {
@@ -541,8 +647,12 @@
 class A {} // 1
 class B = Object with A; // 2
 ''');
-    ClassElement elementA = findElement.class_('A');
-    assertThat(elementA).isMixedInAt('A; // 2', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+38 + 1: IS_MIXED_IN_BY
+38 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isMixedInBy_ClassTypeAlias_mixin() async {
@@ -550,8 +660,12 @@
 mixin A {} // 1
 class B = Object with A; // 2
 ''');
-    final elementA = findElement.mixin('A');
-    assertThat(elementA).isMixedInAt('A; // 2', false);
+    final element = findElement.mixin('A');
+    assertElementIndexText(element, r'''
+22 + 1: IS_ANCESTOR_OF
+38 + 1: IS_MIXED_IN_BY
+38 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isMixedInBy_enum_mixin() async {
@@ -561,9 +675,12 @@
   v
 }
 ''');
-    assertThat(findElement.mixin('M'))
-      ..isMixedInAt('M { // 2', false)
-      ..isReferencedAt('M { // 2', false);
+    final element = findElement.mixin('M');
+    assertElementIndexText(element, r'''
+21 + 1: IS_ANCESTOR_OF
+28 + 1: IS_MIXED_IN_BY
+28 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedAt_PropertyAccessorElement_field_call() async {
@@ -575,10 +692,11 @@
     field(); // nq
   }
 }''');
-    FieldElement field = findElement.field('field');
-    assertThat(field.getter!)
-      ..isReferencedAt('field(); // q', true)
-      ..isReferencedAt('field(); // nq', false);
+    final element = findElement.getter('field');
+    assertElementIndexText(element, r'''
+45 + 5: IS_REFERENCED_BY qualified
+63 + 5: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedAt_PropertyAccessorElement_getter_call() async {
@@ -591,9 +709,10 @@
   }
 }''');
     PropertyAccessorElement element = findElement.getter('ggg');
-    assertThat(element)
-      ..isReferencedAt('ggg(); // q', true)
-      ..isReferencedAt('ggg(); // nq', false);
+    assertElementIndexText(element, r'''
+51 + 3: IS_REFERENCED_BY qualified
+67 + 3: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement() async {
@@ -608,13 +727,14 @@
   print(A.field); // 3
 }
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element)
-      ..isReferencedAt('A p) {', false)
-      ..isReferencedAt('A v;', false)
-      ..isReferencedAt('A(); // 2', false)
-      ..isReferencedAt('A.field = 1;', false)
-      ..isReferencedAt('A.field); // 3', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+39 + 1: IS_REFERENCED_BY
+48 + 1: IS_REFERENCED_BY
+59 + 1: IS_REFERENCED_BY
+71 + 1: IS_REFERENCED_BY
+92 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_enum() async {
@@ -627,10 +747,11 @@
 }
 ''');
     final element = findElement.enum_('MyEnum');
-    assertThat(element)
-      ..isReferencedAt('MyEnum p) {', false)
-      ..isReferencedAt('MyEnum v;', false)
-      ..isReferencedAt('MyEnum.a;', false);
+    assertElementIndexText(element, r'''
+24 + 6: IS_REFERENCED_BY
+38 + 6: IS_REFERENCED_BY
+50 + 6: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_fromExtension() async {
@@ -639,8 +760,10 @@
 
 extension E on A<int> {}
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element).isReferencedAt('A<int>', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+30 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_implicitNew() async {
@@ -649,8 +772,10 @@
 void f() {
   A(); // invalid code, but still a reference
 }''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element).isReferencedAt('A();', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+24 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_inGenericAnnotation() async {
@@ -662,9 +787,12 @@
 @A<A>()
 void f() {}
 ''');
-    assertThat(findElement.class_('A'))
-      ..isReferencedAt('A<A', false)
-      ..isReferencedAt('A>()', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+21 + 1: IS_REFERENCED_BY
+30 + 1: IS_REFERENCED_BY
+32 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_inRecordTypeAnnotation_named() async {
@@ -673,7 +801,10 @@
 
 void f(({int foo, A bar}) r) {}
 ''');
-    assertThat(findElement.class_('A')).isReferencedAt('A bar', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+30 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_inRecordTypeAnnotation_positional() async {
@@ -682,7 +813,10 @@
 
 void f((int, A) r) {}
 ''');
-    assertThat(findElement.class_('A')).isReferencedAt('A)', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+25 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_inTypeAlias() async {
@@ -691,8 +825,14 @@
 
 typedef B = A<int>;
 ''');
-    assertThat(findElement.class_('A')).isReferencedAt('A<int', false);
-    assertThat(intElement).isReferencedAt('int>;', false);
+    final elementA = findElement.class_('A');
+    assertElementIndexText(elementA, r'''
+27 + 1: IS_REFERENCED_BY
+''');
+
+    assertElementIndexText(intElement, r'''
+29 + 3: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassElement_invocation_isQualified() async {
@@ -704,10 +844,11 @@
 void f() {
   p.A(); // invalid code, but still a reference
 }''');
-    Element element = importFindLib().class_('A');
-    assertThat(element)
-      ..isReferencedAt('A();', true)
-      ..hasPrefixes('p');
+    final element = importFindLib().class_('A');
+    assertElementIndexText(element, r'''
+39 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_ClassElement_invocationTypeArgument() async {
@@ -718,8 +859,10 @@
   f<A>();
 }
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element).isReferencedAt('A>();', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+41 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_ClassTypeAlias() async {
@@ -730,10 +873,11 @@
   B v;
 }
 ''');
-    ClassElement element = findElement.class_('B');
-    assertThat(element)
-      ..isReferencedAt('B p) {', false)
-      ..isReferencedAt('B v;', false);
+    final element = findElement.class_('B');
+    assertElementIndexText(element, r'''
+43 + 1: IS_REFERENCED_BY
+52 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_commentReference() async {
@@ -746,8 +890,11 @@
 /// An [A].
 void f(A a) {}
 ''');
-    var element = findElement.function('f').parameters[0].type.element!;
-    assertThat(element).isReferencedAt('A]', false, length: 1);
+    final element = findElement.function('f').parameters[0].type.element!;
+    assertElementIndexText(element, r'''
+28 + 1: IS_REFERENCED_BY
+39 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_commentReference_withPrefix() async {
@@ -760,10 +907,12 @@
 /// A [p.A].
 void f(p.A a) {}
 ''');
-    var element = findElement.function('f').parameters[0].type.element!;
-    assertThat(element)
-      ..isReferencedAt('A]', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.function('f').parameters[0].type.element!;
+    assertElementIndexText(element, r'''
+34 + 1: IS_REFERENCED_BY qualified
+47 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_CompilationUnitElement_export() async {
@@ -773,8 +922,11 @@
     await _indexTestUnit('''
 export 'lib.dart';
 ''');
-    var element = findElement.export('package:test/lib.dart').exportedLibrary!;
-    assertThat(element).isReferencedAt("'lib.dart'", true, length: 10);
+    final element =
+        findElement.export('package:test/lib.dart').exportedLibrary!;
+    assertElementIndexText(element, r'''
+7 + 10: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_CompilationUnitElement_import() async {
@@ -784,8 +936,11 @@
     await _indexTestUnit('''
 import 'lib.dart';
 ''');
-    var element = findElement.import('package:test/lib.dart').importedLibrary!;
-    assertThat(element).isReferencedAt("'lib.dart'", true, length: 10);
+    final element =
+        findElement.import('package:test/lib.dart').importedLibrary!;
+    assertElementIndexText(element, r'''
+7 + 10: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_CompilationUnitElement_part() async {
@@ -794,8 +949,10 @@
 library my_lib;
 part 'my_unit.dart';
 ''');
-    var element = findElement.part('package:test/my_unit.dart');
-    assertThat(element).isReferencedAt("'my_unit.dart';", true, length: 14);
+    final element = findElement.part('package:test/my_unit.dart');
+    assertElementIndexText(element, r'''
+21 + 14: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_CompilationUnitElement_part_inPart() async {
@@ -826,15 +983,15 @@
   A.foo; // 6
 }
 ''');
-    var element = findElement.constructor('foo');
-    assertThat(element)
-      ..hasRelationCount(6)
-      ..isReferencedAt('.foo] 1', true, length: 4)
-      ..isInvokedAt('.foo(); // 2', true, length: 4)
-      ..isInvokedAt('.foo(); // 3', true, length: 4)
-      ..isReferencedAt('.foo; // 4', true, length: 4)
-      ..isInvokedAt('.foo(); // 5', true, length: 4)
-      ..isReferencedByConstructorTearOffAt('.foo; // 6', length: 4);
+    final element = findElement.constructor('foo');
+    assertElementIndexText(element, r'''
+10 + 4: IS_REFERENCED_BY qualified
+57 + 4: IS_INVOKED_BY qualified
+105 + 4: IS_INVOKED_BY qualified
+139 + 4: IS_REFERENCED_BY qualified
+166 + 4: IS_INVOKED_BY qualified
+182 + 4: IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_class_namedOnlyWithDot() async {
@@ -862,10 +1019,15 @@
   A.bar();
 }
 ''');
-    var constA = findElement.unnamedConstructor('A');
-    var constA_bar = findElement.constructor('bar');
-    assertThat(constA).isInvokedAt('(); // 2', true, length: 0);
-    assertThat(constA_bar).isInvokedAt('.bar(); // 1', true, length: 4);
+    final constructor = findElement.unnamedConstructor('A');
+    assertElementIndexText(constructor, r'''
+51 + 0: IS_INVOKED_BY qualified
+''');
+
+    final constructor_bar = findElement.constructor('bar');
+    assertElementIndexText(constructor_bar, r'''
+22 + 4: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_class_unnamed_declared() async {
@@ -884,15 +1046,15 @@
   A.new; // 6
 }
 ''');
-    var element = findElement.unnamedConstructor('A');
-    assertThat(element)
-      ..hasRelationCount(6)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedAt('(); // 2', true, length: 0)
-      ..isInvokedAt('(); // 3', true, length: 0)
-      ..isReferencedAt('; // 4', true, length: 0)
-      ..isInvokedAt('(); // 5', true, length: 0)
-      ..isReferencedByConstructorTearOffAt('.new; // 6', length: 4);
+    final element = findElement.unnamedConstructor('A');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+51 + 0: IS_INVOKED_BY qualified
+95 + 0: IS_INVOKED_BY qualified
+127 + 0: IS_REFERENCED_BY qualified
+150 + 0: IS_INVOKED_BY qualified
+162 + 4: IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_class_unnamed_declared_new() async {
@@ -911,15 +1073,15 @@
   A.new; // 6
 }
 ''');
-    var element = findElement.unnamedConstructor('A');
-    assertThat(element)
-      ..hasRelationCount(6)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedAt('(); // 2', true, length: 0)
-      ..isInvokedAt('(); // 3', true, length: 0)
-      ..isReferencedAt('; // 4', true, length: 0)
-      ..isInvokedAt('(); // 5', true, length: 0)
-      ..isReferencedByConstructorTearOffAt('.new; // 6', length: 4);
+    final element = findElement.unnamedConstructor('A');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+55 + 0: IS_INVOKED_BY qualified
+99 + 0: IS_INVOKED_BY qualified
+129 + 0: IS_REFERENCED_BY qualified
+152 + 0: IS_INVOKED_BY qualified
+164 + 4: IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_class_unnamed_synthetic() async {
@@ -935,14 +1097,14 @@
   A.new; // 5
 }
 ''');
-    var element = findElement.unnamedConstructor('A');
-    assertThat(element)
-      ..hasRelationCount(5)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedAt('(); // 2', true, length: 0)
-      ..isReferencedAt('; // 3', true, length: 0)
-      ..isInvokedAt('(); // 4', true, length: 0)
-      ..isReferencedByConstructorTearOffAt('.new; // 5', length: 4);
+    final element = findElement.unnamedConstructor('A');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+58 + 0: IS_INVOKED_BY qualified
+88 + 0: IS_REFERENCED_BY qualified
+111 + 0: IS_INVOKED_BY qualified
+123 + 4: IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_classTypeAlias() async {
@@ -961,14 +1123,17 @@
   new C.named(); // C2
 }
 ''');
-    var constA = findElement.unnamedConstructor('A');
-    var constA_named = findElement.constructor('named', of: 'A');
-    assertThat(constA)
-      ..isInvokedAt('(); // B1', true, length: 0)
-      ..isInvokedAt('(); // C1', true, length: 0);
-    assertThat(constA_named)
-      ..isInvokedAt('.named(); // B2', true, length: 6)
-      ..isInvokedAt('.named(); // C2', true, length: 6);
+    final constructor = findElement.unnamedConstructor('A');
+    assertElementIndexText(constructor, r'''
+118 + 0: IS_INVOKED_BY qualified
+158 + 0: IS_INVOKED_BY qualified
+''');
+
+    final constructor_named = findElement.constructor('named', of: 'A');
+    assertElementIndexText(constructor_named, r'''
+135 + 6: IS_INVOKED_BY qualified
+175 + 6: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_classTypeAlias_cycle() async {
@@ -993,12 +1158,12 @@
   E.bar() : this.foo(); // 3
 }
 ''');
-    var element = findElement.constructor('foo');
-    assertThat(element)
-      ..hasRelationCount(3)
-      ..isReferencedAt('.foo] 1', true, length: 4)
-      ..isInvokedAt('.foo(); // 2', true, length: 4)
-      ..isInvokedAt('.foo(); // 3', true, length: 4);
+    final element = findElement.constructor('foo');
+    assertElementIndexText(element, r'''
+10 + 4: IS_REFERENCED_BY qualified
+30 + 4: IS_INVOKED_BY qualified
+70 + 4: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_enum_unnamed_declared() async {
@@ -1012,14 +1177,14 @@
   E.other() : this(); // 5
 }
 ''');
-    var element = findElement.unnamedConstructor('E');
-    assertThat(element)
-      ..hasRelationCount(5)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedByEnumConstantWithoutArgumentsAt(', // 2', length: 0)
-      ..isInvokedAt('(), // 3', true, length: 0)
-      ..isInvokedAt('.new(); // 4', true, length: 4)
-      ..isInvokedAt('(); // 5', true, length: 0);
+    final element = findElement.unnamedConstructor('E');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+27 + 0: IS_INVOKED_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS qualified
+38 + 0: IS_INVOKED_BY qualified
+51 + 4: IS_INVOKED_BY qualified
+89 + 0: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_enum_unnamed_declared_new() async {
@@ -1033,14 +1198,14 @@
   E.other() : this(); // 5
 }
 ''');
-    var element = findElement.unnamedConstructor('E');
-    assertThat(element)
-      ..hasRelationCount(5)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedByEnumConstantWithoutArgumentsAt(', // 2', length: 0)
-      ..isInvokedAt('(), // 3', true, length: 0)
-      ..isInvokedAt('.new(); // 4', true, length: 4)
-      ..isInvokedAt('(); // 5', true, length: 0);
+    final element = findElement.unnamedConstructor('E');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+27 + 0: IS_INVOKED_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS qualified
+38 + 0: IS_INVOKED_BY qualified
+51 + 4: IS_INVOKED_BY qualified
+95 + 0: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_ConstructorElement_enum_unnamed_synthetic() async {
@@ -1052,13 +1217,13 @@
   v3.new(); // 4
 }
 ''');
-    var element = findElement.unnamedConstructor('E');
-    assertThat(element)
-      ..hasRelationCount(4)
-      ..isReferencedAt('] 1', true, length: 0)
-      ..isInvokedByEnumConstantWithoutArgumentsAt(', // 2', length: 0)
-      ..isInvokedAt('(), // 3', true, length: 0)
-      ..isInvokedAt('.new(); // 4', true, length: 4);
+    final element = findElement.unnamedConstructor('E');
+    assertElementIndexText(element, r'''
+10 + 0: IS_REFERENCED_BY qualified
+27 + 0: IS_INVOKED_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS qualified
+38 + 0: IS_INVOKED_BY qualified
+51 + 4: IS_INVOKED_BY qualified
+''');
   }
 
   test_isReferencedBy_DynamicElement() async {
@@ -1081,10 +1246,11 @@
   f(E.c);
 }
 ''');
-    var element = findElement.function('f').parameters[0].type.element!;
-    assertThat(element)
-      ..isReferencedAt('E.', false, length: 1)
-      ..hasPrefixes('');
+    final element = findElement.function('f').parameters[0].type.element!;
+    assertElementIndexText(element, r'''
+27 + 1: IS_REFERENCED_BY
+38 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_enumConstant_withMultiplePrefixes() async {
@@ -1101,10 +1267,12 @@
   f(q.E.c);
 }
 ''');
-    var element = findElement.function('f').parameters[0].type.element!;
-    assertThat(element)
-      ..isReferencedAt('E.', true, length: 1)
-      ..hasPrefixes('p,q');
+    final element = findElement.function('f').parameters[0].type.element!;
+    assertElementIndexText(element, r'''
+58 + 1: IS_REFERENCED_BY qualified
+71 + 1: IS_REFERENCED_BY qualified
+Prefixes: p,q
+''');
   }
 
   test_isReferencedBy_enumConstant_withPrefix() async {
@@ -1120,10 +1288,12 @@
   f(p.E.c);
 }
 ''');
-    var element = findElement.function('f').parameters[0].type.element!;
-    assertThat(element)
-      ..isReferencedAt('E.', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.function('f').parameters[0].type.element!;
+    assertElementIndexText(element, r'''
+34 + 1: IS_REFERENCED_BY qualified
+47 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_ExtensionElement() async {
@@ -1136,8 +1306,10 @@
   E(0).foo();
 }
 ''');
-    ExtensionElement element = findElement.extension_('E');
-    assertThat(element).isReferencedAt('E(0).foo()', false);
+    final element = findElement.extension_('E');
+    assertElementIndexText(element, r'''
+53 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_FieldElement_class() async {
@@ -1156,20 +1328,23 @@
   new A(field: 4);
 }
 ''');
-    FieldElement field = findElement.field('field');
-    PropertyAccessorElement getter = field.getter!;
-    PropertyAccessorElement setter = field.setter!;
+    final field = findElement.field('field');
+    final getter = field.getter!;
+    final setter = field.setter!;
 
-    // A()
-    assertThat(field)
-      ..isWrittenAt('field});', true, length: 5)
-      ..hasRelationCount(1);
-    // m()
-    assertThat(setter).isReferencedAt('field = 2; // nq', false, length: 5);
-    assertThat(getter).isReferencedAt('field); // nq', false, length: 5);
-    // f()
-    assertThat(setter).isReferencedAt('field = 3; // q', true, length: 5);
-    assertThat(getter).isReferencedAt('field); // q', true, length: 5);
+    assertElementIndexText(field, r'''
+33 + 5: IS_WRITTEN_BY qualified
+''');
+
+    assertElementIndexText(getter, r'''
+81 + 5: IS_REFERENCED_BY
+145 + 5: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(setter, r'''
+54 + 5: IS_REFERENCED_BY
+119 + 5: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_class_multiple() async {
@@ -1188,21 +1363,33 @@
 ''');
     // aaa
     {
-      FieldElement field = findElement.field('aaa');
-      PropertyAccessorElement getter = field.getter!;
-      PropertyAccessorElement setter = field.setter!;
-      assertThat(field).isWrittenAt('aaa, ', true, length: 3);
-      assertThat(getter).isReferencedAt('aaa);', false, length: 3);
-      assertThat(setter).isReferencedAt('aaa = 1;', false, length: 3);
+      final field = findElement.field('aaa');
+      final getter = field.getter!;
+      final setter = field.setter!;
+      assertElementIndexText(field, r'''
+41 + 3: IS_WRITTEN_BY qualified
+''');
+      assertElementIndexText(getter, r'''
+77 + 3: IS_REFERENCED_BY
+''');
+      assertElementIndexText(setter, r'''
+87 + 3: IS_REFERENCED_BY
+''');
     }
     // bbb
     {
-      FieldElement field = findElement.field('bbb');
-      PropertyAccessorElement getter = field.getter!;
-      PropertyAccessorElement setter = field.setter!;
-      assertThat(field).isWrittenAt('bbb) {}', true, length: 3);
-      assertThat(getter).isReferencedAt('bbb);', false, length: 3);
-      assertThat(setter).isReferencedAt('bbb = 2;', false, length: 3);
+      final field = findElement.field('bbb');
+      final getter = field.getter!;
+      final setter = field.setter!;
+      assertElementIndexText(field, r'''
+51 + 3: IS_WRITTEN_BY qualified
+''');
+      assertElementIndexText(getter, r'''
+106 + 3: IS_REFERENCED_BY
+''');
+      assertElementIndexText(setter, r'''
+116 + 3: IS_REFERENCED_BY
+''');
     }
   }
 
@@ -1213,8 +1400,10 @@
   int get f => 0;
 }
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element.getField('f')!).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+18 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_class_synthetic_hasGetterSetter() async {
@@ -1225,8 +1414,10 @@
   set f(_) {}
 }
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element.getField('f')!).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+18 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_class_synthetic_hasSetter() async {
@@ -1236,8 +1427,10 @@
   set f(_) {}
 }
 ''');
-    ClassElement element = findElement.class_('A');
-    assertThat(element.getField('f')!).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+18 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_enum() async {
@@ -1257,20 +1450,23 @@
   E(field: 4);
 }
 ''');
-    FieldElement field = findElement.field('field');
-    PropertyAccessorElement getter = field.getter!;
-    PropertyAccessorElement setter = field.setter!;
+    final field = findElement.field('field');
+    final getter = field.getter!;
+    final setter = field.setter!;
 
-    // E()
-    assertThat(field)
-      ..isWrittenAt('field});', true, length: 5)
-      ..hasRelationCount(1);
-    // foo()
-    assertThat(setter).isReferencedAt('field = 2; // nq', false, length: 5);
-    assertThat(getter).isReferencedAt('field; // nq', false, length: 5);
-    // f()
-    assertThat(setter).isReferencedAt('field = 3; // q', true, length: 5);
-    assertThat(getter).isReferencedAt('field; // q', true, length: 5);
+    assertElementIndexText(field, r'''
+62 + 5: IS_WRITTEN_BY qualified
+''');
+
+    assertElementIndexText(getter, r'''
+111 + 5: IS_REFERENCED_BY
+168 + 5: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(setter, r'''
+90 + 5: IS_REFERENCED_BY
+148 + 5: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_enum_index() async {
@@ -1285,13 +1481,24 @@
   print(MyEnum.B);
 }
 ''');
-    final enumElement = findElement.enum_('MyEnum');
-    assertThat(enumElement.getGetter('values')!)
-        .isReferencedAt('values);', true);
-    assertThat(typeProvider.enumElement!.getGetter('index')!)
-        .isReferencedAt('index);', true);
-    assertThat(enumElement.getGetter('A')!).isReferencedAt('A);', true);
-    assertThat(enumElement.getGetter('B')!).isReferencedAt('B);', true);
+
+    assertElementIndexText(findElement.getter('values'), r'''
+52 + 6: IS_REFERENCED_BY qualified
+''');
+
+    var index = typeProvider.enumElement!.getGetter('index')!;
+    assertElementIndexText(index, r'''
+78 + 5: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(findElement.getter('A'), r'''
+76 + 1: IS_REFERENCED_BY qualified
+101 + 1: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(findElement.getter('B'), r'''
+120 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_enum_synthetic_hasGetter() async {
@@ -1302,7 +1509,10 @@
   int get f => 0;
 }
 ''');
-    assertThat(findElement.field('f')).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+22 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_enum_synthetic_hasGetterSetter() async {
@@ -1314,7 +1524,10 @@
   set f(_) {}
 }
 ''');
-    assertThat(findElement.field('f')).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+22 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FieldElement_enum_synthetic_hasSetter() async {
@@ -1325,7 +1538,10 @@
   set f(_) {}
 }
 ''');
-    assertThat(findElement.field('f')).isWrittenAt('f = 42', true);
+    final element = findElement.field('f');
+    assertElementIndexText(element, r'''
+22 + 1: IS_WRITTEN_BY qualified
+''');
   }
 
   test_isReferencedBy_FunctionElement() async {
@@ -1336,10 +1552,11 @@
   print(foo());
 }
 ''');
-    FunctionElement element = findElement.topFunction('foo');
-    assertThat(element)
-      ..isReferencedAt('foo);', false)
-      ..isInvokedAt('foo());', false);
+    final element = findElement.topFunction('foo');
+    assertElementIndexText(element, r'''
+28 + 3: IS_REFERENCED_BY
+42 + 3: IS_INVOKED_BY
+''');
   }
 
   test_isReferencedBy_FunctionElement_with_LibraryElement() async {
@@ -1354,11 +1571,14 @@
 ''');
 
     var importFind = findElement.importFind('package:test/foo.dart');
-    assertThat(importFind.importedLibrary)
-        .isReferencedAt('"foo.dart";', true, length: 10);
+    assertElementIndexText(importFind.importedLibrary, r'''
+7 + 10: IS_REFERENCED_BY qualified
+''');
 
     FunctionElement bar = importFind.topFunction('bar');
-    assertThat(bar).isInvokedAt('bar();', false);
+    assertElementIndexText(bar, r'''
+32 + 3: IS_INVOKED_BY
+''');
   }
 
   test_isReferencedBy_FunctionTypeAliasElement() async {
@@ -1367,8 +1587,10 @@
 void f(A p) {
 }
 ''');
-    Element element = findElement.typeAlias('A');
-    assertThat(element).isReferencedAt('A p) {', false);
+    final element = findElement.typeAlias('A');
+    assertElementIndexText(element, r'''
+20 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_getter_withPrefix() async {
@@ -1384,10 +1606,16 @@
 
 class B extends p.A {}
 ''');
-    var element = findElement.class_('B').supertype!.element;
-    assertThat(element)
-      ..isReferencedAt('A.', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.class_('B').supertype!.element;
+    // TODO(scheglov) Why duplicates?
+    assertElementIndexText(element, r'''
+38 + 1: IS_REFERENCED_BY qualified
+50 + 1: IS_ANCESTOR_OF
+62 + 1: IS_EXTENDED_BY qualified
+62 + 1: IS_REFERENCED_BY qualified
+62 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   /// There was a bug in the AST structure, when single [Comment] was cloned and
@@ -1401,8 +1629,10 @@
 /// [A] text
 var myVariable = null;
 ''');
-    Element element = findElement.class_('A');
-    assertThat(element).isReferencedAt('A] text', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+16 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_MethodElement_class() async {
@@ -1414,10 +1644,11 @@
     print(method); // nq
   }
 }''');
-    MethodElement element = findElement.method('method');
-    assertThat(element)
-      ..isReferencedAt('method); // q', true)
-      ..isReferencedAt('method); // nq', false);
+    final element = findElement.method('method');
+    assertElementIndexText(element, r'''
+52 + 6: IS_REFERENCED_BY qualified
+76 + 6: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_MethodElement_enum() async {
@@ -1434,10 +1665,12 @@
   e.foo; // q2
 }
 ''');
-    assertThat(findElement.method('foo'))
-      ..isReferencedAt('foo; // q1', true)
-      ..isReferencedAt('foo; // nq', false)
-      ..isReferencedAt('foo; // q2', true);
+    final element = findElement.method('foo');
+    assertElementIndexText(element, r'''
+54 + 3: IS_REFERENCED_BY qualified
+69 + 3: IS_REFERENCED_BY
+104 + 3: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_methodInvocation_withPrefix() async {
@@ -1453,10 +1686,16 @@
 
 class B extends p.A {}
 ''');
-    var element = findElement.class_('B').supertype!.element;
-    assertThat(element)
-      ..isReferencedAt('A.', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.class_('B').supertype!.element;
+    // TODO(scheglov) Why duplicates?
+    assertElementIndexText(element, r'''
+39 + 1: IS_REFERENCED_BY qualified
+53 + 1: IS_ANCESTOR_OF
+65 + 1: IS_EXTENDED_BY qualified
+65 + 1: IS_REFERENCED_BY qualified
+65 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_MultiplyDefinedElement() async {
@@ -1483,8 +1722,10 @@
   foo(p: 1);
 }
 ''');
-    Element element = findElement.parameter('p');
-    assertThat(element).isReferencedAt('p: 1', true);
+    final element = findElement.parameter('p');
+    assertElementIndexText(element, r'''
+33 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_genericFunctionType() async {
@@ -1537,8 +1778,10 @@
   B({required super.a}); // ref
 }
 ''');
-    var element = findElement.unnamedConstructor('A').parameter('a');
-    assertThat(element).isReferencedAt('a}); // ref', true, length: 1);
+    final element = findElement.unnamedConstructor('A').parameter('a');
+    assertElementIndexText(element, r'''
+75 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_ofConstructor_super_positional() async {
@@ -1550,8 +1793,10 @@
   B(super.a); // ref
 }
 ''');
-    var element = findElement.unnamedConstructor('A').parameter('a');
-    assertThat(element).isReferencedAt('a); // ref', true, length: 1);
+    final element = findElement.unnamedConstructor('A').parameter('a');
+    assertElementIndexText(element, r'''
+54 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_optionalNamed_ofConstructor_genericClass() async {
@@ -1564,8 +1809,10 @@
   A(test: 0);
 }
 ''');
-    Element element = findElement.parameter('test');
-    assertThat(element).isReferencedAt('test: 0', true);
+    final element = findElement.parameter('test');
+    assertElementIndexText(element, r'''
+47 + 4: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_optionalNamed_ofMethod_genericClass() async {
@@ -1578,8 +1825,10 @@
   a.foo(test: 0);
 }
 ''');
-    Element element = findElement.parameter('test');
-    assertThat(element).isReferencedAt('test: 0', true);
+    final element = findElement.parameter('test');
+    assertElementIndexText(element, r'''
+68 + 4: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_optionalNamed_ofTopFunction() async {
@@ -1590,8 +1839,10 @@
   foo(test: 0);
 }
 ''');
-    Element element = findElement.parameter('test');
-    assertThat(element).isReferencedAt('test: 0', true);
+    final element = findElement.parameter('test');
+    assertElementIndexText(element, r'''
+41 + 4: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_optionalNamed_ofTopFunction_anywhere() async {
@@ -1602,8 +1853,10 @@
   foo(1, test: 0, 2);
 }
 ''');
-    Element element = findElement.parameter('test');
-    assertThat(element).isReferencedAt('test: 0', true);
+    final element = findElement.parameter('test');
+    assertElementIndexText(element, r'''
+58 + 4: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_optionalPositional() async {
@@ -1615,10 +1868,10 @@
   foo(1); // 2
 }
 ''');
-    Element element = findElement.parameter('p');
-    assertThat(element)
-      ..hasRelationCount(1)
-      ..isReferencedAt('1); // 2', true, length: 0);
+    final element = findElement.parameter('p');
+    assertElementIndexText(element, r'''
+40 + 0: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_ParameterElement_requiredNamed_ofTopFunction() async {
@@ -1629,8 +1882,10 @@
   foo(test: 0);
 }
 ''');
-    Element element = findElement.parameter('test');
-    assertThat(element).isReferencedAt('test: 0', true);
+    final element = findElement.parameter('test');
+    assertElementIndexText(element, r'''
+49 + 4: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_PropertyAccessor_ofNamedExtension_instance() async {
@@ -1645,10 +1900,16 @@
   0.foo = 0;
 }
 ''');
-    PropertyAccessorElement getter = findElement.getter('foo');
-    PropertyAccessorElement setter = findElement.setter('foo');
-    assertThat(getter).isReferencedAt('foo;', true);
-    assertThat(setter).isReferencedAt('foo = 0;', true);
+    final getter = findElement.getter('foo');
+    final setter = findElement.setter('foo');
+
+    assertElementIndexText(getter, r'''
+84 + 3: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(setter, r'''
+93 + 3: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_PropertyAccessor_ofNamedExtension_static() async {
@@ -1663,10 +1924,16 @@
   0.foo = 0;
 }
 ''');
-    PropertyAccessorElement getter = findElement.getter('foo');
-    PropertyAccessorElement setter = findElement.setter('foo');
-    assertThat(getter).isReferencedAt('foo;', true);
-    assertThat(setter).isReferencedAt('foo = 0;', true);
+    final getter = findElement.getter('foo');
+    final setter = findElement.setter('foo');
+
+    assertElementIndexText(getter, r'''
+98 + 3: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(setter, r'''
+107 + 3: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_PropertyAccessor_ofUnnamedExtension_instance() async {
@@ -1691,17 +1958,21 @@
 
     var intGetter = findNode.methodDeclaration('0; // int getter');
     var intSetter = findNode.methodDeclaration('{} // int setter');
-    assertThat(intGetter.declaredElement!)
-        .isReferencedAt('foo; // int getter ref', true);
-    assertThat(intSetter.declaredElement!)
-        .isReferencedAt('foo = 0; // int setter ref', true);
+    assertElementIndexText(intGetter.declaredElement!, r'''
+214 + 3: IS_REFERENCED_BY qualified
+''');
+    assertElementIndexText(intSetter.declaredElement!, r'''
+241 + 3: IS_REFERENCED_BY qualified
+''');
 
     var doubleGetter = findNode.methodDeclaration('0; // double getter');
     var doubleSetter = findNode.methodDeclaration('{} // double setter');
-    assertThat(doubleGetter.declaredElement!)
-        .isReferencedAt('foo; // double getter ref', true);
-    assertThat(doubleSetter.declaredElement!)
-        .isReferencedAt('foo = 0; // double setter ref', true);
+    assertElementIndexText(doubleGetter.declaredElement!, r'''
+276 + 3: IS_REFERENCED_BY qualified
+''');
+    assertElementIndexText(doubleSetter.declaredElement!, r'''
+310 + 3: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_setter_withPrefix() async {
@@ -1717,10 +1988,15 @@
 
 class B extends p.A {}
 ''');
-    var element = findElement.class_('B').supertype!.element;
-    assertThat(element)
-      ..isReferencedAt('A.', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.class_('B').supertype!.element;
+    assertElementIndexText(element, r'''
+44 + 1: IS_REFERENCED_BY qualified
+60 + 1: IS_ANCESTOR_OF
+72 + 1: IS_EXTENDED_BY qualified
+72 + 1: IS_REFERENCED_BY qualified
+72 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_simpleIdentifier_withPrefix() async {
@@ -1734,10 +2010,15 @@
 
 class B extends p.A {}
 ''');
-    var element = findElement.class_('B').supertype!.element;
-    assertThat(element)
-      ..isReferencedAt('A;', true, length: 1)
-      ..hasPrefixes('p');
+    final element = findElement.class_('B').supertype!.element;
+    assertElementIndexText(element, r'''
+35 + 1: IS_REFERENCED_BY qualified
+45 + 1: IS_ANCESTOR_OF
+57 + 1: IS_EXTENDED_BY qualified
+57 + 1: IS_REFERENCED_BY qualified
+57 + 1: IS_REFERENCED_BY qualified
+Prefixes: p
+''');
   }
 
   test_isReferencedBy_synthetic_leastUpperBound() async {
@@ -1767,13 +2048,21 @@
   print(V); // nq
 }''');
     TopLevelVariableElement variable = importFindLib().topVar('V');
-    assertThat(variable).isReferencedAt('V; // imp', true);
-    assertThat(variable.getter!)
-      ..isReferencedAt('V); // q', true)
-      ..isReferencedAt('V); // nq', false);
-    assertThat(variable.setter!)
-      ..isReferencedAt('V = 5; // q', true)
-      ..isReferencedAt('V = 5; // nq', false);
+
+    assertElementIndexText(variable, r'''
+23 + 1: IS_REFERENCED_BY qualified
+''');
+
+    assertElementIndexText(variable.getter!, r'''
+103 + 1: IS_REFERENCED_BY qualified
+135 + 1: IS_REFERENCED_BY
+Prefixes: pref
+''');
+
+    assertElementIndexText(variable.setter!, r'''
+78 + 1: IS_REFERENCED_BY qualified
+114 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_TopLevelVariableElement_synthetic_hasGetterSetter() async {
@@ -1784,8 +2073,10 @@
     await _indexTestUnit('''
 import 'lib.dart' show V;
 ''');
-    TopLevelVariableElement element = importFindLib().topVar('V');
-    assertThat(element).isReferencedAt('V;', true);
+    final element = importFindLib().topVar('V');
+    assertElementIndexText(element, r'''
+23 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_TopLevelVariableElement_synthetic_hasSetter() async {
@@ -1795,8 +2086,10 @@
     await _indexTestUnit('''
 import 'lib.dart' show V;
 ''');
-    TopLevelVariableElement element = importFindLib().topVar('V');
-    assertThat(element).isReferencedAt('V;', true);
+    final element = importFindLib().topVar('V');
+    assertElementIndexText(element, r'''
+23 + 1: IS_REFERENCED_BY qualified
+''');
   }
 
   test_isReferencedBy_TypeAliasElement() async {
@@ -1816,14 +2109,15 @@
   B.method(); // 4
 }
 ''');
-    var element = findElement.typeAlias('B');
-    assertThat(element)
-      ..isReferencedAt('B p) {', false)
-      ..isReferencedAt('B v;', false)
-      ..isReferencedAt('B(); // 2', false)
-      ..isReferencedAt('B.field = 1;', false)
-      ..isReferencedAt('B.field; // 3', false)
-      ..isReferencedAt('B.method(); // 4', false);
+    final element = findElement.typeAlias('B');
+    assertElementIndexText(element, r'''
+94 + 1: IS_REFERENCED_BY
+103 + 1: IS_REFERENCED_BY
+110 + 1: IS_REFERENCED_BY
+122 + 1: IS_REFERENCED_BY
+137 + 1: IS_REFERENCED_BY
+153 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isReferencedBy_typeInVariableList() async {
@@ -1831,8 +2125,10 @@
 class A {}
 A myVariable = null;
 ''');
-    Element element = findElement.class_('A');
-    assertThat(element).isReferencedAt('A myVariable', false);
+    final element = findElement.class_('A');
+    assertElementIndexText(element, r'''
+11 + 1: IS_REFERENCED_BY
+''');
   }
 
   test_isWrittenBy_FieldElement() async {
@@ -1843,10 +2139,11 @@
   A.bar() : field = 5;
 }
 ''');
-    FieldElement element = findElement.field('field');
-    assertThat(element)
-      ..isWrittenAt('field})', true, length: 5)
-      ..isWrittenAt('field = 5', true, length: 5);
+    final element = findElement.field('field');
+    assertElementIndexText(element, r'''
+37 + 5: IS_WRITTEN_BY qualified
+58 + 5: IS_WRITTEN_BY qualified
+''');
   }
 
   test_subtypes_classDeclaration() async {
@@ -2078,109 +2375,54 @@
       ..isUsed('x += 2;', IndexRelationKind.IS_READ_WRITTEN_BY)
       ..isUsed('x();', IndexRelationKind.IS_INVOKED_BY);
   }
-}
 
-class _ElementIndexAssert {
-  final _IndexMixin test;
-  final Element element;
-  final List<_Relation> relations;
+  String _getRelationsText(Element element) {
+    final elementId = _findElementId(element);
 
-  _ElementIndexAssert(this.test, this.element, this.relations);
+    final relations = <_Relation>[];
+    for (var i = 0; i < index.usedElementOffsets.length; i++) {
+      if (index.usedElements[i] == elementId) {
+        relations.add(_Relation(
+            index.usedElementKinds[i],
+            index.usedElementOffsets[i],
+            index.usedElementLengths[i],
+            index.usedElementIsQualifiedFlags[i]));
+      }
+    }
 
-  void hasPrefixes(String expectedPrefixes) {
-    var id = test._findElementId(element);
-    var actualPrefixes = test.index.elementImportPrefixes[id];
-    expect(actualPrefixes, expectedPrefixes);
-  }
+    final sortedRelations = relations.sorted((a, b) {
+      final byOffset = a.offset - b.offset;
+      if (byOffset != 0) {
+        return byOffset;
+      }
+      return a.kind.name.compareTo(b.kind.name);
+    });
 
-  void hasRelationCount(int expectedCount) {
-    expect(relations, hasLength(expectedCount));
-  }
+    final buffer = StringBuffer();
+    for (final relation in sortedRelations) {
+      buffer.write(relation.offset);
+      buffer.write(' + ');
+      buffer.write(relation.length);
+      buffer.write(': ');
+      buffer.write(relation.kind.name);
+      if (relation.isQualified) {
+        buffer.write(' qualified');
+      }
+      buffer.writeln();
+    }
 
-  void isAncestorOf(String search, {int? length}) {
-    test._assertHasRelation(
-        element,
-        relations,
-        IndexRelationKind.IS_ANCESTOR_OF,
-        test._expectedLocation(search, false, length: length));
-  }
+    final prefixes = index.elementImportPrefixes[elementId];
+    if (prefixes.isNotEmpty) {
+      buffer.writeln('Prefixes: $prefixes');
+    }
 
-  void isConstraintAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(element, relations, IndexRelationKind.CONSTRAINS,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isExtendedAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(
-        element,
-        relations,
-        IndexRelationKind.IS_EXTENDED_BY,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isImplementedAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(
-        element,
-        relations,
-        IndexRelationKind.IS_IMPLEMENTED_BY,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isInvokedAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(element, relations, IndexRelationKind.IS_INVOKED_BY,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isInvokedByEnumConstantWithoutArgumentsAt(String search,
-      {required int length}) {
-    test._assertHasRelation(
-      element,
-      relations,
-      IndexRelationKind.IS_INVOKED_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS,
-      test._expectedLocation(search, true, length: length),
-    );
-  }
-
-  void isMixedInAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(
-        element,
-        relations,
-        IndexRelationKind.IS_MIXED_IN_BY,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isReferencedAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(
-        element,
-        relations,
-        IndexRelationKind.IS_REFERENCED_BY,
-        test._expectedLocation(search, isQualified, length: length));
-  }
-
-  void isReferencedByConstructorTearOffAt(String search,
-      {required int length}) {
-    test._assertHasRelation(
-      element,
-      relations,
-      IndexRelationKind.IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF,
-      test._expectedLocation(search, true, length: length),
-    );
-  }
-
-  void isWrittenAt(String search, bool isQualified, {int? length}) {
-    test._assertHasRelation(element, relations, IndexRelationKind.IS_WRITTEN_BY,
-        test._expectedLocation(search, isQualified, length: length));
+    return buffer.toString();
   }
 }
 
 mixin _IndexMixin on PubPackageResolutionTest {
   late AnalysisDriverUnitIndex index;
 
-  _ElementIndexAssert assertThat(Element element) {
-    List<_Relation> relations = _getElementRelations(element);
-    return _ElementIndexAssert(this, element, relations);
-  }
-
   _NameIndexAssert assertThatName(String name) {
     return _NameIndexAssert(this, name);
   }
@@ -2193,24 +2435,6 @@
     );
   }
 
-  /// Asserts that [index] has an item with the expected properties.
-  void _assertHasRelation(
-      Element element,
-      List<_Relation> relations,
-      IndexRelationKind expectedRelationKind,
-      ExpectedLocation expectedLocation) {
-    for (_Relation relation in relations) {
-      if (relation.kind == expectedRelationKind &&
-          relation.offset == expectedLocation.offset &&
-          relation.length == expectedLocation.length &&
-          relation.isQualified == expectedLocation.isQualified) {
-        return;
-      }
-    }
-    _failWithIndexDump(
-        'not found\n$element $expectedRelationKind at $expectedLocation');
-  }
-
   void _assertSubtype(
       int i, String superEncoded, String subName, List<String> members) {
     expect(index.strings[index.supertypes[i]], superEncoded);
@@ -2297,22 +2521,6 @@
     return 0;
   }
 
-  /// Return all relations with [element] in [index].
-  List<_Relation> _getElementRelations(Element element) {
-    int elementId = _findElementId(element);
-    List<_Relation> relations = <_Relation>[];
-    for (int i = 0; i < index.usedElementOffsets.length; i++) {
-      if (index.usedElements[i] == elementId) {
-        relations.add(_Relation(
-            index.usedElementKinds[i],
-            index.usedElementOffsets[i],
-            index.usedElementLengths[i],
-            index.usedElementIsQualifiedFlags[i]));
-      }
-    }
-    return relations;
-  }
-
   int _getStringId(String? str) {
     if (str == null) {
       return index.nullStringId;
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
index f9723e7..3e333b4 100644
--- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
+++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -14,6 +14,7 @@
   static const assertMethods = {
     'ContextResolutionTest.assertDriverStateString',
     'FileResolutionTest.assertStateString',
+    'IndexTest.assertRelationsText',
     'ParserDiagnosticsTest.assertParsedNodeText',
     'ResolutionTest.assertParsedNodeText',
     'ResolutionTest.assertResolvedNodeText',