Version 2.18.0-55.0.dev

Merge commit 'b341480a72cd03e832f499a525ad2e3a03d75735' into 'dev'
diff --git a/benchmarks/TypeLiteral/dart/TypeLiteral.dart b/benchmarks/TypeLiteral/dart/TypeLiteral.dart
new file mode 100644
index 0000000..fb9f567
--- /dev/null
+++ b/benchmarks/TypeLiteral/dart/TypeLiteral.dart
@@ -0,0 +1,197 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const int iterations = 100000;
+
+void main() {
+  SyncCallBenchmark('TypeLiteral.GenericFunction.T.dynamic', () {
+    for (int i = 0; i < iterations; ++i) {
+      getT<dynamic>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.T.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      getT<int>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.T.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      getT<int?>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.ListOfT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      getListOfT<int>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.ListOfT.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      getListOfT<int?>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.NullableT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      getNullableT<int>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.NullableT.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      getNullableT<int?>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.ListOfNullableT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      getListOfT<int>();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericFunction.ListOfNullableT.nullableInt',
+      () {
+    for (int i = 0; i < iterations; ++i) {
+      getListOfNullableT<int?>();
+    }
+    return iterations;
+  }).report();
+  final foos = <Foo<Object?>>[
+    Foo<int>(),
+    Foo<int?>(),
+    Foo<dynamic>(),
+  ];
+  final Foo fooInt = foos[int.parse('0')];
+  final Foo fooNullableInt = foos[int.parse('1')];
+  final Foo fooDynamic = foos[int.parse('2')];
+  SyncCallBenchmark('TypeLiteral.GenericClass.T.dynamic', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooDynamic.getT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.T.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooInt.getT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.T.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooNullableInt.getT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.ListOfT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooInt.getListOfT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.ListOfT.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooNullableInt.getListOfT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.NullableT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooInt.getNullableT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.NullableT.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooNullableInt.getNullableT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.ListOfNullableT.int', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooInt.getListOfT();
+    }
+    return iterations;
+  }).report();
+  SyncCallBenchmark('TypeLiteral.GenericClass.ListOfNullableT.nullableInt', () {
+    for (int i = 0; i < iterations; ++i) {
+      fooNullableInt.getListOfNullableT();
+    }
+    return iterations;
+  }).report();
+}
+
+@pragma('vm:never-inline')
+@pragma('dart2js:noInline')
+Type getT<T>() => T;
+
+@pragma('vm:never-inline')
+@pragma('dart2js:noInline')
+Type getNullableT<T>() => MakeNullable<T?>;
+
+@pragma('vm:never-inline')
+@pragma('dart2js:noInline')
+Type getListOfT<T>() => List<T>;
+
+@pragma('vm:never-inline')
+@pragma('dart2js:noInline')
+Type getListOfNullableT<T>() => List<T?>;
+
+class Foo<T> {
+  @pragma('vm:never-inline')
+  @pragma('dart2js:noInline')
+  Type getT() => T;
+
+  @pragma('vm:never-inline')
+  @pragma('dart2js:noInline')
+  Type getNullableT() => MakeNullable<T?>;
+
+  @pragma('vm:never-inline')
+  @pragma('dart2js:noInline')
+  Type getListOfT() => List<T>;
+
+  @pragma('vm:never-inline')
+  @pragma('dart2js:noInline')
+  Type getListOfNullableT() => List<T?>;
+}
+
+typedef MakeNullable<X> = X?;
+
+// Same as from [Calls] benchmark.
+class SyncCallBenchmark {
+  final String name;
+  final int Function() performCalls;
+
+  SyncCallBenchmark(this.name, this.performCalls);
+
+  // Returns the number of nanoseconds per call.
+  double measureFor(Duration duration) {
+    final sw = Stopwatch()..start();
+    final durationInMicroseconds = duration.inMicroseconds;
+
+    int numberOfCalls = 0;
+    int totalMicroseconds = 0;
+    do {
+      numberOfCalls += performCalls();
+      totalMicroseconds = sw.elapsedMicroseconds;
+    } while (totalMicroseconds < durationInMicroseconds);
+
+    final int totalNanoseconds = sw.elapsed.inMicroseconds * 1000;
+    return totalNanoseconds / numberOfCalls;
+  }
+
+  // Runs warmup phase, runs benchmark and reports result.
+  void report() {
+    // Warmup for 100 ms.
+    measureFor(const Duration(milliseconds: 100));
+
+    // Run benchmark for 2 seconds.
+    final double nsPerCall = measureFor(const Duration(seconds: 2));
+
+    // Report result.
+    print('$name(RunTimeRaw): $nsPerCall ns.');
+  }
+}
diff --git a/tools/VERSION b/tools/VERSION
index b34c352..342e544 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 54
+PRERELEASE 55
 PRERELEASE_PATCH 0
\ No newline at end of file