Version 2.18.0-53.0.dev

Merge commit 'dfd5109b64e58db0d8713411356e45af07403073' into 'dev'
diff --git a/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart b/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
index 81cc3a1..572c050 100644
--- a/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
+++ b/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
@@ -15,6 +15,20 @@
 
 // @dart = 2.7
 
+/*class: A:class=[{
+  "id": "class/memory:sdk/tests/web/native/lib2.dart::A",
+  "kind": "class",
+  "name": "A",
+  "size": 68,
+  "outputUnit": "outputUnit/1",
+  "parent": "library/memory:sdk/tests/web/native/lib2.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "function/memory:sdk/tests/web/native/lib2.dart::A.method"
+  ]
+}]*/
 class A {
   const A();
 
diff --git a/pkg/compiler/test/dump_info/data/js_members.dart b/pkg/compiler/test/dump_info/data/js_members.dart
index db9ca6b..6f18324 100644
--- a/pkg/compiler/test/dump_info/data/js_members.dart
+++ b/pkg/compiler/test/dump_info/data/js_members.dart
@@ -20,6 +20,22 @@
 external void eval(String code);
 
 @JS()
+/*class: Foo:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Foo",
+  "kind": "class",
+  "name": "Foo",
+  "size": 54,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::Foo.mixedPositionalArgs",
+    "function/memory:sdk/tests/web/native/main.dart::Foo.singleArg",
+    "function/memory:sdk/tests/web/native/main.dart::Foo.singlePositionalArg"
+  ]
+}]*/
 class Foo {
   external factory Foo();
   /*member: Foo.singleArg:function=[{
@@ -117,6 +133,18 @@
 }
 
 @JS()
+/*class: Bar:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Bar",
+  "kind": "class",
+  "name": "Bar",
+  "size": 54,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": []
+}]*/
 class Bar {
   external static singleArg(a);
   external static singlePositionalArg([dynamic? a]);
diff --git a/pkg/compiler/test/dump_info/data/members.dart b/pkg/compiler/test/dump_info/data/members.dart
index 8538881..6494321 100644
--- a/pkg/compiler/test/dump_info/data/members.dart
+++ b/pkg/compiler/test/dump_info/data/members.dart
@@ -13,6 +13,25 @@
   ],
   "canonicalUri": "memory:sdk/tests/web/native/main.dart"
 }]*/
+/*class: C:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::C",
+  "kind": "class",
+  "name": "C",
+  "size": 46,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "field/memory:sdk/tests/web/native/main.dart::C.counter",
+    "field/memory:sdk/tests/web/native/main.dart::C.value",
+    "field/memory:sdk/tests/web/native/main.dart::C.y",
+    "function/memory:sdk/tests/web/native/main.dart::C.C._default",
+    "function/memory:sdk/tests/web/native/main.dart::C.C.create",
+    "function/memory:sdk/tests/web/native/main.dart::C.compute"
+  ]
+}]*/
 class C {
   /*member: C.value:
    function=[{
@@ -186,6 +205,31 @@
 }]*/
 void F() {}
 
+/*class: A:
+ class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::A",
+  "kind": "class",
+  "name": "A",
+  "size": 46,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "field/memory:sdk/tests/web/native/main.dart::A.a",
+    "function/memory:sdk/tests/web/native/main.dart::A.A"
+  ]
+}],
+ classType=[{
+  "id": "classType/memory:sdk/tests/web/native/main.dart::A",
+  "kind": "classType",
+  "name": "A",
+  "size": 0,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::"
+}]
+*/
 class A {
   /*member: A.a:function=[{
   "id": "field/memory:sdk/tests/web/native/main.dart::A.a",
diff --git a/pkg/compiler/test/dump_info/dump_info_test.dart b/pkg/compiler/test/dump_info/dump_info_test.dart
index b27abdf..411f65f 100644
--- a/pkg/compiler/test/dump_info/dump_info_test.dart
+++ b/pkg/compiler/test/dump_info/dump_info_test.dart
@@ -21,7 +21,7 @@
 
 main(List<String> args) {
   asyncTest(() async {
-    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
     print('Testing output of dump-info');
     print('==================================================================');
     await checkTests(dataDir, const DumpInfoDataComputer(),
@@ -59,7 +59,7 @@
         isBackwardCompatible: true, filterTreeshaken: false);
     DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
 
-    Features features = new Features();
+    final features = Features();
     final libraryInfo = dumpInfoState.entityToInfo[library];
     if (libraryInfo == null) return;
 
@@ -67,8 +67,42 @@
         Tags.library, indentedEncoder.convert(libraryInfo.accept(converter)));
 
     final id = LibraryId(library.canonicalUri);
-    actualMap[id] = new ActualData<Features>(
-        id, features, library.canonicalUri, -1, library);
+    actualMap[id] =
+        ActualData<Features>(id, features, library.canonicalUri, -1, library);
+  }
+
+  @override
+  void computeClassData(Compiler compiler, ClassEntity cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose: false}) {
+    final converter = info.AllInfoToJsonConverter(
+        isBackwardCompatible: true, filterTreeshaken: false);
+    DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
+
+    final features = Features();
+    final classInfo = dumpInfoState.entityToInfo[cls];
+    if (classInfo == null) return;
+
+    features.addElement(
+        Tags.clazz, indentedEncoder.convert(classInfo.accept(converter)));
+    final classTypeInfos =
+        dumpInfoState.info.classTypes.where((i) => i.name == classInfo.name);
+    assert(
+        classTypeInfos.length < 2,
+        'Ambiguous class type info resolution. '
+        'Expected 0 or 1 elements, found: $classTypeInfos');
+    if (classTypeInfos.length == 1) {
+      features.addElement(Tags.classType,
+          indentedEncoder.convert(classTypeInfos.first.accept(converter)));
+    }
+
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    ir.Class node = elementMap.getClassDefinition(cls).node;
+    ClassId id = ClassId(node.name);
+    ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
+    actualMap[id] = ActualData<Features>(id, features,
+        nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, cls);
   }
 
   @override
@@ -79,7 +113,7 @@
         isBackwardCompatible: true, filterTreeshaken: false);
     DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
 
-    Features features = new Features();
+    final features = Features();
     final functionInfo = dumpInfoState.entityToInfo[member];
     if (functionInfo == null) return;
 
@@ -106,7 +140,7 @@
     ir.Member node = elementMap.getMemberDefinition(member).node;
     Id id = computeMemberId(node);
     ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
-    actualMap[id] = new ActualData<Features>(id, features,
+    actualMap[id] = ActualData<Features>(id, features,
         nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
   }
 
@@ -134,7 +168,7 @@
     } else {
       List<String> errorsFound = [];
       Features expectedFeatures = Features.fromText(expectedData);
-      Set<String> validatedFeatures = new Set<String>();
+      Set<String> validatedFeatures = Set<String>();
       expectedFeatures.forEach((String key, Object expectedValue) {
         validatedFeatures.add(key);
         Object actualValue = actualFeatures[key];
diff --git a/tools/VERSION b/tools/VERSION
index 54c3858..7521b97 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 52
+PRERELEASE 53
 PRERELEASE_PATCH 0
\ No newline at end of file