Include receiver method invocation receiver type in static type test

Change-Id: I61227e694ca2a19d268705e7a79ae0e696e3a79b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101524
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/tests/compiler/dart2js/static_type/data/assert.dart b/tests/compiler/dart2js/static_type/data/assert.dart
index 0f0057e..54f2a34 100644
--- a/tests/compiler/dart2js/static_type/data/assert.dart
+++ b/tests/compiler/dart2js/static_type/data/assert.dart
@@ -18,25 +18,25 @@
 }
 
 assert1(Class c) {
-  assert(/*Class*/ c /*invoke: bool*/ != null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
   /*Class*/ c.next;
 }
 
 assert2(Class c) {
-  assert(/*Class*/ c /*invoke: bool*/ == null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
   /*Class*/ c.next;
 }
 
 assert3(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: bool*/ != null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
 
 assert4(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: bool*/ == null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/assert_ea.dart b/tests/compiler/dart2js/static_type/data/assert_ea.dart
index 9e6edbd..c28215d 100644
--- a/tests/compiler/dart2js/static_type/data/assert_ea.dart
+++ b/tests/compiler/dart2js/static_type/data/assert_ea.dart
@@ -18,25 +18,25 @@
 }
 
 assert1(Class c) {
-  assert(/*Class*/ c /*invoke: bool*/ != null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
   /*Class*/ c.next;
 }
 
 assert2(Class c) {
-  assert(/*Class*/ c /*invoke: bool*/ == null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
   /*Null*/ c.next;
 }
 
 assert3(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: bool*/ != null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ != null);
   if (/*bool*/ b) return;
   /*Class*/ c.next;
 }
 
 assert4(Class c) {
   bool b;
-  assert(/*Class*/ c /*invoke: bool*/ == null);
+  assert(/*Class*/ c /*invoke: [Class]->bool*/ == null);
   if (/*bool*/ b) return;
   /*Null*/ c.next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/cascade.dart b/tests/compiler/dart2js/static_type/data/cascade.dart
index 08c3e25..4f2f6a5 100644
--- a/tests/compiler/dart2js/static_type/data/cascade.dart
+++ b/tests/compiler/dart2js/static_type/data/cascade.dart
@@ -8,8 +8,8 @@
 
 promotedCascade(dynamic value) {
   if (/*dynamic*/ value is List<String>) {
-    value =
-        '[${(/*List<String>*/ value.. /*invoke: void*/ sort()). /*invoke: String*/ join(',')}]';
+    value = '[${(
+        /*List<String>*/ value.. /*invoke: [List<String>]->void*/ sort()). /*invoke: [List<String>]->String*/ join(',')}]';
   }
   return /*dynamic*/ value;
 }
diff --git a/tests/compiler/dart2js/static_type/data/closure.dart b/tests/compiler/dart2js/static_type/data/closure.dart
index 0878854..f24f209 100644
--- a/tests/compiler/dart2js/static_type/data/closure.dart
+++ b/tests/compiler/dart2js/static_type/data/closure.dart
@@ -29,7 +29,7 @@
     }
 
     /*dynamic*/ c.next;
-    /*invoke: Null*/ local();
+    /*invoke: [Null Function()]->Null*/ local();
     /*dynamic*/ c.next;
   }
 }
@@ -42,7 +42,7 @@
     }
 
     /*Class*/ c.next;
-    /*invoke: Null*/ local();
+    /*invoke: [Null Function()]->Null*/ local();
     /*Class*/ c.next;
   }
 }
@@ -56,7 +56,7 @@
 
     c = 0;
     /*dynamic*/ c.next;
-    /*invoke: Null*/ local();
+    /*invoke: [Null Function()]->Null*/ local();
     /*dynamic*/ c.next;
   }
 }
@@ -69,7 +69,7 @@
     }
 
     /*Class*/ c.next;
-    /*invoke: Null*/ local();
+    /*invoke: [Null Function()]->Null*/ local();
     /*Class*/ c.next;
     c = 0;
     /*dynamic*/ c.next;
@@ -85,7 +85,7 @@
     }
 
     /*dynamic*/ c.next;
-    /*invoke: Null*/ local();
+    /*invoke: [Null Function()]->Null*/ local();
     /*dynamic*/ c.next;
     c = 0;
     /*dynamic*/ c.next;
@@ -101,7 +101,7 @@
   }
 
   /*dynamic*/ c.next;
-  /*invoke: Null*/ local();
+  /*invoke: [Null Function()]->Null*/ local();
   /*dynamic*/ c.next;
   c = 0;
   /*dynamic*/ c.next;
@@ -118,10 +118,11 @@
 closure6(var x) {
   var closure;
   /*dynamic*/ x is B &&
-      _returnTrue(closure = () => /*dynamic*/ x. /*invoke: dynamic*/ f());
+      _returnTrue(
+          closure = () => /*dynamic*/ x. /*invoke: [dynamic]->dynamic*/ f());
   /*dynamic*/ x;
   x = new A();
-  /*dynamic*/ closure. /*invoke: dynamic*/ call();
+  /*dynamic*/ closure. /*invoke: [dynamic]->dynamic*/ call();
   /*dynamic*/ x;
 }
 
@@ -137,20 +138,20 @@
 
 _closure7(C x) {
   /*C*/ x is D && _returnTrue((() => /*C*/ x))
-      ? /*D*/ x. /*invoke: dynamic*/ f()
+      ? /*D*/ x. /*invoke: [D]->dynamic*/ f()
       : x = new C();
   _returnTrue((() => /*C*/ x)) && /*C*/ x is D
-      ? /*D*/ x. /*invoke: dynamic*/ f()
+      ? /*D*/ x. /*invoke: [D]->dynamic*/ f()
       : x = new C();
 
   (/*C*/ x is D && _returnTrue((() => /*C*/ x))) &&
           (/*D*/ x is E && _returnTrue((() => /*C*/ x)))
-      ? /*E*/ x. /*invoke: dynamic*/ g()
+      ? /*E*/ x. /*invoke: [E]->dynamic*/ g()
       : x = new C();
 
   (_returnTrue((() => /*C*/ x)) && /*C*/ x is E) &&
           (_returnTrue((() => /*C*/ x)) && /*E*/ x is D)
-      ? /*E*/ x. /*invoke: dynamic*/ g()
+      ? /*E*/ x. /*invoke: [E]->dynamic*/ g()
       : x = new C();
 }
 
diff --git a/tests/compiler/dart2js/static_type/data/do.dart b/tests/compiler/dart2js/static_type/data/do.dart
index 205480d..0d0952b 100644
--- a/tests/compiler/dart2js/static_type/data/do.dart
+++ b/tests/compiler/dart2js/static_type/data/do.dart
@@ -20,7 +20,7 @@
         /*Class*/ c.next;
       }
       c = 0;
-    } while (/*dynamic*/ c /*invoke: bool*/ != null);
+    } while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null);
     /*dynamic*/ c.next;
   }
 }
@@ -30,7 +30,7 @@
     /*Class*/ c.next;
     do {
       /*Class*/ c.next;
-    } while (/*Class*/ c /*invoke: bool*/ != null);
+    } while (/*Class*/ c /*invoke: [Class]->bool*/ != null);
     /*Class*/ c.next;
   }
 }
diff --git a/tests/compiler/dart2js/static_type/data/effectively_final.dart b/tests/compiler/dart2js/static_type/data/effectively_final.dart
index 58bd022..a50cdaf 100644
--- a/tests/compiler/dart2js/static_type/data/effectively_final.dart
+++ b/tests/compiler/dart2js/static_type/data/effectively_final.dart
@@ -11,14 +11,14 @@
 
 effectivelyFinalList() {
   dynamic c = [];
-  /*List<dynamic>*/ c. /*invoke: void*/ add(null);
-  /*List<dynamic>*/ c.length /*invoke: int*/ + 1;
+  /*List<dynamic>*/ c. /*invoke: [List<dynamic>]->void*/ add(null);
+  /*List<dynamic>*/ c.length /*invoke: [int]->int*/ + 1;
 }
 
 notEffectivelyFinalList() {
   dynamic c = [];
-  /*dynamic*/ c. /*invoke: dynamic*/ add(null);
-  /*dynamic*/ c.length /*invoke: dynamic*/ + 1;
+  /*dynamic*/ c. /*invoke: [dynamic]->dynamic*/ add(null);
+  /*dynamic*/ c.length /*invoke: [dynamic]->dynamic*/ + 1;
   c = null;
 }
 
@@ -26,9 +26,9 @@
 
 effectivelyFinalPromoted() {
   dynamic c = _method1();
-  /*num*/ c /*invoke: num*/ + 0;
+  /*num*/ c /*invoke: [num]->num*/ + 0;
   if (/*num*/ c is int) {
-    /*int*/ c /*invoke: int*/ + 1;
+    /*int*/ c /*invoke: [int]->int*/ + 1;
   }
 }
 
@@ -36,8 +36,8 @@
 
 effectivelyFinalPromotedInvalid() {
   dynamic c = _method2();
-  /*String*/ c /*invoke: String*/ + '';
+  /*String*/ c /*invoke: [String]->String*/ + '';
   if (/*String*/ c is int) {
-    /*int*/ c /*invoke: int*/ + 1;
+    /*int*/ c /*invoke: [int]->int*/ + 1;
   }
 }
diff --git a/tests/compiler/dart2js/static_type/data/for.dart b/tests/compiler/dart2js/static_type/data/for.dart
index d755de9..3d4bb82 100644
--- a/tests/compiler/dart2js/static_type/data/for.dart
+++ b/tests/compiler/dart2js/static_type/data/for.dart
@@ -17,7 +17,7 @@
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
     for (/*Class*/ c.next;
-        /*dynamic*/ c /*invoke: bool*/ != null;
+        /*dynamic*/ c /*invoke: [dynamic]->bool*/ != null;
         /*dynamic*/ c.next) {
       /*dynamic*/ c.next;
       if (/*dynamic*/ c is Class) {
@@ -33,7 +33,7 @@
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
     for (/*Class*/ c.next;
-        /*Class*/ c /*invoke: bool*/ != null;
+        /*Class*/ c /*invoke: [Class]->bool*/ != null;
         /*Class*/ c.next) {
       /*Class*/ c.next;
     }
diff --git a/tests/compiler/dart2js/static_type/data/generic_method.dart b/tests/compiler/dart2js/static_type/data/generic_method.dart
index 99a2f17..8026b3c 100644
--- a/tests/compiler/dart2js/static_type/data/generic_method.dart
+++ b/tests/compiler/dart2js/static_type/data/generic_method.dart
@@ -19,16 +19,16 @@
 
 genericMethod1(c) {
   if (/*dynamic*/ c is Class1) {
-    /*Class1*/ c. /*invoke: String*/ method('').length;
+    /*Class1*/ c. /*invoke: [Class1]->String*/ method('').length;
   }
 }
 
 genericMethod2(c) {
   if (/*dynamic*/ c is! Class1) return;
-  /*Class1*/ c. /*invoke: dynamic*/ method('').length;
+  /*Class1*/ c. /*invoke: [Class1]->dynamic*/ method('').length;
 }
 
 genericMethod3() {
   dynamic c = new Class2<int>();
-  /*Class2<int>*/ c. /*invoke: int*/ method();
+  /*Class2<int>*/ c. /*invoke: [Class2<int>]->int*/ method();
 }
diff --git a/tests/compiler/dart2js/static_type/data/null.dart b/tests/compiler/dart2js/static_type/data/null.dart
index c0b9386..dcbe522 100644
--- a/tests/compiler/dart2js/static_type/data/null.dart
+++ b/tests/compiler/dart2js/static_type/data/null.dart
@@ -19,46 +19,46 @@
 
 null1(dynamic c) {
   /*dynamic*/ c.next;
-  /*dynamic*/ c /*invoke: bool*/ != null;
+  /*dynamic*/ c /*invoke: [dynamic]->bool*/ != null;
   /*dynamic*/ c.next;
 }
 
 null2(dynamic c) {
   /*dynamic*/ c.next;
-  /*dynamic*/ c /*invoke: bool*/ == null;
+  /*dynamic*/ c /*invoke: [dynamic]->bool*/ == null;
   /*dynamic*/ c.next;
 }
 
 null3(dynamic c) {
-  if (/*dynamic*/ c /*invoke: bool*/ == null) return;
+  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) return;
   /*dynamic*/ c.next;
 }
 
 null4(dynamic c) {
-  if (/*dynamic*/ c /*invoke: bool*/ != null) return;
+  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) return;
   /*Null*/ c.next;
 }
 
 null5(dynamic c) {
-  if (/*dynamic*/ c /*invoke: bool*/ != null) {
+  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
     /*dynamic*/ c.next;
   }
 }
 
 null6(dynamic c) {
-  if (/*dynamic*/ c /*invoke: bool*/ == null) {
+  if (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) {
     /*Null*/ c.next;
   }
 }
 
 null7(dynamic c) {
-  while (/*dynamic*/ c /*invoke: bool*/ != null) {
+  while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
     /*dynamic*/ c.next;
   }
 }
 
 null8(dynamic c) {
-  while (/*dynamic*/ c /*invoke: bool*/ == null) {
+  while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ == null) {
     /*Null*/ c.next;
   }
 }
diff --git a/tests/compiler/dart2js/static_type/data/null_access.dart b/tests/compiler/dart2js/static_type/data/null_access.dart
index de65e93..4c7735a 100644
--- a/tests/compiler/dart2js/static_type/data/null_access.dart
+++ b/tests/compiler/dart2js/static_type/data/null_access.dart
@@ -16,7 +16,7 @@
 
 test1() {
   const Class1 c = null;
-  return /*Null*/ c. /*invoke: void*/ method1();
+  return /*Null*/ c. /*invoke: [Null]->void*/ method1();
 }
 
 class Class2<T> {
@@ -28,7 +28,7 @@
 test2() {
   const Class2<int> c = null;
   // TODO(johnniwinther): Track the unreachable code properly.
-  return /*Null*/ c. /*invoke: <bottom>*/ method2();
+  return /*Null*/ c. /*invoke: [Null]-><bottom>*/ method2();
 }
 
 class Class3<T> {
@@ -40,5 +40,5 @@
 test3() {
   const Class3<int> c = null;
   // TODO(johnniwinther): Track the unreachable code properly.
-  return /*Null*/ c. /*invoke: Class3<<bottom>>*/ method3();
+  return /*Null*/ c. /*invoke: [Null]->Class3<<bottom>>*/ method3();
 }
diff --git a/tests/compiler/dart2js/static_type/data/while.dart b/tests/compiler/dart2js/static_type/data/while.dart
index e646074..b21dee0 100644
--- a/tests/compiler/dart2js/static_type/data/while.dart
+++ b/tests/compiler/dart2js/static_type/data/while.dart
@@ -16,15 +16,15 @@
   whileNext(null);
   whileNextGeneric(null);
   new Class1<int>()
-    .. /*invoke: dynamic*/ whileNext1()
-    .. /*invoke: dynamic*/ whileNext2()
-    .. /*invoke: dynamic*/ whileNext3();
+    .. /*invoke: [Class1<int>]->dynamic*/ whileNext1()
+    .. /*invoke: [Class1<int>]->dynamic*/ whileNext2()
+    .. /*invoke: [Class1<int>]->dynamic*/ whileNext3();
 }
 
 while1(dynamic c) {
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
-    while (/*dynamic*/ c /*invoke: bool*/ != null) {
+    while (/*dynamic*/ c /*invoke: [dynamic]->bool*/ != null) {
       /*dynamic*/ c.next;
       if (/*dynamic*/ c is Class) {
         /*Class*/ c.next;
@@ -38,7 +38,7 @@
 while2(dynamic c) {
   if (/*dynamic*/ c is Class) {
     /*Class*/ c.next;
-    while (/*Class*/ c /*invoke: bool*/ != null) {
+    while (/*Class*/ c /*invoke: [Class]->bool*/ != null) {
       /*Class*/ c.next;
     }
     /*Class*/ c.next;
@@ -46,14 +46,15 @@
 }
 
 whileNext(Class c) {
-  while (/*Class*/ c /*invoke: bool*/ != null) {
+  while (/*Class*/ c /*invoke: [Class]->bool*/ != null) {
     c = /*Class*/ c.next;
   }
   return /*Class*/ c;
 }
 
 whileNextGeneric(GenericClass<int> c) {
-  while (/*GenericClass<int>*/ c /*invoke: bool*/ != null) {
+  while (
+      /*GenericClass<int>*/ c /*invoke: [GenericClass<int>]->bool*/ != null) {
     c = /*GenericClass<int>*/ c.next;
   }
   return /*GenericClass<int>*/ c;
@@ -77,7 +78,7 @@
   whileNext2() {
     bool b;
     GenericClass<T> c;
-    while (/*GenericClass<T>*/ c /*invoke: bool*/ != null) {
+    while (/*GenericClass<T>*/ c /*invoke: [GenericClass<T>]->bool*/ != null) {
       if (/*bool*/ b) {
         GenericClass<T> next = /*GenericClass<T>*/ c.next;
         c = /*GenericClass<T>*/ next;
@@ -91,7 +92,7 @@
   whileNext3() {
     bool b;
     GenericClass<T> c;
-    while (/*GenericClass<T>*/ c /*invoke: bool*/ == null) {
+    while (/*GenericClass<T>*/ c /*invoke: [GenericClass<T>]->bool*/ == null) {
       if (/*bool*/ b) {
         GenericClass<T> next = /*Null*/ c.next;
         c = /*GenericClass<T>*/ next;
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
index 58ec517..369d14c 100644
--- a/tests/compiler/dart2js/static_type/static_type_test.dart
+++ b/tests/compiler/dart2js/static_type/static_type_test.dart
@@ -84,8 +84,11 @@
 
   @override
   String computeNodeValue(Id id, ir.TreeNode node) {
-    if (node is ir.VariableGet || node is ir.MethodInvocation) {
+    if (node is ir.VariableGet) {
       return typeToText(node.accept(staticTypeCache));
+    } else if (node is ir.MethodInvocation) {
+      return '[${typeToText(node.receiver.accept(staticTypeCache))}]->'
+          '${typeToText(node.accept(staticTypeCache))}';
     }
     return null;
   }