[dart2js] Cleanup _RtiNode.testState.

Labeling nodes as direct / indirect seems to have been unstable and
unused, so this cl removes that logic. Also removed logic to process
_RtiNode._literalState which ssems to have been unused as well.

Change-Id: Ic463149ee353abcd55c22684f12ba11eb92cc91d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/235722
Reviewed-by: Mayank Patke <fishythefish@google.com>
Commit-Queue: Joshua Litt <joshualitt@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
index 2606826..5bf8933 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -25,22 +25,11 @@
 abstract class RtiNode {
   Entity get entity;
   Set<RtiNode> _dependencies;
-  int _testState = 0;
-  int _literalState = 0;
+  bool _hasTest = false;
 
   Iterable<RtiNode> get dependencies => _dependencies ?? const [];
 
-  bool get hasDirectTest => _testState & 1 != 0;
-  bool get hasIndirectTest => _testState & 2 != 0;
-
-  bool get hasTest => _testState != 0;
-
-  bool get hasDirectLiteral => _literalState & 1 != 0;
-  bool get hasIndirectLiteral => _literalState & 2 != 0;
-
-  bool get hasLiteral => _literalState != 0;
-
-  bool get hasUse => hasTest || hasLiteral;
+  bool get hasTest => _hasTest;
 
   /// Register that if [entity] needs type arguments then so does `node.entity`.
   bool addDependency(RtiNode node) {
@@ -53,52 +42,13 @@
     return _dependencies.add(node);
   }
 
-  void markTest({bool direct}) {
-    setTestState(direct ? 1 : 2);
-  }
-
-  void markDirectTest() {
-    setTestState(1);
-  }
-
-  void markIndirectTest() {
-    setTestState(2);
-  }
-
-  void setTestState(int value) {
-    if (_testState != value) {
-      if (_testState == 0) {
-        _testState |= value;
-        if (_dependencies != null) {
-          for (RtiNode node in _dependencies) {
-            node.markIndirectTest();
-          }
+  void markTest() {
+    if (!hasTest) {
+      _hasTest = true;
+      if (_dependencies != null) {
+        for (RtiNode node in _dependencies) {
+          node.markTest();
         }
-      } else {
-        _testState = value;
-      }
-    }
-  }
-
-  void markDirectLiteral() {
-    setLiteralState(1);
-  }
-
-  void markIndirectLiteral() {
-    setLiteralState(2);
-  }
-
-  void setLiteralState(int value) {
-    if (_literalState != value) {
-      if (_literalState == 0) {
-        _literalState |= value;
-        if (_dependencies != null) {
-          for (RtiNode node in _dependencies) {
-            node.markIndirectLiteral();
-          }
-        }
-      } else {
-        _literalState = value;
       }
     }
   }
@@ -223,9 +173,6 @@
       : explicitIsChecks = _world.isChecks.toSet() {
     _setupDependencies();
     _propagateTests();
-    if (forRtiNeeds) {
-      _propagateLiterals();
-    }
     _collectResults();
   }
 
@@ -249,18 +196,6 @@
   Iterable<ClassEntity> get classTestsForTesting =>
       _classes.values.where((n) => n.hasTest).map((n) => n.cls).toSet();
 
-  /// Classes that explicitly use their type variables in is-tests.
-  ///
-  /// For instance `A` in:
-  ///
-  ///     class A<T> {
-  ///       m(o) => o is T;
-  ///     }
-  ///     main() => new A<int>().m(0);
-  ///
-  Iterable<ClassEntity> get directClassTestsForTesting =>
-      _classes.values.where((n) => n.hasDirectTest).map((n) => n.cls).toSet();
-
   /// Methods that explicitly or implicitly use their type variables in
   /// is-tests.
   ///
@@ -273,18 +208,6 @@
   Iterable<Entity> get methodTestsForTesting =>
       _methods.values.where((n) => n.hasTest).map((n) => n.function).toSet();
 
-  /// Methods that explicitly use their type variables in is-tests.
-  ///
-  /// For instance `m` in:
-  ///
-  ///     m<T>(o) => o is T;
-  ///     main() => m<int>(0);
-  ///
-  Iterable<Entity> get directMethodTestsForTesting => _methods.values
-      .where((n) => n.hasDirectTest)
-      .map((n) => n.function)
-      .toSet();
-
   /// The entities that need type arguments at runtime if the 'key entity' needs
   /// type arguments.
   ///
@@ -546,23 +469,23 @@
   }
 
   void _propagateTests() {
-    void processTypeVariableType(TypeVariableType type, {bool direct = true}) {
+    void processTypeVariableType(TypeVariableType type) {
       TypeVariableEntity variable = type.element;
       if (variable.typeDeclaration is ClassEntity) {
-        _getClassNode(variable.typeDeclaration).markTest(direct: direct);
+        _getClassNode(variable.typeDeclaration).markTest();
       } else {
-        _getMethodNode(variable.typeDeclaration).markTest(direct: direct);
+        _getMethodNode(variable.typeDeclaration).markTest();
       }
     }
 
-    void processType(DartType type, {bool direct = true}) {
+    void processType(DartType type) {
       var typeWithoutNullability = type.withoutNullability;
       if (typeWithoutNullability is FutureOrType) {
-        _getClassNode(_commonElements.futureClass).markIndirectTest();
-        processType(typeWithoutNullability.typeArgument, direct: false);
+        _getClassNode(_commonElements.futureClass).markTest();
+        processType(typeWithoutNullability.typeArgument);
       } else {
         typeWithoutNullability.forEachTypeVariable((TypeVariableType type) {
-          processTypeVariableType(type, direct: direct);
+          processTypeVariableType(type);
         });
       }
     }
@@ -570,40 +493,14 @@
     _world.isChecks.forEach(processType);
   }
 
-  void _propagateLiterals() {
-    _world.typeVariableTypeLiterals
-        .forEach((TypeVariableType typeVariableType) {
-      TypeVariableEntity variable = typeVariableType.element;
-      if (variable.typeDeclaration is ClassEntity) {
-        _getClassNode(variable.typeDeclaration).markDirectLiteral();
-      } else {
-        _getMethodNode(variable.typeDeclaration).markDirectLiteral();
-      }
-    });
-  }
-
   String dump({bool verbose = false}) {
     StringBuffer sb = StringBuffer();
 
     void addNode(RtiNode node) {
-      if (node.hasUse || node.dependencies.isNotEmpty || verbose) {
+      if (node.hasTest || node.dependencies.isNotEmpty || verbose) {
         sb.write(' $node');
-        String comma = '';
-        if (node._testState & 1 != 0) {
-          sb.write(' direct test');
-          comma = ',';
-        }
-        if (node._testState & 2 != 0) {
-          sb.write('$comma indirect test');
-          comma = ',';
-        }
-        if (node._literalState & 1 != 0) {
-          sb.write('$comma direct literal');
-          comma = ',';
-        }
-        if (node._literalState & 2 != 0) {
-          sb.write('$comma indirect literal');
-          comma = ',';
+        if (node.hasTest) {
+          sb.write(' test');
         }
         if (node.dependencies.isNotEmpty || verbose) {
           sb.writeln(':');
diff --git a/pkg/compiler/test/rti/data/async_foreach.dart b/pkg/compiler/test/rti/data/async_foreach.dart
index 1a14bd2..433b5a1 100644
--- a/pkg/compiler/test/rti/data/async_foreach.dart
+++ b/pkg/compiler/test/rti/data/async_foreach.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: Class:direct,explicit=[Class.T*],implicit=[Class.T],needsArgs*/
+/*spec.class: Class:explicit=[Class.T*],implicit=[Class.T],needsArgs,test*/
 /*prod.class: Class:needsArgs*/
 class Class<T> {
   method() {
diff --git a/pkg/compiler/test/rti/data/async_foreach_nonasync.dart b/pkg/compiler/test/rti/data/async_foreach_nonasync.dart
index 0cb5ac1..1e371c6 100644
--- a/pkg/compiler/test/rti/data/async_foreach_nonasync.dart
+++ b/pkg/compiler/test/rti/data/async_foreach_nonasync.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: Class:direct,explicit=[Class.T*],implicit=[Class.T],needsArgs*/
+/*spec.class: Class:explicit=[Class.T*],implicit=[Class.T],needsArgs,test*/
 class Class<T> {
   method() {
     var list = <T>[];
diff --git a/pkg/compiler/test/rti/data/call_typed_generic.dart b/pkg/compiler/test/rti/data/call_typed_generic.dart
index cc7b472..6900251 100644
--- a/pkg/compiler/test/rti/data/call_typed_generic.dart
+++ b/pkg/compiler/test/rti/data/call_typed_generic.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: A:direct,explicit=[A.T*],needsArgs*/
+/*spec.class: A:explicit=[A.T*],needsArgs,test*/
 class A<T> {
   call(T t) {}
 }
diff --git a/pkg/compiler/test/rti/data/closure.dart b/pkg/compiler/test/rti/data/closure.dart
index 2e728d0..c4301ee 100644
--- a/pkg/compiler/test/rti/data/closure.dart
+++ b/pkg/compiler/test/rti/data/closure.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: A:direct,explicit=[A.T*],needsArgs*/
+/*spec.class: A:explicit=[A.T*],needsArgs,test*/
 /*prod.class: A:needsArgs*/
 class A<T> {
   m() {
diff --git a/pkg/compiler/test/rti/data/closure_generic_unneeded.dart b/pkg/compiler/test/rti/data/closure_generic_unneeded.dart
index 6b0ad84..9f8c2d8 100644
--- a/pkg/compiler/test/rti/data/closure_generic_unneeded.dart
+++ b/pkg/compiler/test/rti/data/closure_generic_unneeded.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: A:direct,explicit=[A.T*],needsArgs*/
+/*spec.class: A:explicit=[A.T*],needsArgs,test*/
 /*prod.class: A:needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/pkg/compiler/test/rti/data/closure_unneeded.dart b/pkg/compiler/test/rti/data/closure_unneeded.dart
index 6b0ad84..9f8c2d8 100644
--- a/pkg/compiler/test/rti/data/closure_unneeded.dart
+++ b/pkg/compiler/test/rti/data/closure_unneeded.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: A:direct,explicit=[A.T*],needsArgs*/
+/*spec.class: A:explicit=[A.T*],needsArgs,test*/
 /*prod.class: A:needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/pkg/compiler/test/rti/data/dynamic_is.dart b/pkg/compiler/test/rti/data/dynamic_is.dart
index 6c4e5f6..279a58a 100644
--- a/pkg/compiler/test/rti/data/dynamic_is.dart
+++ b/pkg/compiler/test/rti/data/dynamic_is.dart
@@ -5,7 +5,7 @@
 // @dart = 2.7
 
 class A {
-  /*member: A.instanceMethod:direct,explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
+  /*member: A.instanceMethod:explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)],test*/
   instanceMethod<T>(t) => t is T;
 }
 
diff --git a/pkg/compiler/test/rti/data/dynamic_is2.dart b/pkg/compiler/test/rti/data/dynamic_is2.dart
index 213c6bf..4da18d6 100644
--- a/pkg/compiler/test/rti/data/dynamic_is2.dart
+++ b/pkg/compiler/test/rti/data/dynamic_is2.dart
@@ -6,12 +6,12 @@
 
 /*spec.class: A:explicit=[A*]*/
 class A {
-  /*member: A.instanceMethod:deps=[B.instanceMethod],direct,explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
+  /*member: A.instanceMethod:deps=[B.instanceMethod],explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)],test*/
   instanceMethod<T>(t) => t is T;
 }
 
 class B {
-  /*member: B.instanceMethod:implicit=[instanceMethod.T],indirect,needsArgs,selectors=[Selector(call, instanceMethod, arity=2, types=1)]*/
+  /*member: B.instanceMethod:implicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=2, types=1)],test*/
   instanceMethod<T>(A a, t) => a.instanceMethod<T>(t);
 }
 
diff --git a/pkg/compiler/test/rti/data/dynamic_is_closure.dart b/pkg/compiler/test/rti/data/dynamic_is_closure.dart
index d5e213c..3cee2f0 100644
--- a/pkg/compiler/test/rti/data/dynamic_is_closure.dart
+++ b/pkg/compiler/test/rti/data/dynamic_is_closure.dart
@@ -5,7 +5,7 @@
 // @dart = 2.7
 
 class A {
-  /*member: A.instanceMethod:direct,explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
+  /*member: A.instanceMethod:explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)],test*/
   instanceMethod<T>(t) => t is T;
 }
 
diff --git a/pkg/compiler/test/rti/data/dynamic_is_closure2.dart b/pkg/compiler/test/rti/data/dynamic_is_closure2.dart
index 36482a6..dddff8c 100644
--- a/pkg/compiler/test/rti/data/dynamic_is_closure2.dart
+++ b/pkg/compiler/test/rti/data/dynamic_is_closure2.dart
@@ -5,12 +5,12 @@
 // @dart = 2.7
 
 class A {
-  /*member: A.instanceMethod:deps=[local],direct,explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
+  /*member: A.instanceMethod:deps=[local],explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)],test*/
   instanceMethod<T>(t) => t is T;
 }
 
 main() {
-  /*implicit=[local.T],indirect,needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
+  /*implicit=[local.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)],test*/
   local<T>(t) {
     var a = new A();
     a.instanceMethod<T>(t);
diff --git a/pkg/compiler/test/rti/data/dynamic_tear_off.dart b/pkg/compiler/test/rti/data/dynamic_tear_off.dart
index baae3e9..2e21118 100644
--- a/pkg/compiler/test/rti/data/dynamic_tear_off.dart
+++ b/pkg/compiler/test/rti/data/dynamic_tear_off.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*member: staticMethod:direct,explicit=[staticMethod.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
+/*member: staticMethod:explicit=[staticMethod.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)],test*/
 staticMethod<T>(t) => t is T;
 
 main() {
diff --git a/pkg/compiler/test/rti/data/dynamic_tear_off2.dart b/pkg/compiler/test/rti/data/dynamic_tear_off2.dart
index 1db565c..ddf36f7 100644
--- a/pkg/compiler/test/rti/data/dynamic_tear_off2.dart
+++ b/pkg/compiler/test/rti/data/dynamic_tear_off2.dart
@@ -4,11 +4,11 @@
 
 // @dart = 2.7
 
-/*member: staticMethod:deps=[B.instanceMethod],direct,explicit=[staticMethod.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
+/*member: staticMethod:deps=[B.instanceMethod],explicit=[staticMethod.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)],test*/
 staticMethod<T>(t) => t is T;
 
 class B {
-  /*member: B.instanceMethod:implicit=[instanceMethod.T],indirect,needsArgs,selectors=[Selector(call, instanceMethod, arity=2, types=1)]*/
+  /*member: B.instanceMethod:implicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=2, types=1)],test*/
   instanceMethod<T>(a, t) => a<T>(t);
 }
 
diff --git a/pkg/compiler/test/rti/data/dynamic_tear_off3.dart b/pkg/compiler/test/rti/data/dynamic_tear_off3.dart
index 8917791..51f06d1 100644
--- a/pkg/compiler/test/rti/data/dynamic_tear_off3.dart
+++ b/pkg/compiler/test/rti/data/dynamic_tear_off3.dart
@@ -6,11 +6,11 @@
 
 /*spec.class: A:explicit=[A*]*/
 class A {
-  /*member: A.instanceMethod:deps=[staticMethod],direct,explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
+  /*member: A.instanceMethod:deps=[staticMethod],explicit=[instanceMethod.T*],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)],test*/
   instanceMethod<T>(t) => t is T;
 }
 
-/*member: staticMethod:implicit=[staticMethod.T],indirect,needsArgs,selectors=[Selector(call, call, arity=2, types=1)]*/
+/*member: staticMethod:implicit=[staticMethod.T],needsArgs,selectors=[Selector(call, call, arity=2, types=1)],test*/
 staticMethod<T>(A a, t) => a.instanceMethod<T>(t);
 
 main() {
diff --git a/pkg/compiler/test/rti/data/dynamic_tear_off4.dart b/pkg/compiler/test/rti/data/dynamic_tear_off4.dart
index 462b94d..5ac2dd1 100644
--- a/pkg/compiler/test/rti/data/dynamic_tear_off4.dart
+++ b/pkg/compiler/test/rti/data/dynamic_tear_off4.dart
@@ -4,10 +4,10 @@
 
 // @dart = 2.7
 
-/*member: staticMethod1:deps=[staticMethod2],direct,explicit=[staticMethod1.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
+/*member: staticMethod1:deps=[staticMethod2],explicit=[staticMethod1.T*],needsArgs,selectors=[Selector(call, call, arity=1, types=1)],test*/
 staticMethod1<T>(t) => t is T;
 
-/*member: staticMethod2:implicit=[staticMethod2.T],indirect,needsArgs,selectors=[Selector(call, call, arity=2, types=1)]*/
+/*member: staticMethod2:implicit=[staticMethod2.T],needsArgs,selectors=[Selector(call, call, arity=2, types=1)],test*/
 staticMethod2<T>(a, t) => a<T>(t);
 
 main() {
diff --git a/pkg/compiler/test/rti/data/explicit_as.dart b/pkg/compiler/test/rti/data/explicit_as.dart
index cbfeda5..e90aad4 100644
--- a/pkg/compiler/test/rti/data/explicit_as.dart
+++ b/pkg/compiler/test/rti/data/explicit_as.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: C:direct,explicit=[C.T*,C<String*>*],needsArgs*/
+/*spec.class: C:explicit=[C.T*,C<String*>*],needsArgs,test*/
 class C<T> {
   T field;
 }
diff --git a/pkg/compiler/test/rti/data/function_subtype_local5.dart b/pkg/compiler/test/rti/data/function_subtype_local5.dart
index bf14939..dd30a14 100644
--- a/pkg/compiler/test/rti/data/function_subtype_local5.dart
+++ b/pkg/compiler/test/rti/data/function_subtype_local5.dart
@@ -17,7 +17,7 @@
 typedef int Boz<T>(T a);
 typedef int Biz<T>(T a, int b);
 
-/*class: C:direct,explicit=[int* Function(C.T*)*,int* Function(C.T*,[String*])*,int* Function(C.T*,int*)*,int* Function(C.T*,{,b:String*})*],needsArgs*/
+/*class: C:explicit=[int* Function(C.T*)*,int* Function(C.T*,[String*])*,int* Function(C.T*,int*)*,int* Function(C.T*,{,b:String*})*],needsArgs,test*/
 class C<T> {
   void test(String nameOfT, bool expectedResult) {
     // TODO(johnniwinther): Optimize local function type signature need.
diff --git a/pkg/compiler/test/rti/data/future_or.dart b/pkg/compiler/test/rti/data/future_or.dart
index 40e625c..afdce83 100644
--- a/pkg/compiler/test/rti/data/future_or.dart
+++ b/pkg/compiler/test/rti/data/future_or.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 
-/*spec.class: global#Future:implicit=[Future<A*>],indirect,needsArgs*/
+/*spec.class: global#Future:implicit=[Future<A*>],needsArgs,test*/
 
 /*class: A:explicit=[FutureOr<A*>*],implicit=[A,Future<A*>]*/
 class A {}
diff --git a/pkg/compiler/test/rti/data/future_or_future_or.dart b/pkg/compiler/test/rti/data/future_or_future_or.dart
index f2ff8ff..b7bc862 100644
--- a/pkg/compiler/test/rti/data/future_or_future_or.dart
+++ b/pkg/compiler/test/rti/data/future_or_future_or.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 
-/*spec.class: global#Future:implicit=[Future<A*>,Future<FutureOr<A*>*>],indirect,needsArgs*/
+/*spec.class: global#Future:implicit=[Future<A*>,Future<FutureOr<A*>*>],needsArgs,test*/
 
 /*class: A:explicit=[FutureOr<FutureOr<A*>*>*],implicit=[A,Future<A*>,Future<FutureOr<A*>*>,FutureOr<A*>]*/
 class A {}
diff --git a/pkg/compiler/test/rti/data/future_or_future_or_generic.dart b/pkg/compiler/test/rti/data/future_or_future_or_generic.dart
index 85a79bb..846a4f7 100644
--- a/pkg/compiler/test/rti/data/future_or_future_or_generic.dart
+++ b/pkg/compiler/test/rti/data/future_or_future_or_generic.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-/*spec.class: global#Future:deps=[A],implicit=[Future<B<A.T*>*>,Future<C*>],indirect,needsArgs*/
+/*spec.class: global#Future:deps=[A],implicit=[Future<B<A.T*>*>,Future<C*>],needsArgs,test*/
 
-/*class: A:explicit=[FutureOr<B<A.T*>*>*],implicit=[B<A.T*>,Future<B<A.T*>*>],indirect,needsArgs*/
+/*class: A:explicit=[FutureOr<B<A.T*>*>*],implicit=[B<A.T*>,Future<B<A.T*>*>],needsArgs,test*/
 class A<T> {
   m(o) => o is FutureOr<B<T>>;
 }
diff --git a/pkg/compiler/test/rti/data/future_or_generic.dart b/pkg/compiler/test/rti/data/future_or_generic.dart
index 31edda3..b1376f4 100644
--- a/pkg/compiler/test/rti/data/future_or_generic.dart
+++ b/pkg/compiler/test/rti/data/future_or_generic.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-/*spec.class: global#Future:deps=[A],implicit=[Future<A.T*>],indirect,needsArgs*/
+/*spec.class: global#Future:deps=[A],implicit=[Future<A.T*>],needsArgs,test*/
 
-/*class: A:explicit=[FutureOr<A.T*>*],implicit=[A.T,Future<A.T*>],indirect,needsArgs*/
+/*class: A:explicit=[FutureOr<A.T*>*],implicit=[A.T,Future<A.T*>],needsArgs,test*/
 class A<T> {
   m(o) => o is FutureOr<T>;
 }
diff --git a/pkg/compiler/test/rti/data/future_or_generic2.dart b/pkg/compiler/test/rti/data/future_or_generic2.dart
index c4d594a..827b8ad 100644
--- a/pkg/compiler/test/rti/data/future_or_generic2.dart
+++ b/pkg/compiler/test/rti/data/future_or_generic2.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-/*spec.class: global#Future:deps=[A],implicit=[Future<B<A.T*>*>],indirect,needsArgs*/
+/*spec.class: global#Future:deps=[A],implicit=[Future<B<A.T*>*>],needsArgs,test*/
 
-/*class: A:explicit=[FutureOr<B<A.T*>*>*],implicit=[B<A.T*>,Future<B<A.T*>*>],indirect,needsArgs*/
+/*class: A:explicit=[FutureOr<B<A.T*>*>*],implicit=[B<A.T*>,Future<B<A.T*>*>],needsArgs,test*/
 class A<T> {
   m(o) => o is FutureOr<B<T>>;
 }
diff --git a/pkg/compiler/test/rti/data/generic_class_is.dart b/pkg/compiler/test/rti/data/generic_class_is.dart
index 0268c28..a56334a 100644
--- a/pkg/compiler/test/rti/data/generic_class_is.dart
+++ b/pkg/compiler/test/rti/data/generic_class_is.dart
@@ -7,7 +7,7 @@
 /*class: A:implicit=[A]*/
 class A {}
 
-/*class: B:direct,explicit=[B.T*],needsArgs*/
+/*class: B:explicit=[B.T*],needsArgs,test*/
 class B<T> {
   @pragma('dart2js:noInline')
   method(T t) => t is T;
diff --git a/pkg/compiler/test/rti/data/generic_class_is2.dart b/pkg/compiler/test/rti/data/generic_class_is2.dart
index 2703f47..20864b8 100644
--- a/pkg/compiler/test/rti/data/generic_class_is2.dart
+++ b/pkg/compiler/test/rti/data/generic_class_is2.dart
@@ -12,7 +12,7 @@
 /*spec.class: A1:implicit=[A1]*/
 class A1 implements A<C1> {}
 
-/*class: B:direct,explicit=[B.T*],needsArgs*/
+/*class: B:explicit=[B.T*],needsArgs,test*/
 class B<T> {
   @pragma('dart2js:noInline')
   method(var t) => t is T;
diff --git a/pkg/compiler/test/rti/data/generic_instanceof4.dart b/pkg/compiler/test/rti/data/generic_instanceof4.dart
index bfa2a1f..0bcf276 100644
--- a/pkg/compiler/test/rti/data/generic_instanceof4.dart
+++ b/pkg/compiler/test/rti/data/generic_instanceof4.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*class: A:deps=[B],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[B],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -15,7 +15,7 @@
 /*class: BB:implicit=[BB]*/
 class BB {}
 
-/*class: B:implicit=[B.T],indirect,needsArgs*/
+/*class: B:implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo() {
diff --git a/pkg/compiler/test/rti/data/generic_instanceof4_unused.dart b/pkg/compiler/test/rti/data/generic_instanceof4_unused.dart
index ee06e93..5b45da2 100644
--- a/pkg/compiler/test/rti/data/generic_instanceof4_unused.dart
+++ b/pkg/compiler/test/rti/data/generic_instanceof4_unused.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*class: A:deps=[B],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[B],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -16,7 +16,7 @@
 // computation of implicit is-tests.
 class BB {}
 
-/*class: B:implicit=[B.T],indirect,needsArgs*/
+/*class: B:implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo() {
diff --git a/pkg/compiler/test/rti/data/generic_method1.dart b/pkg/compiler/test/rti/data/generic_method1.dart
index f0f6f81..11237ef 100644
--- a/pkg/compiler/test/rti/data/generic_method1.dart
+++ b/pkg/compiler/test/rti/data/generic_method1.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*class: A:deps=[method2],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[method2],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -17,11 +17,11 @@
 /*class: BB:implicit=[BB]*/
 class BB {}
 
-/*member: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
+/*member: method2:deps=[B],implicit=[method2.T],needsArgs,test*/
 @pragma('dart2js:noInline')
 method2<T>() => new A<T>();
 
-/*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
+/*class: B:deps=[method1],implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo() {
@@ -29,7 +29,7 @@
   }
 }
 
-/*member: method1:implicit=[method1.T],indirect,needsArgs*/
+/*member: method1:implicit=[method1.T],needsArgs,test*/
 @pragma('dart2js:noInline')
 method1<T>() {
   return new B<T>().foo();
diff --git a/pkg/compiler/test/rti/data/generic_method2.dart b/pkg/compiler/test/rti/data/generic_method2.dart
index 9fc5d87..101c7f7 100644
--- a/pkg/compiler/test/rti/data/generic_method2.dart
+++ b/pkg/compiler/test/rti/data/generic_method2.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*class: A:deps=[B],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[B],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -17,7 +17,7 @@
 /*class: BB:implicit=[BB]*/
 class BB {}
 
-/*class: B:deps=[method1],implicit=[B.T],indirect,needsArgs*/
+/*class: B:deps=[method1],implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo() {
@@ -25,7 +25,7 @@
   }
 }
 
-/*member: method1:implicit=[method1.T],indirect,needsArgs*/
+/*member: method1:implicit=[method1.T],needsArgs,test*/
 @pragma('dart2js:noInline')
 method1<T>() {
   return new B<T>().foo();
diff --git a/pkg/compiler/test/rti/data/generic_method3.dart b/pkg/compiler/test/rti/data/generic_method3.dart
index 2bc69b6..d2e7916 100644
--- a/pkg/compiler/test/rti/data/generic_method3.dart
+++ b/pkg/compiler/test/rti/data/generic_method3.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*class: A:deps=[method2],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[method2],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -17,11 +17,11 @@
 /*class: BB:implicit=[BB]*/
 class BB {}
 
-/*member: method2:deps=[B],implicit=[method2.T],indirect,needsArgs*/
+/*member: method2:deps=[B],implicit=[method2.T],needsArgs,test*/
 @pragma('dart2js:noInline')
 method2<T>() => new A<T>();
 
-/*class: B:implicit=[B.T],indirect,needsArgs*/
+/*class: B:implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo() {
diff --git a/pkg/compiler/test/rti/data/generic_method4.dart b/pkg/compiler/test/rti/data/generic_method4.dart
index d1b48b4..7e1c616 100644
--- a/pkg/compiler/test/rti/data/generic_method4.dart
+++ b/pkg/compiler/test/rti/data/generic_method4.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*class: A:deps=[C.method2],direct,explicit=[A.T*],needsArgs*/
+/*class: A:deps=[C.method2],explicit=[A.T*],needsArgs,test*/
 class A<T> {
   @pragma('dart2js:noInline')
   foo(x) {
@@ -17,7 +17,7 @@
 /*class: BB:implicit=[BB]*/
 class BB {}
 
-/*class: B:deps=[C.method1],implicit=[B.T],indirect,needsArgs*/
+/*class: B:deps=[C.method1],implicit=[B.T],needsArgs,test*/
 class B<T> implements BB {
   @pragma('dart2js:noInline')
   foo(c) {
@@ -26,13 +26,13 @@
 }
 
 class C {
-  /*member: C.method1:implicit=[method1.T],indirect,needsArgs,selectors=[Selector(call, method1, arity=0, types=1)]*/
+  /*member: C.method1:implicit=[method1.T],needsArgs,selectors=[Selector(call, method1, arity=0, types=1)],test*/
   @pragma('dart2js:noInline')
   method1<T>() {
     return new B<T>().foo(this);
   }
 
-  /*member: C.method2:deps=[B],implicit=[method2.T],indirect,needsArgs,selectors=[Selector(call, method2, arity=0, types=1)]*/
+  /*member: C.method2:deps=[B],implicit=[method2.T],needsArgs,selectors=[Selector(call, method2, arity=0, types=1)],test*/
   @pragma('dart2js:noInline')
   method2<T>() => new A<T>();
 }
diff --git a/pkg/compiler/test/rti/data/generic_method_is.dart b/pkg/compiler/test/rti/data/generic_method_is.dart
index 246e40b..19036845 100644
--- a/pkg/compiler/test/rti/data/generic_method_is.dart
+++ b/pkg/compiler/test/rti/data/generic_method_is.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*member: method:direct,explicit=[method.T*],needsArgs*/
+/*member: method:explicit=[method.T*],needsArgs,test*/
 method<T>(T t) => t is T;
 
 main() {
diff --git a/pkg/compiler/test/rti/data/generic_method_is2.dart b/pkg/compiler/test/rti/data/generic_method_is2.dart
index 9505896..e67767e 100644
--- a/pkg/compiler/test/rti/data/generic_method_is2.dart
+++ b/pkg/compiler/test/rti/data/generic_method_is2.dart
@@ -47,36 +47,36 @@
 class F3 {}
 
 // Calls to this imply a check of the passed type arguments.
-/*member: topLevelMethod1:direct,explicit=[topLevelMethod1.T*],needsArgs,selectors=[Selector(call, call, arity=2, named=[a1], types=1)]*/
+/*member: topLevelMethod1:explicit=[topLevelMethod1.T*],needsArgs,selectors=[Selector(call, call, arity=2, named=[a1], types=1)],test*/
 bool topLevelMethod1<T>(T t, {a1}) => t is T;
 
 // Calls to this does _not_ imply a check of the passed type arguments.
-/*spec.member: topLevelMethod2:direct,explicit=[topLevelMethod2.T*],needsArgs,selectors=[Selector(call, call, arity=2, named=[a2], types=1)]*/
+/*spec.member: topLevelMethod2:explicit=[topLevelMethod2.T*],needsArgs,selectors=[Selector(call, call, arity=2, named=[a2], types=1)],test*/
 T topLevelMethod2<T>(T t, {a2}) => t;
 
 class Class {
   // Calls to this imply a check of the passed type arguments.
-  /*member: Class.instanceMethod1:direct,explicit=[instanceMethod1.S*],needsArgs,selectors=[Selector(call, call, arity=2, named=[b1], types=1),Selector(call, instanceMethod1, arity=2, named=[b1], types=1)]*/
+  /*member: Class.instanceMethod1:explicit=[instanceMethod1.S*],needsArgs,selectors=[Selector(call, call, arity=2, named=[b1], types=1),Selector(call, instanceMethod1, arity=2, named=[b1], types=1)],test*/
   bool instanceMethod1<S>(S s, {b1}) => s is S;
 
   // Calls to this does _not_ imply a check of the passed type arguments.
-  /*spec.member: Class.instanceMethod2:direct,explicit=[instanceMethod2.S*],needsArgs,selectors=[Selector(call, call, arity=2, named=[b2], types=1),Selector(call, instanceMethod2, arity=2, named=[b2], types=1)]*/
+  /*spec.member: Class.instanceMethod2:explicit=[instanceMethod2.S*],needsArgs,selectors=[Selector(call, call, arity=2, named=[b2], types=1),Selector(call, instanceMethod2, arity=2, named=[b2], types=1)],test*/
   S instanceMethod2<S>(S s, {b2}) => s;
 }
 
 main() {
   // Calls to this imply a check of the passed type arguments.
-  /*direct,explicit=[localFunction1.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)]*/
+  /*explicit=[localFunction1.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)],test*/
   bool localFunction1<U>(U u, {c1}) => u is U;
 
   // Calls to this does _not_ imply a check of the passed type arguments.
-  /*spec.direct,explicit=[localFunction2.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c2], types=1)]*/
+  /*spec.explicit=[localFunction2.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c2], types=1)],test*/
   U localFunction2<U>(U u, {c2}) => u;
 
   // Calls to this does _not_ imply a check of the passed type arguments. A
   // call to the .call function on this will, though, since it has the same
   // signature as [localFunction1] which needs its type arguments.
-  /*spec.direct,explicit=[localFunction3.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)]*/
+  /*spec.explicit=[localFunction3.U*],needsArgs,selectors=[Selector(call, call, arity=2, named=[c1], types=1)],test*/
   localFunction3<U>(U u, {c1}) => u;
 
   var c = new Class();
diff --git a/pkg/compiler/test/rti/data/generic_methods_dynamic_05.dart b/pkg/compiler/test/rti/data/generic_methods_dynamic_05.dart
index 051894e..17bb4da 100644
--- a/pkg/compiler/test/rti/data/generic_methods_dynamic_05.dart
+++ b/pkg/compiler/test/rti/data/generic_methods_dynamic_05.dart
@@ -8,9 +8,9 @@
 
 // Test derived from language_2/generic_methods_dynamic_test/05
 
-/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
 /*prod.class: global#JSArray:deps=[List],needsArgs*/
-/*spec.class: global#List:deps=[C.bar,JSArray.markFixedList],explicit=[List,List<B*>*,List<Object>,List<String>?,List<markFixedList.T>],indirect,needsArgs*/
+/*spec.class: global#List:deps=[C.bar,JSArray.markFixedList],explicit=[List,List<B*>*,List<Object>,List<String>?,List<markFixedList.T>],needsArgs,test*/
 /*prod.class: global#List:deps=[C.bar],explicit=[List<B*>*],needsArgs*/
 
 class A {}
@@ -20,7 +20,7 @@
 class B {}
 
 class C {
-  /*spec.member: C.bar:direct,explicit=[Iterable<bar.T*>*],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*spec.member: C.bar:explicit=[Iterable<bar.T*>*],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)],test*/
   /*prod.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   List<T> bar<T>(Iterable<T> t) => <T>[t.first];
 }
diff --git a/pkg/compiler/test/rti/data/generic_methods_dynamic_05a.dart b/pkg/compiler/test/rti/data/generic_methods_dynamic_05a.dart
index 3226063..7c759ee 100644
--- a/pkg/compiler/test/rti/data/generic_methods_dynamic_05a.dart
+++ b/pkg/compiler/test/rti/data/generic_methods_dynamic_05a.dart
@@ -8,7 +8,7 @@
 
 // Reduced version of generic_methods_dynamic_05a_strong.
 
-/*spec.class: A:deps=[C.bar],direct,explicit=[A.T*,A<B*>*,A<bar.T*>*],needsArgs*/
+/*spec.class: A:deps=[C.bar],explicit=[A.T*,A<B*>*,A<bar.T*>*],needsArgs,test*/
 /*prod.class: A:deps=[C.bar],explicit=[A<B*>*],needsArgs*/
 class A<T> {
   final T field;
@@ -21,7 +21,7 @@
 class B {}
 
 class C {
-  /*spec.member: C.bar:explicit=[A<bar.T*>*],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*spec.member: C.bar:explicit=[A<bar.T*>*],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)],test*/
   /*prod.member: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   A<T> bar<T>(A<T> t) => new A<T>(t.field);
 }
diff --git a/pkg/compiler/test/rti/data/implicit_as.dart b/pkg/compiler/test/rti/data/implicit_as.dart
index ddf0046..0c78cd3 100644
--- a/pkg/compiler/test/rti/data/implicit_as.dart
+++ b/pkg/compiler/test/rti/data/implicit_as.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: C:direct,explicit=[C.T*,C<String*>*],needsArgs*/
+/*spec.class: C:explicit=[C.T*,C<String*>*],needsArgs,test*/
 class C<T> {
   T field;
 }
diff --git a/pkg/compiler/test/rti/data/indirect_through_static.dart b/pkg/compiler/test/rti/data/indirect_through_static.dart
index 2b5b0be..9c7ffc5 100644
--- a/pkg/compiler/test/rti/data/indirect_through_static.dart
+++ b/pkg/compiler/test/rti/data/indirect_through_static.dart
@@ -19,7 +19,7 @@
   map['x'] = new C<B>();
 }
 
-/*member: lookup:direct,explicit=[C<lookup.T*>*],needsArgs*/
+/*member: lookup:explicit=[C<lookup.T*>*],needsArgs,test*/
 C<T> lookup<T>(String key) {
   final value = map[key];
   if (value != null && value is C<T>) {
diff --git a/pkg/compiler/test/rti/data/instantiation1.dart b/pkg/compiler/test/rti/data/instantiation1.dart
index 0ea6b96..6033cf6 100644
--- a/pkg/compiler/test/rti/data/instantiation1.dart
+++ b/pkg/compiler/test/rti/data/instantiation1.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*spec.member: f:deps=[B],direct,explicit=[f.T*],needsArgs,needsInst=[<B.S*>]*/
+/*spec.member: f:deps=[B],explicit=[f.T*],needsArgs,needsInst=[<B.S*>],test*/
 /*prod.member: f:deps=[B]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*spec.class: B:explicit=[int* Function(B.S*)*],implicit=[B.S],indirect,needsArgs*/
+/*spec.class: B:explicit=[int* Function(B.S*)*],implicit=[B.S],needsArgs,test*/
 /*prod.class: B:needsArgs*/
 class B<S> {
   F<S> c;
diff --git a/pkg/compiler/test/rti/data/instantiation2.dart b/pkg/compiler/test/rti/data/instantiation2.dart
index 934152a..ef67348 100644
--- a/pkg/compiler/test/rti/data/instantiation2.dart
+++ b/pkg/compiler/test/rti/data/instantiation2.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*member: f:deps=[B],direct,explicit=[f.T*],needsArgs,needsInst=[<B.S*>]*/
+/*member: f:deps=[B],explicit=[f.T*],needsArgs,needsInst=[<B.S*>],test*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*spec.class: B:explicit=[bool* Function(B.S*)*],implicit=[B.S],indirect,needsArgs*/
-/*prod.class: B:implicit=[B.S],indirect,needsArgs*/
+/*spec.class: B:explicit=[bool* Function(B.S*)*],implicit=[B.S],needsArgs,test*/
+/*prod.class: B:implicit=[B.S],needsArgs,test*/
 class B<S> {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation3.dart b/pkg/compiler/test/rti/data/instantiation3.dart
index 4c13f62..5712524 100644
--- a/pkg/compiler/test/rti/data/instantiation3.dart
+++ b/pkg/compiler/test/rti/data/instantiation3.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*spec.member: f:deps=[B],direct,explicit=[f.T*],needsArgs,needsInst=[<B.S*>]*/
+/*spec.member: f:deps=[B],explicit=[f.T*],needsArgs,needsInst=[<B.S*>],test*/
 /*prod.member: f:deps=[B]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*spec.class: B:direct,explicit=[int* Function(B.S*)*],implicit=[B.S],needsArgs*/
+/*spec.class: B:explicit=[int* Function(B.S*)*],implicit=[B.S],needsArgs,test*/
 /*prod.class: B:needsArgs*/
 class B<S> {
   F<S> c;
diff --git a/pkg/compiler/test/rti/data/instantiation4.dart b/pkg/compiler/test/rti/data/instantiation4.dart
index af33f43..9f92b96 100644
--- a/pkg/compiler/test/rti/data/instantiation4.dart
+++ b/pkg/compiler/test/rti/data/instantiation4.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*member: f:deps=[B],direct,explicit=[f.T*],needsArgs,needsInst=[<B.S*>]*/
+/*member: f:deps=[B],explicit=[f.T*],needsArgs,needsInst=[<B.S*>],test*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*spec.class: B:direct,explicit=[bool* Function(B.S*)*],implicit=[B.S],needsArgs*/
-/*prod.class: B:implicit=[B.S],indirect,needsArgs*/
+/*spec.class: B:explicit=[bool* Function(B.S*)*],implicit=[B.S],needsArgs,test*/
+/*prod.class: B:implicit=[B.S],needsArgs,test*/
 class B<S> {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation5.dart b/pkg/compiler/test/rti/data/instantiation5.dart
index 3c37996..855d5ab 100644
--- a/pkg/compiler/test/rti/data/instantiation5.dart
+++ b/pkg/compiler/test/rti/data/instantiation5.dart
@@ -4,13 +4,13 @@
 
 // @dart = 2.7
 
-/*spec.member: f:deps=[method],direct,explicit=[f.T*],needsArgs,needsInst=[<method.S*>]*/
+/*spec.member: f:deps=[method],explicit=[f.T*],needsArgs,needsInst=[<method.S*>],test*/
 /*prod.member: f:deps=[method]*/
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
 
-/*spec.member: method:implicit=[method.S],indirect,needsArgs*/
+/*spec.member: method:implicit=[method.S],needsArgs,test*/
 /*prod.member: method:needsArgs*/
 method<S>() {
   F<S> c;
diff --git a/pkg/compiler/test/rti/data/instantiation6.dart b/pkg/compiler/test/rti/data/instantiation6.dart
index e596af2..d235bca 100644
--- a/pkg/compiler/test/rti/data/instantiation6.dart
+++ b/pkg/compiler/test/rti/data/instantiation6.dart
@@ -4,12 +4,12 @@
 
 // @dart = 2.7
 
-/*member: f:deps=[method],direct,explicit=[f.T*],needsArgs,needsInst=[<method.S*>]*/
+/*member: f:deps=[method],explicit=[f.T*],needsArgs,needsInst=[<method.S*>],test*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*member: method:implicit=[method.S],indirect,needsArgs*/
+/*member: method:implicit=[method.S],needsArgs,test*/
 method<S>() {
   F<S> c;
 
diff --git a/pkg/compiler/test/rti/data/instantiation7.dart b/pkg/compiler/test/rti/data/instantiation7.dart
index 216c83d..5a09574 100644
--- a/pkg/compiler/test/rti/data/instantiation7.dart
+++ b/pkg/compiler/test/rti/data/instantiation7.dart
@@ -4,15 +4,15 @@
 
 // @dart = 2.7
 
-/*spec.member: f1:deps=[method],direct,explicit=[f1.T*],needsArgs,needsInst=[<method.X*>]*/
+/*spec.member: f1:deps=[method],explicit=[f1.T*],needsArgs,needsInst=[<method.X*>],test*/
 /*prod.member: f1:deps=[method]*/
 int f1<T>(T a, T b, T c) => null;
 
-/*spec.member: f2:deps=[method],direct,explicit=[f2.S*,f2.T*],needsArgs,needsInst=[<method.X*,method.Y*>]*/
+/*spec.member: f2:deps=[method],explicit=[f2.S*,f2.T*],needsArgs,needsInst=[<method.X*,method.Y*>],test*/
 /*prod.member: f2:deps=[method]*/
 int f2<T, S>(T a, S b, S c) => null;
 
-/*spec.member: f3:deps=[method],direct,explicit=[f3.S*,f3.T*,f3.U*],needsArgs,needsInst=[<method.X*,method.Y*,method.Z*>]*/
+/*spec.member: f3:deps=[method],explicit=[f3.S*,f3.T*,f3.U*],needsArgs,needsInst=[<method.X*,method.Y*,method.Z*>],test*/
 /*prod.member: f3:deps=[method]*/
 int f3<T, S, U>(T a, S b, U c) => null;
 
@@ -20,7 +20,7 @@
 typedef int F2<R, P>(R a, P b, P c);
 typedef int F3<R, P, Q>(R a, P b, Q c);
 
-/*spec.member: method:implicit=[method.X,method.Y,method.Z],indirect,needsArgs*/
+/*spec.member: method:implicit=[method.X,method.Y,method.Z],needsArgs,test*/
 /*prod.member: method:needsArgs*/
 method<X, Y, Z>() {
   F1<X> c1;
diff --git a/pkg/compiler/test/rti/data/is_type_variable.dart b/pkg/compiler/test/rti/data/is_type_variable.dart
index b188421..96d76ef 100644
--- a/pkg/compiler/test/rti/data/is_type_variable.dart
+++ b/pkg/compiler/test/rti/data/is_type_variable.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*class: A:direct,explicit=[A.T*],needsArgs*/
+/*class: A:explicit=[A.T*],needsArgs,test*/
 class A<T> {
   m(T t) => t is T;
 }
diff --git a/pkg/compiler/test/rti/data/is_type_variable_super.dart b/pkg/compiler/test/rti/data/is_type_variable_super.dart
index 286e73b..65c7bae 100644
--- a/pkg/compiler/test/rti/data/is_type_variable_super.dart
+++ b/pkg/compiler/test/rti/data/is_type_variable_super.dart
@@ -6,7 +6,7 @@
 
 class A<T> {}
 
-/*class: B:direct,explicit=[B.T*],needsArgs*/
+/*class: B:explicit=[B.T*],needsArgs,test*/
 class B<T> extends A<T> {
   m(T t) => t is T;
 }
diff --git a/pkg/compiler/test/rti/data/is_type_variable_super_complex.dart b/pkg/compiler/test/rti/data/is_type_variable_super_complex.dart
index d512bd1..18f00af 100644
--- a/pkg/compiler/test/rti/data/is_type_variable_super_complex.dart
+++ b/pkg/compiler/test/rti/data/is_type_variable_super_complex.dart
@@ -6,7 +6,7 @@
 
 class A<T> {}
 
-/*class: B:direct,explicit=[B.T*],needsArgs*/
+/*class: B:explicit=[B.T*],needsArgs,test*/
 class B<T> extends A<List<T>> {
   m(T t) => t is T;
 }
diff --git a/pkg/compiler/test/rti/data/list_literal.dart b/pkg/compiler/test/rti/data/list_literal.dart
index c4f9b47..c76451d 100644
--- a/pkg/compiler/test/rti/data/list_literal.dart
+++ b/pkg/compiler/test/rti/data/list_literal.dart
@@ -4,11 +4,11 @@
 
 // @dart = 2.7
 
-/*spec.class: global#List:deps=[Class.m,JSArray.markFixedList],explicit=[List,List<Object>,List<String>?,List<markFixedList.T>],indirect,needsArgs*/
-/*prod.class: global#List:deps=[Class.m],indirect,needsArgs*/
+/*spec.class: global#List:deps=[Class.m,JSArray.markFixedList],explicit=[List,List<Object>,List<String>?,List<markFixedList.T>],needsArgs,test*/
+/*prod.class: global#List:deps=[Class.m],needsArgs,test*/
 
-/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
-/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
+/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
 
 main() {
   var c = new Class();
@@ -18,7 +18,7 @@
 }
 
 class Class {
-  /*member: Class.m:implicit=[m.T],indirect,needsArgs,selectors=[Selector(call, m, arity=0, types=1)]*/
+  /*member: Class.m:implicit=[m.T],needsArgs,selectors=[Selector(call, m, arity=0, types=1)],test*/
   m<T>() {
     return <T>[];
   }
diff --git a/pkg/compiler/test/rti/data/list_to_set.dart b/pkg/compiler/test/rti/data/list_to_set.dart
index 63884f8..c73b735 100644
--- a/pkg/compiler/test/rti/data/list_to_set.dart
+++ b/pkg/compiler/test/rti/data/list_to_set.dart
@@ -4,11 +4,11 @@
 
 // @dart = 2.7
 
-/*spec.class: global#List:deps=[Class,JSArray.markFixedList],explicit=[List,List<Object>,List<String>?,List<markFixedList.T>],indirect,needsArgs*/
-/*prod.class: global#List:deps=[Class],indirect,needsArgs*/
+/*spec.class: global#List:deps=[Class,JSArray.markFixedList],explicit=[List,List<Object>,List<String>?,List<markFixedList.T>],needsArgs,test*/
+/*prod.class: global#List:deps=[Class],needsArgs,test*/
 
-/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
-/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
+/*prod.class: global#JSArray:deps=[List],implicit=[JSArray.E],needsArgs,test*/
 
 main() {
   var c = new Class<int>();
@@ -17,7 +17,7 @@
   set is Set<String>;
 }
 
-/*class: Class:implicit=[Class.T],indirect,needsArgs*/
+/*class: Class:implicit=[Class.T],needsArgs,test*/
 class Class<T> {
   m() {
     return <T>[];
diff --git a/pkg/compiler/test/rti/data/local_function_generic.dart b/pkg/compiler/test/rti/data/local_function_generic.dart
index 80892aa..861d030 100644
--- a/pkg/compiler/test/rti/data/local_function_generic.dart
+++ b/pkg/compiler/test/rti/data/local_function_generic.dart
@@ -7,7 +7,7 @@
 import 'package:compiler/src/util/testing.dart';
 
 method1() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsSignature,test*/
   /*prod.needsArgs,needsSignature*/
   T local<T>(T t) => t;
   return local;
diff --git a/pkg/compiler/test/rti/data/local_function_list_literal.dart b/pkg/compiler/test/rti/data/local_function_list_literal.dart
index 3de5b69..0af6116 100644
--- a/pkg/compiler/test/rti/data/local_function_list_literal.dart
+++ b/pkg/compiler/test/rti/data/local_function_list_literal.dart
@@ -6,11 +6,11 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],indirect,needsArgs*/
+/*spec.class: global#JSArray:deps=[ArrayIterator,List],explicit=[JSArray,JSArray.E,JSArray<ArrayIterator.E>],implicit=[JSArray.E],needsArgs,test*/
 /*prod.class: global#JSArray:deps=[List],needsArgs*/
 
 @pragma('dart2js:noInline')
-/*spec.member: method:implicit=[method.T],indirect,needsArgs*/
+/*spec.member: method:implicit=[method.T],needsArgs,test*/
 /*prod.member: method:needsArgs*/
 method<T>() {
   return /*spec.*/ () => <T>[];
diff --git a/pkg/compiler/test/rti/data/local_function_map_literal.dart b/pkg/compiler/test/rti/data/local_function_map_literal.dart
index a0dca5f..7130d69 100644
--- a/pkg/compiler/test/rti/data/local_function_map_literal.dart
+++ b/pkg/compiler/test/rti/data/local_function_map_literal.dart
@@ -6,11 +6,11 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*spec.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs,test*/
 /*prod.class: global#LinkedHashMap:deps=[Map],needsArgs*/
 
 @pragma('dart2js:noInline')
-/*spec.member: method:implicit=[method.T],indirect,needsArgs*/
+/*spec.member: method:implicit=[method.T],needsArgs,test*/
 /*prod.member: method:needsArgs*/
 method<T>() {
   return /*spec.needsSignature*/ () => <T, int>{};
diff --git a/pkg/compiler/test/rti/data/local_function_signature2.dart b/pkg/compiler/test/rti/data/local_function_signature2.dart
index 06bcb64..1d06d37 100644
--- a/pkg/compiler/test/rti/data/local_function_signature2.dart
+++ b/pkg/compiler/test/rti/data/local_function_signature2.dart
@@ -24,7 +24,7 @@
 }
 
 class Class2 {
-  /*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*spec.member: Class2.method4:explicit=[method4.T*],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)],test*/
   /*prod.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
@@ -44,14 +44,14 @@
 
 class Class4 {
   /*prod.member: Class4.method6:needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
-  /*spec.member: Class4.method6:direct,explicit=[method6.T*],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*spec.member: Class4.method6:explicit=[method6.T*],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)],test*/
   method6<T>() {
     /*needsSignature*/ num local(num n, T t) => null;
     return local;
   }
 }
 
-/*spec.member: method7:direct,explicit=[method7.T*],needsArgs*/
+/*spec.member: method7:explicit=[method7.T*],needsArgs,test*/
 /*prod.member: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
@@ -66,7 +66,7 @@
   return local;
 }
 
-/*spec.member: method9:direct,explicit=[method9.T*],needsArgs*/
+/*spec.member: method9:explicit=[method9.T*],needsArgs,test*/
 /*prod.member: method9:needsArgs*/
 method9<T>() {
   /*needsSignature*/ num local(num n, T t) => null;
@@ -74,7 +74,7 @@
 }
 
 method10() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsSignature,test*/
   /*prod.needsArgs,needsSignature*/ num local<T>(T n) => null;
   return local;
 }
@@ -85,7 +85,7 @@
 }
 
 method12() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsSignature,test*/
   /*prod.needsArgs,needsSignature*/ num local<T>(num n, T t) => null;
   return local;
 }
diff --git a/pkg/compiler/test/rti/data/local_function_signatures.dart b/pkg/compiler/test/rti/data/local_function_signatures.dart
index ad97152..cacf62d 100644
--- a/pkg/compiler/test/rti/data/local_function_signatures.dart
+++ b/pkg/compiler/test/rti/data/local_function_signatures.dart
@@ -24,7 +24,7 @@
   }
 }
 
-/*spec.class: Class2:direct,explicit=[Class2.T*],needsArgs*/
+/*spec.class: Class2:explicit=[Class2.T*],needsArgs,test*/
 /*prod.class: Class2:needsArgs*/
 class Class2<T> {
   method4() {
@@ -43,7 +43,7 @@
   }
 }
 
-/*spec.class: Class4:direct,explicit=[Class4.T*],needsArgs*/
+/*spec.class: Class4:explicit=[Class4.T*],needsArgs,test*/
 /*prod.class: Class4:needsArgs*/
 class Class4<T> {
   method6() {
diff --git a/pkg/compiler/test/rti/data/local_function_signatures_generic.dart b/pkg/compiler/test/rti/data/local_function_signatures_generic.dart
index fa0d44f..8f651f6 100644
--- a/pkg/compiler/test/rti/data/local_function_signatures_generic.dart
+++ b/pkg/compiler/test/rti/data/local_function_signatures_generic.dart
@@ -27,7 +27,7 @@
 }
 
 class Class2 {
-  /*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
+  /*spec.member: Class2.method4:explicit=[method4.T*],needsArgs,selectors=[Selector(call, method4, arity=0, types=1)],test*/
   /*prod.member: Class2.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
   method4<T>() {
     /*needsSignature*/
@@ -47,14 +47,14 @@
 
 class Class4 {
   /*prod.member: Class4.method6:needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
-  /*spec.member: Class4.method6:direct,explicit=[method6.T*],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)]*/
+  /*spec.member: Class4.method6:explicit=[method6.T*],needsArgs,selectors=[Selector(call, method6, arity=0, types=1)],test*/
   method6<T>() {
     /*needsSignature*/ num local(num n, T t) => null;
     return local;
   }
 }
 
-/*spec.member: method7:direct,explicit=[method7.T*],needsArgs*/
+/*spec.member: method7:explicit=[method7.T*],needsArgs,test*/
 /*prod.member: method7:needsArgs*/
 method7<T>() {
   /*needsSignature*/
@@ -69,7 +69,7 @@
   return local;
 }
 
-/*spec.member: method9:direct,explicit=[method9.T*],needsArgs*/
+/*spec.member: method9:explicit=[method9.T*],needsArgs,test*/
 /*prod.member: method9:needsArgs*/
 method9<T>() {
   /*needsSignature*/ num local(num n, T t) => null;
@@ -77,7 +77,7 @@
 }
 
 method10() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature,test*/
   /*prod.needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature*/
   num local<T>(T n) => null;
   return local;
@@ -90,7 +90,7 @@
 }
 
 method12() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsSignature,test*/
   /*prod.needsArgs,needsSignature*/ num local<T>(num n, T t) => null;
   return local;
 }
@@ -102,7 +102,7 @@
 }
 
 num Function(num) method14() {
-  /*spec.direct,explicit=[local.T*],needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature*/
+  /*spec.explicit=[local.T*],needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature,test*/
   /*prod.needsArgs,needsInst=[<dynamic>,<num*>,<num*>],needsSignature*/
   num local<T>(T n) => null;
   return local;
diff --git a/pkg/compiler/test/rti/data/map_literal.dart b/pkg/compiler/test/rti/data/map_literal.dart
index 988f06e..60568fd 100644
--- a/pkg/compiler/test/rti/data/map_literal.dart
+++ b/pkg/compiler/test/rti/data/map_literal.dart
@@ -5,13 +5,13 @@
 // @dart = 2.7
 
 /*prod.class: global#Map:*/
-/*spec.class: global#Map:explicit=[Map,Map<Object?,Object?>],indirect,needsArgs*/
+/*spec.class: global#Map:explicit=[Map,Map<Object?,Object?>],needsArgs,test*/
 
 /*prod.class: global#LinkedHashMap:deps=[Map]*/
-/*spec.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*spec.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs,test*/
 
 /*prod.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-/*spec.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap,JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*spec.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap,JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K],needsArgs,test*/
 
 /*prod.class: global#double:*/
 /*spec.class: global#double:implicit=[double]*/
diff --git a/pkg/compiler/test/rti/data/map_to_set.dart b/pkg/compiler/test/rti/data/map_to_set.dart
index 4c870c3..33c2194 100644
--- a/pkg/compiler/test/rti/data/map_to_set.dart
+++ b/pkg/compiler/test/rti/data/map_to_set.dart
@@ -5,13 +5,13 @@
 // @dart = 2.7
 
 /*prod.class: global#Map:deps=[Class],needsArgs*/
-/*spec.class: global#Map:deps=[Class],explicit=[Map,Map<Object?,Object?>],indirect,needsArgs*/
+/*spec.class: global#Map:deps=[Class],explicit=[Map,Map<Object?,Object?>],needsArgs,test*/
 
 /*prod.class: global#LinkedHashMap:deps=[Map],implicit=[LinkedHashMap.K],needsArgs*/
-/*spec.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
+/*spec.class: global#LinkedHashMap:deps=[Map],explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs,test*/
 
 /*prod.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
-/*spec.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap,JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*spec.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap,JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K],needsArgs,test*/
 
 /*prod.class: global#double:*/
 /*spec.class: global#double:implicit=[double]*/
@@ -25,7 +25,7 @@
   set is Set<String>;
 }
 
-/*spec.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
+/*spec.class: Class:implicit=[Class.S,Class.T],needsArgs,test*/
 /*prod.class: Class:needsArgs*/
 class Class<T, S> {
   m() {
diff --git a/pkg/compiler/test/rti/data/method_signatures.dart b/pkg/compiler/test/rti/data/method_signatures.dart
index 93ab6d2..29baa2f 100644
--- a/pkg/compiler/test/rti/data/method_signatures.dart
+++ b/pkg/compiler/test/rti/data/method_signatures.dart
@@ -17,7 +17,7 @@
   Object method3(num n) => null;
 }
 
-/*spec.class: Class2:direct,explicit=[Class2.T*],needsArgs*/
+/*spec.class: Class2:explicit=[Class2.T*],needsArgs,test*/
 class Class2<T> {
   num method4(T n) => null;
 }
@@ -28,7 +28,7 @@
   T method5(num n) => null;
 }
 
-/*spec.class: Class4:direct,explicit=[Class4.T*],needsArgs*/
+/*spec.class: Class4:explicit=[Class4.T*],needsArgs,test*/
 class Class4<T> {
   /*member: Class4.method6:*/
   num method6(num n, T t) => null;
diff --git a/pkg/compiler/test/rti/data/method_signatures_generic.dart b/pkg/compiler/test/rti/data/method_signatures_generic.dart
index 96dd598..8a8f55b 100644
--- a/pkg/compiler/test/rti/data/method_signatures_generic.dart
+++ b/pkg/compiler/test/rti/data/method_signatures_generic.dart
@@ -18,7 +18,7 @@
 }
 
 class Class2 {
-  /*spec.member: Class2.method4:direct,explicit=[method4.T*],needsArgs,needsInst=[<num*>,<num*>]*/
+  /*spec.member: Class2.method4:explicit=[method4.T*],needsArgs,needsInst=[<num*>,<num*>],test*/
   num method4<T>(T n) => null;
 }
 
@@ -28,17 +28,17 @@
 }
 
 class Class4 {
-  /*spec.member: Class4.method6:direct,explicit=[method6.T*],needsArgs*/
+  /*spec.member: Class4.method6:explicit=[method6.T*],needsArgs,test*/
   num method6<T>(num n, T t) => null;
 }
 
-/*spec.member: method7:direct,explicit=[method7.T*],needsArgs,needsInst=[<num*>,<num*>]*/
+/*spec.member: method7:explicit=[method7.T*],needsArgs,needsInst=[<num*>,<num*>],test*/
 num method7<T>(T n) => null;
 
 /*member: method8:*/
 T method8<T>(num n) => null;
 
-/*spec.member: method9:direct,explicit=[method9.T*],needsArgs*/
+/*spec.member: method9:explicit=[method9.T*],needsArgs,test*/
 num method9<T>(num n, T t) => null;
 
 @pragma('dart2js:noInline')
diff --git a/pkg/compiler/test/rti/data/private_dynamic.dart b/pkg/compiler/test/rti/data/private_dynamic.dart
index 87f1714..f6fbdb8 100644
--- a/pkg/compiler/test/rti/data/private_dynamic.dart
+++ b/pkg/compiler/test/rti/data/private_dynamic.dart
@@ -5,7 +5,7 @@
 // @dart = 2.7
 
 class C {
-  /*member: C._private:direct,explicit=[_private.T*],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
+  /*member: C._private:explicit=[_private.T*],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)],test*/
   _private<T>(t) => t is T;
 }
 
diff --git a/pkg/compiler/test/rti/data/private_dynamic2.dart b/pkg/compiler/test/rti/data/private_dynamic2.dart
index 2126428..723250a 100644
--- a/pkg/compiler/test/rti/data/private_dynamic2.dart
+++ b/pkg/compiler/test/rti/data/private_dynamic2.dart
@@ -5,12 +5,12 @@
 // @dart = 2.7
 
 class C {
-  /*member: C._private:deps=[D._private2],direct,explicit=[_private.T*],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
+  /*member: C._private:deps=[D._private2],explicit=[_private.T*],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)],test*/
   _private<T>(t) => t is T;
 }
 
 class D {
-  /*member: D._private2:implicit=[_private2.T],indirect,needsArgs,selectors=[Selector(call, _private2, arity=2, types=1)]*/
+  /*member: D._private2:implicit=[_private2.T],needsArgs,selectors=[Selector(call, _private2, arity=2, types=1)],test*/
   _private2<T>(c, t) => c._private<T>(t);
 }
 
diff --git a/pkg/compiler/test/rti/data/runtime_type_closure_equals2.dart b/pkg/compiler/test/rti/data/runtime_type_closure_equals2.dart
index a9199b1..00ea501 100644
--- a/pkg/compiler/test/rti/data/runtime_type_closure_equals2.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_closure_equals2.dart
@@ -17,7 +17,7 @@
   /*needsArgs,needsSignature*/
   T local1b<T>() => null;
 
-  /*spec.direct,explicit=[local2.T*],needsArgs,needsSignature*/
+  /*spec.explicit=[local2.T*],needsArgs,needsSignature,test*/
   /*prod.needsArgs,needsSignature*/
   T local2<T>(T t, String s) => t;
 
diff --git a/pkg/compiler/test/rti/data/runtime_type_closure_equals3.dart b/pkg/compiler/test/rti/data/runtime_type_closure_equals3.dart
index bba535c..83b4387 100644
--- a/pkg/compiler/test/rti/data/runtime_type_closure_equals3.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_closure_equals3.dart
@@ -8,7 +8,7 @@
 
 String method() => null;
 
-/*spec.class: Class1:direct,explicit=[Class1.T*],needsArgs*/
+/*spec.class: Class1:explicit=[Class1.T*],needsArgs,test*/
 /*prod.class: Class1:needsArgs*/
 class Class1<T> {
   Class1();
diff --git a/pkg/compiler/test/rti/data/runtime_type_closure_equals5.dart b/pkg/compiler/test/rti/data/runtime_type_closure_equals5.dart
index b3477bb..63a7b9e 100644
--- a/pkg/compiler/test/rti/data/runtime_type_closure_equals5.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_closure_equals5.dart
@@ -6,7 +6,7 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*spec.class: Class1:direct,explicit=[Class1.T*],needsArgs*/
+/*spec.class: Class1:explicit=[Class1.T*],needsArgs,test*/
 /*prod.class: Class1:needsArgs*/
 class Class1<T> {
   Class1();
diff --git a/pkg/compiler/test/rti/data/runtime_type_closure_equals7.dart b/pkg/compiler/test/rti/data/runtime_type_closure_equals7.dart
index 8ffc992..804a190 100644
--- a/pkg/compiler/test/rti/data/runtime_type_closure_equals7.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_closure_equals7.dart
@@ -12,7 +12,7 @@
 /*member: method1b:*/
 T method1b<T>() => null;
 
-/*spec.member: method2:direct,explicit=[method2.T*],needsArgs*/
+/*spec.member: method2:explicit=[method2.T*],needsArgs,test*/
 T method2<T>(T t, String s) => t;
 
 class Class<T> {
diff --git a/pkg/compiler/test/rti/data/runtime_type_closure_equals8.dart b/pkg/compiler/test/rti/data/runtime_type_closure_equals8.dart
index fae683f..4dde28e 100644
--- a/pkg/compiler/test/rti/data/runtime_type_closure_equals8.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_closure_equals8.dart
@@ -15,7 +15,7 @@
   /*member: Class1.method1b:*/
   T method1b<T>() => null;
 
-  /*spec.member: Class1.method2:direct,explicit=[method2.T*],needsArgs*/
+  /*spec.member: Class1.method2:explicit=[method2.T*],needsArgs,test*/
   T method2<T>(T t, String s) => t;
 }
 
diff --git a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string1.dart b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string1.dart
index f8ee428..92ef961 100644
--- a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string1.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string1.dart
@@ -9,7 +9,7 @@
 /*member: global#instantiate1:needsArgs*/
 
 main() {
-  /*spec.direct,explicit=[id.T*],needsArgs,needsInst=[<int*>],needsSignature*/
+  /*spec.explicit=[id.T*],needsArgs,needsInst=[<int*>],needsSignature,test*/
   T id<T>(T t, String s) => t;
   int Function(int, String s) x = id;
   makeLive("${x.runtimeType}");
diff --git a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string2.dart b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string2.dart
index 09002a4..f45d037 100644
--- a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string2.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string2.dart
@@ -8,7 +8,7 @@
 
 /*member: global#instantiate1:needsArgs*/
 
-/*spec.member: id:direct,explicit=[id.T*],needsArgs,needsInst=[<int*>]*/
+/*spec.member: id:explicit=[id.T*],needsArgs,needsInst=[<int*>],test*/
 T id<T>(T t, String s) => t;
 
 main() {
diff --git a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string3.dart b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string3.dart
index 5de5547..ddcced5 100644
--- a/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string3.dart
+++ b/pkg/compiler/test/rti/data/runtime_type_instantiate_to_string3.dart
@@ -9,7 +9,7 @@
 /*member: global#instantiate1:needsArgs*/
 
 class Class {
-  /*spec.member: Class.id:direct,explicit=[id.T*],needsArgs,needsInst=[<int*>]*/
+  /*spec.member: Class.id:explicit=[id.T*],needsArgs,needsInst=[<int*>],test*/
   T id<T>(T t, String s) => t;
 }
 
diff --git a/pkg/compiler/test/rti/data/tear_off_generic.dart b/pkg/compiler/test/rti/data/tear_off_generic.dart
index 1aa8d04..f2446f1 100644
--- a/pkg/compiler/test/rti/data/tear_off_generic.dart
+++ b/pkg/compiler/test/rti/data/tear_off_generic.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.7
 
-/*spec.class: A:direct,explicit=[A.T*],needsArgs*/
+/*spec.class: A:explicit=[A.T*],needsArgs,test*/
 class A<T> {
   void m(T t) {}
 
diff --git a/pkg/compiler/test/rti/data/type_variable_function_type.dart b/pkg/compiler/test/rti/data/type_variable_function_type.dart
index d36e45f..2c31bc6 100644
--- a/pkg/compiler/test/rti/data/type_variable_function_type.dart
+++ b/pkg/compiler/test/rti/data/type_variable_function_type.dart
@@ -10,7 +10,7 @@
 
 typedef T Func<T>();
 
-/*class: Foo:direct,explicit=[Foo.S* Function()*],needsArgs*/
+/*class: Foo:explicit=[Foo.S* Function()*],needsArgs,test*/
 class Foo<S> {
   m(x) => x is Func<S>;
 }
diff --git a/pkg/compiler/test/rti/rti_need_test_helper.dart b/pkg/compiler/test/rti/rti_need_test_helper.dart
index 8973cd7..56b4627 100644
--- a/pkg/compiler/test/rti/rti_need_test_helper.dart
+++ b/pkg/compiler/test/rti/rti_need_test_helper.dart
@@ -46,8 +46,7 @@
   static const String dependencies = 'deps';
   static const String explicitTypeCheck = 'explicit';
   static const String implicitTypeCheck = 'implicit';
-  static const String directTypeArgumentTest = 'direct';
-  static const String indirectTypeArgumentTest = 'indirect';
+  static const String typeArgumentTest = 'test';
   static const String typeLiteral = 'exp';
   static const String selectors = 'selectors';
   static const String instantiationsNeedTypeArguments = 'needsInst';
@@ -109,12 +108,9 @@
         .contains(frontendClass)) {
       features.add(Tags.typeLiteral);
     }
-    if (rtiNeedBuilder.typeVariableTestsForTesting.directClassTestsForTesting
+    if (rtiNeedBuilder.typeVariableTestsForTesting.classTestsForTesting
         .contains(frontendClass)) {
-      features.add(Tags.directTypeArgumentTest);
-    } else if (rtiNeedBuilder.typeVariableTestsForTesting.classTestsForTesting
-        .contains(frontendClass)) {
-      features.add(Tags.indirectTypeArgumentTest);
+      features.add(Tags.typeArgumentTest);
     }
     findChecks(features, Tags.explicitTypeCheck, frontendClass,
         rtiNeedBuilder.typeVariableTestsForTesting.explicitIsChecks);
@@ -139,14 +135,9 @@
 
       void addFrontendData(Entity entity) {
         findDependencies(features, entity);
-        if (rtiNeedBuilder
-            .typeVariableTestsForTesting.directMethodTestsForTesting
+        if (rtiNeedBuilder.typeVariableTestsForTesting.methodTestsForTesting
             .contains(entity)) {
-          features.add(Tags.directTypeArgumentTest);
-        } else if (rtiNeedBuilder
-            .typeVariableTestsForTesting.methodTestsForTesting
-            .contains(entity)) {
-          features.add(Tags.indirectTypeArgumentTest);
+          features.add(Tags.typeArgumentTest);
         }
         findChecks(features, Tags.explicitTypeCheck, entity,
             rtiNeedBuilder.typeVariableTestsForTesting.explicitIsChecks);