[dart2js] Migrate js_backend/annotations.dart

Change-Id: I98cb726cbbc82339ddeacf56d14a322236def864
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/245561
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index d1942e9..fe70a94 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.10
-
 library js_backend.backend.annotations;
 
 import 'package:kernel/ast.dart' as ir;
@@ -14,7 +12,7 @@
 import '../ir/util.dart';
 import '../kernel/dart2js_target.dart';
 import '../options.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/enumset.dart';
 
 class PragmaAnnotation {
@@ -213,7 +211,7 @@
   Map<PragmaAnnotation, EnumSet<PragmaAnnotation>> reportedExclusions = {};
   for (PragmaAnnotation annotation
       in annotations.iterable(PragmaAnnotation.values)) {
-    Set<PragmaAnnotation> implies = PragmaAnnotation.implies[annotation];
+    Set<PragmaAnnotation>? implies = PragmaAnnotation.implies[annotation];
     if (implies != null) {
       for (PragmaAnnotation other in implies) {
         if (annotations.contains(other)) {
@@ -225,7 +223,7 @@
         }
       }
     }
-    Set<PragmaAnnotation> excludes = PragmaAnnotation.excludes[annotation];
+    Set<PragmaAnnotation>? excludes = PragmaAnnotation.excludes[annotation];
     if (excludes != null) {
       for (PragmaAnnotation other in excludes) {
         if (annotations.contains(other) &&
@@ -239,7 +237,7 @@
         }
       }
     }
-    Set<PragmaAnnotation> requires = PragmaAnnotation.requires[annotation];
+    Set<PragmaAnnotation>? requires = PragmaAnnotation.requires[annotation];
     if (requires != null) {
       for (PragmaAnnotation other in requires) {
         if (!annotations.contains(other)) {
@@ -309,30 +307,30 @@
   /// What should the compiler do with parameter type assertions in [member].
   ///
   /// If [member] is `null`, the default policy is returned.
-  CheckPolicy getParameterCheckPolicy(MemberEntity member);
+  CheckPolicy getParameterCheckPolicy(MemberEntity? member);
 
   /// What should the compiler do with implicit downcasts in [member].
   ///
   /// If [member] is `null`, the default policy is returned.
-  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity member);
+  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity? member);
 
   /// What the compiler should do with a boolean value in a condition context
   /// in [member] when the language specification says it is a runtime error for
   /// it to be null.
   ///
   /// If [member] is `null`, the default policy is returned.
-  CheckPolicy getConditionCheckPolicy(MemberEntity member);
+  CheckPolicy getConditionCheckPolicy(MemberEntity? member);
 
   /// Whether should the compiler do with explicit casts in [member].
   ///
   /// If [member] is `null`, the default policy is returned.
-  CheckPolicy getExplicitCastCheckPolicy(MemberEntity member);
+  CheckPolicy getExplicitCastCheckPolicy(MemberEntity? member);
 
   /// What should the compiler do with index bounds checks `[]`, `[]=` and
   /// `removeLast()` operations in the body of [member].
   ///
   /// If [member] is `null`, the default policy is returned.
-  CheckPolicy getIndexBoundsCheckPolicy(MemberEntity member);
+  CheckPolicy getIndexBoundsCheckPolicy(MemberEntity? member);
 }
 
 class AnnotationsDataImpl implements AnnotationsData {
@@ -378,7 +376,7 @@
   }
 
   bool _hasPragma(MemberEntity member, PragmaAnnotation annotation) {
-    EnumSet<PragmaAnnotation> set = pragmaAnnotations[member];
+    EnumSet<PragmaAnnotation>? set = pragmaAnnotations[member];
     return set != null && set.contains(annotation);
   }
 
@@ -415,7 +413,7 @@
     pragmaAnnotations
         .forEach((MemberEntity member, EnumSet<PragmaAnnotation> set) {
       if (set.contains(PragmaAnnotation.noInline)) {
-        f(member);
+        f(member as FunctionEntity);
       }
     });
   }
@@ -425,7 +423,7 @@
     pragmaAnnotations
         .forEach((MemberEntity member, EnumSet<PragmaAnnotation> set) {
       if (set.contains(PragmaAnnotation.tryInline)) {
-        f(member);
+        f(member as FunctionEntity);
       }
     });
   }
@@ -435,7 +433,7 @@
     pragmaAnnotations
         .forEach((MemberEntity member, EnumSet<PragmaAnnotation> set) {
       if (set.contains(PragmaAnnotation.noThrows)) {
-        f(member);
+        f(member as FunctionEntity);
       }
     });
   }
@@ -445,15 +443,15 @@
     pragmaAnnotations
         .forEach((MemberEntity member, EnumSet<PragmaAnnotation> set) {
       if (set.contains(PragmaAnnotation.noSideEffects)) {
-        f(member);
+        f(member as FunctionEntity);
       }
     });
   }
 
   @override
-  CheckPolicy getParameterCheckPolicy(MemberEntity member) {
+  CheckPolicy getParameterCheckPolicy(MemberEntity? member) {
     if (member != null) {
-      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      EnumSet<PragmaAnnotation>? annotations = pragmaAnnotations[member];
       if (annotations != null) {
         if (annotations.contains(PragmaAnnotation.typesTrust)) {
           return CheckPolicy.trusted;
@@ -470,9 +468,9 @@
   }
 
   @override
-  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity member) {
+  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity? member) {
     if (member != null) {
-      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      EnumSet<PragmaAnnotation>? annotations = pragmaAnnotations[member];
       if (annotations != null) {
         if (annotations.contains(PragmaAnnotation.typesTrust)) {
           return CheckPolicy.trusted;
@@ -489,9 +487,9 @@
   }
 
   @override
-  CheckPolicy getConditionCheckPolicy(MemberEntity member) {
+  CheckPolicy getConditionCheckPolicy(MemberEntity? member) {
     if (member != null) {
-      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      EnumSet<PragmaAnnotation>? annotations = pragmaAnnotations[member];
       if (annotations != null) {
         if (annotations.contains(PragmaAnnotation.typesTrust)) {
           return CheckPolicy.trusted;
@@ -508,9 +506,9 @@
   }
 
   @override
-  CheckPolicy getExplicitCastCheckPolicy(MemberEntity member) {
+  CheckPolicy getExplicitCastCheckPolicy(MemberEntity? member) {
     if (member != null) {
-      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      EnumSet<PragmaAnnotation>? annotations = pragmaAnnotations[member];
       if (annotations != null) {
         if (annotations.contains(PragmaAnnotation.asTrust)) {
           return CheckPolicy.trusted;
@@ -523,9 +521,9 @@
   }
 
   @override
-  CheckPolicy getIndexBoundsCheckPolicy(MemberEntity member) {
+  CheckPolicy getIndexBoundsCheckPolicy(MemberEntity? member) {
     if (member != null) {
-      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      EnumSet<PragmaAnnotation>? annotations = pragmaAnnotations[member];
       if (annotations != null) {
         if (annotations.contains(PragmaAnnotation.indexBoundsTrust)) {
           return CheckPolicy.trusted;
diff --git a/pkg/compiler/lib/src/serialization/serialization_interfaces.dart b/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
index ccb047e..5fac8e9 100644
--- a/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
+++ b/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
@@ -61,6 +61,10 @@
   void writeTypeVariable(
       covariant TypeVariableEntity value); // IndexedTypeVariable
 
+  void writeMemberMap<V>(
+      Map<MemberEntity, V>? map, void f(MemberEntity member, V value),
+      {bool allowNull = false});
+
   void writeLibrary(covariant LibraryEntity value); // IndexedLibrary
   void writeLibraryOrNull(covariant LibraryEntity? value); // IndexedLibrary
 
@@ -101,6 +105,10 @@
   ClassEntity? readClassOrNull(); // IndexedClass
   TypeVariableEntity readTypeVariable(); // IndexedTypeVariable
 
+  Map<K, V> readMemberMap<K extends MemberEntity, V>(V f(MemberEntity member));
+  Map<K, V>? readMemberMapOrNull<K extends MemberEntity, V>(
+      V f(MemberEntity member));
+
   LibraryEntity readLibrary(); // IndexedLibrary;
   LibraryEntity? readLibraryOrNull(); // IndexedLibrary;
 
diff --git a/pkg/compiler/lib/src/serialization/sink.dart b/pkg/compiler/lib/src/serialization/sink.dart
index 8c5e1ba..cc836b4 100644
--- a/pkg/compiler/lib/src/serialization/sink.dart
+++ b/pkg/compiler/lib/src/serialization/sink.dart
@@ -810,6 +810,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSourceReader.readMemberMap].
+  @override
   void writeMemberMap<V>(
       Map<MemberEntity, V> map, void f(MemberEntity member, V value),
       {bool allowNull = false}) {
diff --git a/pkg/compiler/lib/src/serialization/source.dart b/pkg/compiler/lib/src/serialization/source.dart
index b09e780..a0e4284 100644
--- a/pkg/compiler/lib/src/serialization/source.dart
+++ b/pkg/compiler/lib/src/serialization/source.dart
@@ -975,15 +975,26 @@
   }
 
   /// Reads a map from indexed members to [V] values from this data source,
-  /// calling [f] to read each value from the data source. If [emptyAsNull] is
-  /// `true`, `null` is returned instead of an empty map.
+  /// calling [f] to read each value from the data source.
   ///
   /// This is a convenience method to be used together with
   /// [DataSinkWriter.writeMemberMap].
-  Map<K, V> readMemberMap<K extends MemberEntity, V>(V f(MemberEntity member),
-      {bool emptyAsNull = false}) {
+  @override
+  Map<K, V> readMemberMap<K extends MemberEntity, V>(V f(MemberEntity member)) {
+    return readMemberMapOrNull<K, V>(f) ?? {};
+  }
+
+  /// Reads a map from indexed members to [V] values from this data source,
+  /// calling [f] to read each value from the data source.
+  /// `null` is returned instead of an empty map.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSinkWriter.writeMemberMap].
+  @override
+  Map<K, V> readMemberMapOrNull<K extends MemberEntity, V>(
+      V f(MemberEntity member)) {
     int count = readInt();
-    if (count == 0 && emptyAsNull) return null;
+    if (count == 0) return null;
     Map<K, V> map = {};
     for (int i = 0; i < count; i++) {
       MemberEntity member = readMember();