[cfe] Add shown and hidden elements to Extension Kernel node

TEST=existing

Change-Id: I8271cb7f4731dea289c855b0c5384f8e181530c9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212761
Commit-Queue: Chloe Stefantsova <dmitryas@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index e8ab694..e2be4ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -335,6 +335,7 @@
       computeCoreTypes();
       loader.buildClassHierarchy(myClasses, objectClassBuilder);
       loader.computeHierarchy();
+      loader.computeShowHideElements();
       loader.installTypedefTearOffs();
       loader.performTopLevelInference(myClasses);
       loader.checkSupertypes(myClasses);
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 1666eb8..e7f8197 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -909,16 +909,32 @@
       ValueKinds.MetadataListOrNull
     ]));
     debugEvent("endExtensionDeclaration");
-    pop() as List<TypeBuilder>?; // Type elements of the 'hide' clause.
-    pop() as List<String>?; // Getter elements of the 'hide' clause.
-    pop() as List<String>?; // Member or type elements of the 'hide' clause.
-    pop() as List<String>?; // Setter elements of the 'hide' clause.
-    pop() as List<Operator>?; // Operator elements of the 'hide' clause.
-    pop() as List<TypeBuilder>?; // Type elements of the 'show' clause.
-    pop() as List<String>?; // Getter elements of the 'show' clause.
-    pop() as List<String>?; // Member or type elements of the 'show' clause.
-    pop() as List<String>?; // Setter elements of the 'show' clause.
-    pop() as List<Operator>?; // Operator elements of the 'show' clause.
+
+    List<TypeBuilder>? hiddenSupertypes = pop() as List<TypeBuilder>?;
+    List<String>? hiddenGetters = pop() as List<String>?;
+    List<String>? hiddenMembersOrTypes = pop() as List<String>?;
+    List<String>? hiddenSetters = pop() as List<String>?;
+    List<Operator>? hiddenOperators = pop() as List<Operator>?;
+
+    List<TypeBuilder>? shownSupertypes = pop() as List<TypeBuilder>?;
+    List<String>? shownGetters = pop() as List<String>?;
+    List<String>? shownMembersOrTypes = pop() as List<String>?;
+    List<String>? shownSetters = pop() as List<String>?;
+    List<Operator>? shownOperators = pop() as List<Operator>?;
+
+    ExtensionTypeShowHideClauseBuilder extensionTypeShowHideClauseBuilder =
+        new ExtensionTypeShowHideClauseBuilder(
+            shownSupertypes: shownSupertypes ?? const <TypeBuilder>[],
+            shownGetters: shownGetters ?? const <String>[],
+            shownSetters: shownSetters ?? const <String>[],
+            shownMembersOrTypes: shownMembersOrTypes ?? const <String>[],
+            shownOperators: shownOperators ?? const <Operator>[],
+            hiddenSupertypes: hiddenSupertypes ?? const <TypeBuilder>[],
+            hiddenGetters: hiddenGetters ?? const <String>[],
+            hiddenSetters: hiddenSetters ?? const <String>[],
+            hiddenMembersOrTypes: hiddenMembersOrTypes ?? const <String>[],
+            hiddenOperators: hiddenOperators ?? const <Operator>[]);
+
     if (showKeyword != null && !libraryBuilder.enableExtensionTypesInLibrary) {
       addProblem(
           templateExperimentNotEnabled.withArguments('extension-types',
@@ -962,6 +978,7 @@
         name,
         typeVariables,
         onType as TypeBuilder,
+        extensionTypeShowHideClauseBuilder,
         isExtensionTypeDeclaration,
         startOffset,
         nameOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 180e20c..763ce00 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -28,6 +28,8 @@
 
 import '../kernel/kernel_helper.dart';
 
+import '../operator.dart';
+
 import '../problems.dart';
 
 import '../scope.dart';
@@ -50,12 +52,15 @@
   @override
   final TypeBuilder onType;
 
+  final ExtensionTypeShowHideClauseBuilder extensionTypeShowHideClauseBuilder;
+
   SourceExtensionBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
       String name,
       this.typeParameters,
       this.onType,
+      this.extensionTypeShowHideClauseBuilder,
       Scope scope,
       SourceLibraryBuilder parent,
       bool isExtensionTypeDeclaration,
@@ -94,6 +99,8 @@
       SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary,
       {required bool addMembersToLibrary}) {
     _extension.onType = onType.build(libraryBuilder);
+    extensionTypeShowHideClauseBuilder.buildAndStoreTypes(
+        _extension, libraryBuilder);
 
     SourceLibraryBuilder.checkMemberConflicts(library, scope,
         checkForInstanceVsStaticConflict: true,
@@ -296,3 +303,45 @@
     scope.forEach(build);
   }
 }
+
+class ExtensionTypeShowHideClauseBuilder {
+  final List<TypeBuilder> shownSupertypes;
+  final List<String> shownGetters;
+  final List<String> shownSetters;
+  final List<String> shownMembersOrTypes;
+  final List<Operator> shownOperators;
+
+  final List<TypeBuilder> hiddenSupertypes;
+  final List<String> hiddenGetters;
+  final List<String> hiddenSetters;
+  final List<String> hiddenMembersOrTypes;
+  final List<Operator> hiddenOperators;
+
+  ExtensionTypeShowHideClauseBuilder(
+      {required this.shownSupertypes,
+      required this.shownGetters,
+      required this.shownSetters,
+      required this.shownMembersOrTypes,
+      required this.shownOperators,
+      required this.hiddenSupertypes,
+      required this.hiddenGetters,
+      required this.hiddenSetters,
+      required this.hiddenMembersOrTypes,
+      required this.hiddenOperators});
+
+  void buildAndStoreTypes(Extension extension, LibraryBuilder libraryBuilder) {
+    List<Supertype> builtShownSupertypes = shownSupertypes
+        .map(
+            (t) => t.buildSupertype(libraryBuilder, t.charOffset!, t.fileUri!)!)
+        .toList();
+    List<Supertype> builtHiddenSupertypes = hiddenSupertypes
+        .map(
+            (t) => t.buildSupertype(libraryBuilder, t.charOffset!, t.fileUri!)!)
+        .toList();
+    ExtensionTypeShowHideClause showHideClause =
+        extension.showHideClause ?? new ExtensionTypeShowHideClause();
+    showHideClause.shownSupertypes.addAll(builtShownSupertypes);
+    showHideClause.hiddenSupertypes.addAll(builtHiddenSupertypes);
+    extension.showHideClause ??= showHideClause;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 76d8d26..ddbe0bb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -81,6 +81,8 @@
 
 import '../import.dart' show Import;
 
+import '../kernel/class_hierarchy_builder.dart';
+
 import '../kernel/internal_ast.dart';
 
 import '../kernel/kernel_builder.dart'
@@ -116,6 +118,8 @@
 
 import '../names.dart' show indexSetName;
 
+import '../operator.dart';
+
 import '../problems.dart' show unexpected, unhandled;
 
 import '../scope.dart';
@@ -124,7 +128,7 @@
 
 import 'name_scheme.dart';
 import 'source_class_builder.dart' show SourceClassBuilder;
-import 'source_extension_builder.dart' show SourceExtensionBuilder;
+import 'source_extension_builder.dart';
 import 'source_loader.dart' show SourceLoader;
 import 'source_type_alias_builder.dart';
 
@@ -892,7 +896,7 @@
       // name is unique. Only the first of duplicate extensions is accessible
       // by name or by resolution and the remaining are dropped for the output.
       currentTypeParameterScopeBuilder.extensions!
-          .add(declaration as ExtensionBuilder);
+          .add(declaration as SourceExtensionBuilder);
     }
     if (declaration is PrefixBuilder) {
       _prefixBuilders ??= <PrefixBuilder>[];
@@ -1845,6 +1849,7 @@
       String extensionName,
       List<TypeVariableBuilder>? typeVariables,
       TypeBuilder type,
+      ExtensionTypeShowHideClauseBuilder extensionTypeShowHideClauseBuilder,
       bool isExtensionTypeDeclaration,
       int startOffset,
       int nameOffset,
@@ -1877,6 +1882,7 @@
         extensionName,
         typeVariables,
         type,
+        extensionTypeShowHideClauseBuilder,
         classScope,
         this,
         isExtensionTypeDeclaration,
@@ -4154,6 +4160,213 @@
     checkUncheckedTypedefTypes(typeEnvironment);
   }
 
+  void computeShowHideElements(ClassHierarchyBuilder hierarchy) {
+    assert(currentTypeParameterScopeBuilder.kind ==
+        TypeParameterScopeKind.library);
+    for (SourceExtensionBuilder extensionBuilder
+        in currentTypeParameterScopeBuilder.extensions!) {
+      DartType onType = extensionBuilder.extension.onType;
+      if (onType is InterfaceType) {
+        ExtensionTypeShowHideClause showHideClause =
+            extensionBuilder.extension.showHideClause ??
+                new ExtensionTypeShowHideClause();
+
+        // TODO(dmitryas): Handle private names.
+        List<Supertype> supertypes =
+            hierarchy.getNodeFromClass(onType.classNode).superclasses;
+        Map<String, Supertype> supertypesByName = <String, Supertype>{};
+        for (Supertype supertype in supertypes) {
+          // TODO(dmitryas): Should only non-generic supertypes be allowed?
+          supertypesByName[supertype.classNode.name] = supertype;
+        }
+
+        // Handling elements of the 'show' clause.
+        for (String memberOrTypeName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.shownMembersOrTypes) {
+          Member? getableMember = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(memberOrTypeName));
+          if (getableMember != null) {
+            if (getableMember is Field) {
+              showHideClause.shownGetters.add(getableMember.getterReference);
+            } else if (getableMember.hasGetter) {
+              showHideClause.shownGetters.add(getableMember.reference);
+            }
+          }
+          if (getableMember is Procedure &&
+              getableMember.kind == ProcedureKind.Method) {
+            showHideClause.shownMethods.add(getableMember.reference);
+          }
+          Member? setableMember = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(memberOrTypeName),
+              setter: true);
+          if (setableMember != null) {
+            if (setableMember is Field) {
+              if (setableMember.setterReference != null) {
+                showHideClause.shownSetters.add(setableMember.setterReference!);
+              } else {
+                // TODO(dmitryas): Report an error.
+              }
+            } else if (setableMember.hasSetter) {
+              showHideClause.shownSetters.add(setableMember.reference);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          }
+          if (getableMember == null && setableMember == null) {
+            if (supertypesByName.containsKey(memberOrTypeName)) {
+              showHideClause.shownSupertypes
+                  .add(supertypesByName[memberOrTypeName]!);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          }
+        }
+        for (String getterName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.shownGetters) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(getterName));
+          if (member != null) {
+            if (member is Field) {
+              showHideClause.shownGetters.add(member.getterReference);
+            } else if (member.hasGetter) {
+              showHideClause.shownGetters.add(member.reference);
+            } else {
+              // TODO(dmitryas): Handle the erroneous case.
+            }
+          } else {
+            // TODO(dmitryas): Handle the erroneous case.
+          }
+        }
+        for (String setterName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.shownSetters) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(setterName),
+              setter: true);
+          if (member != null) {
+            if (member is Field) {
+              if (member.setterReference != null) {
+                showHideClause.shownSetters.add(member.setterReference!);
+              } else {
+                // TODO(dmitryas): Report an error.
+              }
+            } else if (member.hasSetter) {
+              showHideClause.shownSetters.add(member.reference);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          } else {
+            // TODO(dmitryas): Search for a non-setter and report an error.
+          }
+        }
+        for (Operator operator in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.shownOperators) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(operatorToString(operator)));
+          if (member != null) {
+            showHideClause.shownOperators.add(member.reference);
+          } else {
+            // TODO(dmitryas): Handle the erroneous case.
+          }
+        }
+
+        // TODO(dmitryas): Add a helper function to share logic between
+        // handling the 'show' and 'hide' parts.
+
+        // Handling elements of the 'hide' clause.
+        for (String memberOrTypeName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.hiddenMembersOrTypes) {
+          Member? getableMember = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(memberOrTypeName));
+          if (getableMember != null) {
+            if (getableMember is Field) {
+              showHideClause.hiddenGetters.add(getableMember.getterReference);
+            } else if (getableMember.hasGetter) {
+              showHideClause.hiddenGetters.add(getableMember.reference);
+            }
+          }
+          if (getableMember is Procedure &&
+              getableMember.kind == ProcedureKind.Method) {
+            showHideClause.hiddenMethods.add(getableMember.reference);
+          }
+          Member? setableMember = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(memberOrTypeName),
+              setter: true);
+          if (setableMember != null) {
+            if (setableMember is Field) {
+              if (setableMember.setterReference != null) {
+                showHideClause.hiddenSetters
+                    .add(setableMember.setterReference!);
+              } else {
+                // TODO(dmitryas): Report an error.
+              }
+            } else if (setableMember.hasSetter) {
+              showHideClause.hiddenSetters.add(setableMember.reference);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          }
+          if (getableMember == null && setableMember == null) {
+            if (supertypesByName.containsKey(memberOrTypeName)) {
+              showHideClause.hiddenSupertypes
+                  .add(supertypesByName[memberOrTypeName]!);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          }
+        }
+        for (String getterName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.hiddenGetters) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(getterName));
+          if (member != null) {
+            if (member is Field) {
+              showHideClause.hiddenGetters.add(member.getterReference);
+            } else if (member.hasGetter) {
+              showHideClause.hiddenGetters.add(member.reference);
+            } else {
+              // TODO(dmitryas): Handle the erroneous case.
+            }
+          } else {
+            // TODO(dmitryas): Handle the erroneous case.
+          }
+        }
+        for (String setterName in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.hiddenSetters) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(setterName),
+              setter: true);
+          if (member != null) {
+            if (member is Field) {
+              if (member.setterReference != null) {
+                showHideClause.hiddenSetters.add(member.setterReference!);
+              } else {
+                // TODO(dmitryas): Report an error.
+              }
+            } else if (member.hasSetter) {
+              showHideClause.hiddenSetters.add(member.reference);
+            } else {
+              // TODO(dmitryas): Report an error.
+            }
+          } else {
+            // TODO(dmitryas): Search for a non-setter and report an error.
+          }
+        }
+        for (Operator operator in extensionBuilder
+            .extensionTypeShowHideClauseBuilder.hiddenOperators) {
+          Member? member = hierarchy.getInterfaceMember(
+              onType.classNode, new Name(operatorToString(operator)));
+          if (member != null) {
+            showHideClause.hiddenOperators.add(member.reference);
+          } else {
+            // TODO(dmitryas): Handle the erroneous case.
+          }
+        }
+
+        extensionBuilder.extension.showHideClause ??= showHideClause;
+      }
+    }
+  }
+
   void registerImplicitlyTypedField(FieldBuilder fieldBuilder) {
     (_implicitlyTypedFields ??= <FieldBuilder>[]).add(fieldBuilder);
   }
@@ -4279,7 +4492,7 @@
 
   final Map<String, MemberBuilder>? setters;
 
-  final Set<ExtensionBuilder>? extensions;
+  final Set<SourceExtensionBuilder>? extensions;
 
   final List<UnresolvedType> types = <UnresolvedType>[];
 
@@ -4320,7 +4533,7 @@
             <String, Builder>{},
             <String, MemberBuilder>{},
             null, // No support for constructors in library scopes.
-            <ExtensionBuilder>{},
+            <SourceExtensionBuilder>{},
             "<library>",
             -1,
             null);
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 35bf322..fc624e3 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1098,6 +1098,16 @@
     ticker.logMs("Computed class hierarchy");
   }
 
+  void computeShowHideElements() {
+    for (LibraryBuilder libraryBuilder in builders.values) {
+      if (libraryBuilder.loader == this &&
+          libraryBuilder is SourceLibraryBuilder) {
+        libraryBuilder.computeShowHideElements(_builderHierarchy!);
+      }
+    }
+    ticker.logMs("Computed show and hide elements");
+  }
+
   void handleAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {
     addProblem(
         templateAmbiguousSupertypes.withArguments(cls.name, a.asInterfaceType,
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index fe6e872..1197e88 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -501,6 +501,7 @@
 gen
 generation
 getable
+getable
 getables
 gets
 getter1a
@@ -959,6 +960,7 @@
 quick
 quiver
 quoted
+qux
 r
 r'$creation
 r'\f
@@ -1110,6 +1112,7 @@
 service
 session
 setable
+setable
 setables
 setaf
 sh
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.strong.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.expect
index 2777045..35387e0 100644
--- a/pkg/front_end/testcases/extension_types/basic_show.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.expect
@@ -30,15 +30,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
 extension E2 on core::int {
 }
 extension E3 on core::int {
 }
-extension E4 on core::int {
+extension E4 on core::int show-types core::num {
 }
-extension E5 on core::int {
+extension E5 on core::int show-types core::num {
 }
 extension E6 on core::int {
 }
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.transformed.expect
index 2777045..35387e0 100644
--- a/pkg/front_end/testcases/extension_types/basic_show.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.transformed.expect
@@ -30,15 +30,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
 extension E2 on core::int {
 }
 extension E3 on core::int {
 }
-extension E4 on core::int {
+extension E4 on core::int show-types core::num {
 }
-extension E5 on core::int {
+extension E5 on core::int show-types core::num {
 }
 extension E6 on core::int {
 }
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.expect
index 2777045..35387e0 100644
--- a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.expect
@@ -30,15 +30,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
 extension E2 on core::int {
 }
 extension E3 on core::int {
 }
-extension E4 on core::int {
+extension E4 on core::int show-types core::num {
 }
-extension E5 on core::int {
+extension E5 on core::int show-types core::num {
 }
 extension E6 on core::int {
 }
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.outline.expect
index cabf277..c6612b3 100644
--- a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.outline.expect
@@ -30,15 +30,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
 extension E2 on core::int {
 }
 extension E3 on core::int {
 }
-extension E4 on core::int {
+extension E4 on core::int show-types core::num {
 }
-extension E5 on core::int {
+extension E5 on core::int show-types core::num {
 }
 extension E6 on core::int {
 }
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.transformed.expect
index 2777045..35387e0 100644
--- a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.transformed.expect
@@ -30,15 +30,15 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
 extension E2 on core::int {
 }
 extension E3 on core::int {
 }
-extension E4 on core::int {
+extension E4 on core::int show-types core::num {
 }
-extension E5 on core::int {
+extension E5 on core::int show-types core::num {
 }
 extension E6 on core::int {
 }
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.expect
index 02b44ca..6111f5a 100644
--- a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.expect
@@ -9,8 +9,8 @@
   method mixin() → void {}
   method as() → void {}
 }
-extension type E1 on self::A {
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
 }
-extension type E2 on self::A {
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.transformed.expect
index 02b44ca..6111f5a 100644
--- a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.transformed.expect
@@ -9,8 +9,8 @@
   method mixin() → void {}
   method as() → void {}
 }
-extension type E1 on self::A {
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
 }
-extension type E2 on self::A {
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.expect
index 02b44ca..6111f5a 100644
--- a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.expect
@@ -9,8 +9,8 @@
   method mixin() → void {}
   method as() → void {}
 }
-extension type E1 on self::A {
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
 }
-extension type E2 on self::A {
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.outline.expect
index 4149c70..a2e4d10 100644
--- a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.outline.expect
@@ -10,9 +10,9 @@
   method as() → void
     ;
 }
-extension type E1 on self::A {
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
 }
-extension type E2 on self::A {
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.transformed.expect
index 02b44ca..6111f5a 100644
--- a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.transformed.expect
@@ -9,8 +9,8 @@
   method mixin() → void {}
   method as() → void {}
 }
-extension type E1 on self::A {
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
 }
-extension type E2 on self::A {
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart
new file mode 100644
index 0000000..d26636c
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, 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.
+
+class A<X> {}
+class B<X> extends A<X> {}
+class C extends B<int> {}
+
+extension type E on C show B<int> hide A<int> {}
+
+class A2 {}
+class B2 extends A2 {}
+class C2 extends B2 {}
+
+extension type E2 on C2 show B2 hide A2 {}
+
+class A3 {
+  void foo() {}
+  int? field;
+  String? field2;
+  int get getter => 42;
+  void set setter(int value) {}
+  void set setter2(int value) {}
+  void set setter3(int value) {}
+  A3 operator +(A3 other) => other;
+  A3 operator *(A3 other) => this;
+}
+
+class B3 extends A3 {
+  void bar() {}
+}
+
+class C3 extends B3 {
+  void baz() {}
+}
+
+extension type E3 on C3
+  show B3, baz, field, setter, set field2, operator +
+  hide foo, get field, getter, setter2, set setter3, operator * {}
+
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.expect
new file mode 100644
index 0000000..ba0e4db
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    : super self::A2::•()
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    : super self::B2::•()
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field = null;
+  field core::String? field2 = null;
+  synthetic constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  get getter() → core::int
+    return 42;
+  set setter(core::int value) → void {}
+  set setter2(core::int value) → void {}
+  set setter3(core::int value) → void {}
+  operator +(self::A3 other) → self::A3
+    return other;
+  operator *(self::A3 other) → self::A3
+    return this;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    : super self::A3::•()
+    ;
+  method bar() → void {}
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    : super self::B3::•()
+    ;
+  method baz() → void {}
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.transformed.expect
new file mode 100644
index 0000000..ba0e4db
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.strong.transformed.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    : super self::A2::•()
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    : super self::B2::•()
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field = null;
+  field core::String? field2 = null;
+  synthetic constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  get getter() → core::int
+    return 42;
+  set setter(core::int value) → void {}
+  set setter2(core::int value) → void {}
+  set setter3(core::int value) → void {}
+  operator +(self::A3 other) → self::A3
+    return other;
+  operator *(self::A3 other) → self::A3
+    return this;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    : super self::A3::•()
+    ;
+  method bar() → void {}
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    : super self::B3::•()
+    ;
+  method baz() → void {}
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.textual_outline.expect
new file mode 100644
index 0000000..0287eb2
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.textual_outline.expect
@@ -0,0 +1,27 @@
+class A<X> {}
+class B<X> extends A<X> {}
+class C extends B<int> {}
+extension type E on C show B<int> hide A<int> {}
+class A2 {}
+class B2 extends A2 {}
+class C2 extends B2 {}
+extension type E2 on C2 show B2 hide A2 {}
+class A3 {
+  void foo() {}
+  int? field;
+  String? field2;
+  int get getter => 42;
+  void set setter(int value) {}
+  void set setter2(int value) {}
+  void set setter3(int value) {}
+  A3 operator +(A3 other) => other;
+  A3 operator *(A3 other) => this;
+}
+class B3 extends A3 {
+  void bar() {}
+}
+class C3 extends B3 {
+  void baz() {}
+}
+extension type E3 on C3 show B3, baz, field, setter, set field2, operator + hide foo, get field, getter, setter2, set setter3, operator * {}
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.expect
new file mode 100644
index 0000000..ba0e4db
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    : super self::A2::•()
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    : super self::B2::•()
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field = null;
+  field core::String? field2 = null;
+  synthetic constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  get getter() → core::int
+    return 42;
+  set setter(core::int value) → void {}
+  set setter2(core::int value) → void {}
+  set setter3(core::int value) → void {}
+  operator +(self::A3 other) → self::A3
+    return other;
+  operator *(self::A3 other) → self::A3
+    return this;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    : super self::A3::•()
+    ;
+  method bar() → void {}
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    : super self::B3::•()
+    ;
+  method baz() → void {}
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.outline.expect
new file mode 100644
index 0000000..4ddfe41
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.outline.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field;
+  field core::String? field2;
+  synthetic constructor •() → self::A3
+    ;
+  method foo() → void
+    ;
+  get getter() → core::int
+    ;
+  set setter(core::int value) → void
+    ;
+  set setter2(core::int value) → void
+    ;
+  set setter3(core::int value) → void
+    ;
+  operator +(self::A3 other) → self::A3
+    ;
+  operator *(self::A3 other) → self::A3
+    ;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    ;
+  method bar() → void
+    ;
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    ;
+  method baz() → void
+    ;
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.transformed.expect
new file mode 100644
index 0000000..ba0e4db
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.transformed.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    : super self::A2::•()
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    : super self::B2::•()
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field = null;
+  field core::String? field2 = null;
+  synthetic constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  get getter() → core::int
+    return 42;
+  set setter(core::int value) → void {}
+  set setter2(core::int value) → void {}
+  set setter3(core::int value) → void {}
+  operator +(self::A3 other) → self::A3
+    return other;
+  operator *(self::A3 other) → self::A3
+    return this;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    : super self::A3::•()
+    ;
+  method bar() → void {}
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    : super self::B3::•()
+    ;
+  method baz() → void {}
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.expect
index a545388..a785e78 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.expect
@@ -45,6 +45,6 @@
   operator +(self::D other) → self::D
     return throw 42;
 }
-extension type E on self::D {
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.transformed.expect
index a545388..a785e78 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.transformed.expect
@@ -45,6 +45,6 @@
   operator +(self::D other) → self::D
     return throw 42;
 }
-extension type E on self::D {
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.expect
index a545388..a785e78 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.expect
@@ -45,6 +45,6 @@
   operator +(self::D other) → self::D
     return throw 42;
 }
-extension type E on self::D {
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.outline.expect
index 37477da..2ab900d 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.outline.expect
@@ -44,7 +44,7 @@
   operator +(self::D other) → self::D
     ;
 }
-extension type E on self::D {
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.transformed.expect
index a545388..a785e78 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.transformed.expect
@@ -45,6 +45,6 @@
   operator +(self::D other) → self::D
     return throw 42;
 }
-extension type E on self::D {
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.strong.expect b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.strong.expect
index 534644b..18f6904 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.strong.expect
@@ -59,13 +59,13 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
 }
-extension type MyInt on core::int {
+extension type MyInt on core::int show-types core::num show-getters core::int::isEven hide-methods core::int::floor hide-getters core::int::floor {
   get twice = self::MyInt|get#twice;
 }
 static method test1(self::E1 e1) → dynamic {
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.expect b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.expect
index 534644b..18f6904 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.expect
@@ -59,13 +59,13 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
 }
-extension type MyInt on core::int {
+extension type MyInt on core::int show-types core::num show-getters core::int::isEven hide-methods core::int::floor hide-getters core::int::floor {
   get twice = self::MyInt|get#twice;
 }
 static method test1(self::E1 e1) → dynamic {
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.outline.expect
index 6962dcb..1cd63b0 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
 }
-extension type MyInt on core::int {
+extension type MyInt on core::int show-types core::num show-getters core::int::isEven hide-methods core::int::floor hide-getters core::int::floor {
   get twice = self::MyInt|get#twice;
 }
 static method test1(self::E1 e1) → dynamic
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.expect
index 8129aa4..70175c9 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.expect
@@ -17,17 +17,17 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
   method ceil = self::E1|ceil;
   tearoff ceil = self::E1|get#ceil;
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
   method ceil = self::E2|ceil;
   tearoff ceil = self::E2|get#ceil;
   method floor = self::E2|floor;
   tearoff floor = self::E2|get#floor;
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
   get isOdd = self::E3|get#isOdd;
   get isEven = self::E3|get#isEven;
 }
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.transformed.expect
index 8129aa4..70175c9 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.strong.transformed.expect
@@ -17,17 +17,17 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
   method ceil = self::E1|ceil;
   tearoff ceil = self::E1|get#ceil;
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
   method ceil = self::E2|ceil;
   tearoff ceil = self::E2|get#ceil;
   method floor = self::E2|floor;
   tearoff floor = self::E2|get#floor;
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
   get isOdd = self::E3|get#isOdd;
   get isEven = self::E3|get#isEven;
 }
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.expect
index 8129aa4..70175c9 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.expect
@@ -17,17 +17,17 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
   method ceil = self::E1|ceil;
   tearoff ceil = self::E1|get#ceil;
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
   method ceil = self::E2|ceil;
   tearoff ceil = self::E2|get#ceil;
   method floor = self::E2|floor;
   tearoff floor = self::E2|get#floor;
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
   get isOdd = self::E3|get#isOdd;
   get isEven = self::E3|get#isEven;
 }
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.outline.expect
index db64d10..afb2d37 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
   method ceil = self::E1|ceil;
   tearoff ceil = self::E1|get#ceil;
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
   method ceil = self::E2|ceil;
   tearoff ceil = self::E2|get#ceil;
   method floor = self::E2|floor;
   tearoff floor = self::E2|get#floor;
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
   get isOdd = self::E3|get#isOdd;
   get isEven = self::E3|get#isEven;
 }
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.transformed.expect
index 8129aa4..70175c9 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.transformed.expect
@@ -17,17 +17,17 @@
 import self as self;
 import "dart:core" as core;
 
-extension E1 on core::int {
+extension E1 on core::int show-types core::num {
   method ceil = self::E1|ceil;
   tearoff ceil = self::E1|get#ceil;
 }
-extension E2 on core::int {
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
   method ceil = self::E2|ceil;
   tearoff ceil = self::E2|get#ceil;
   method floor = self::E2|floor;
   tearoff floor = self::E2|get#floor;
 }
-extension E3 on core::int {
+extension E3 on core::int hide-getters core::int::isEven {
   get isOdd = self::E3|get#isOdd;
   get isEven = self::E3|get#isEven;
 }
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.expect
index 69ddb3b..65db982 100644
--- a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int hide-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int hide-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int hide-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.transformed.expect
index 69ddb3b..65db982 100644
--- a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.transformed.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int hide-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int hide-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int hide-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.expect
index 69ddb3b..65db982 100644
--- a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int hide-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int hide-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int hide-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.outline.expect
index 4a47ac5..cf94cf8 100644
--- a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.outline.expect
@@ -26,21 +26,21 @@
   method baz() → void
     ;
 }
-extension type E0 on core::int {
+extension type E0 on core::int hide-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int hide-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int hide-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.transformed.expect
index 69ddb3b..65db982 100644
--- a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.transformed.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int hide-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int hide-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int hide-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.expect
index 69ddb3b..0aae661 100644
--- a/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int show-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int show-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int show-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.transformed.expect
index 69ddb3b..0aae661 100644
--- a/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.transformed.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int show-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int show-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int show-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.expect
index 69ddb3b..0aae661 100644
--- a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.expect
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int show-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int show-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int show-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.outline.expect
index 4a47ac5..4272c5c 100644
--- a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.outline.expect
@@ -26,21 +26,21 @@
   method baz() → void
     ;
 }
-extension type E0 on core::int {
+extension type E0 on core::int show-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int show-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int show-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.transformed.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.transformed.expect
index 69ddb3b..0aae661 100644
--- a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.transformed.expect
@@ -27,20 +27,20 @@
   set bar(core::int value) → void {}
   method baz() → void {}
 }
-extension type E0 on core::int {
+extension type E0 on core::int show-operators core::num::* {
 }
-extension type E1 on core::int {
+extension type E1 on core::int show-getters core::int::isEven {
 }
-extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
 }
-extension type E3 on core::int {
+extension type E3 on core::int show-types core::num {
 }
-extension type E4 on core::List<core::int> {
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E5 on core::List<dynamic> {
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
 }
-extension type E6 on core::List<core::int> {
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
 }
-extension type E on self::C {
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 1ca96b2..ba00a26 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -29,6 +29,7 @@
 dart2js/late_statics: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
+extension_types/show_hide_all_kinds: FormatterCrash
 extension_types/simple_getter_resolution: FormatterCrash
 extension_types/simple_method_resolution: FormatterCrash
 extension_types/simple_operator_resolution: FormatterCrash
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 06ba968..76d102d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 70;
+  UInt32 formatVersion = 71;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -346,6 +346,16 @@
   Byte flags (isExtensionTypeDeclaration);
   List<TypeParameter> typeParameters;
   DartType onType;
+  List<DartType> shownSupertypes;
+  List<CanonicalNameReference> shownMembers;
+  List<CanonicalNameReference> shownGetters;
+  List<CanonicalNameReference> shownSetters;
+  List<CanonicalNameReference> shownOperators;
+  List<DartType> hiddenSupertypes;
+  List<CanonicalNameReference> hiddenMembers;
+  List<CanonicalNameReference> hiddenGetters;
+  List<CanonicalNameReference> hiddenSetters;
+  List<CanonicalNameReference> hiddenOperators;
   List<ExtensionMemberDescriptor> members;
 }
 
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 9a4165c..b2a0317 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1529,8 +1529,16 @@
   ///   class A {}
   ///   extension B on A {}
   ///
+  /// The 'on clause' appears also in the experimental feature 'extension
+  /// types' as a part of an extension type declaration, for example:
+  ///
+  ///   class A {}
+  ///   extension type B on A {}
   late DartType onType;
 
+  /// The 'show' and 'hide' clauses of an extension type declaration.
+  ExtensionTypeShowHideClause? showHideClause;
+
   /// The members declared by the extension.
   ///
   /// The members are converted into top-level members and only accessible
@@ -1598,6 +1606,10 @@
   void visitChildren(Visitor v) {
     visitList(typeParameters, v);
     onType.accept(v);
+    if (showHideClause != null) {
+      visitList(showHideClause!.shownSupertypes, v);
+      visitList(showHideClause!.hiddenSupertypes, v);
+    }
   }
 
   @override
@@ -1608,6 +1620,10 @@
     if (onType != null) {
       onType = v.visitDartType(onType);
     }
+    if (showHideClause != null) {
+      v.transformSupertypeList(showHideClause!.shownSupertypes);
+      v.transformSupertypeList(showHideClause!.hiddenSupertypes);
+    }
   }
 
   @override
@@ -1618,6 +1634,10 @@
     if (onType != null) {
       onType = v.visitDartType(onType, cannotRemoveSentinel);
     }
+    if (showHideClause != null) {
+      v.transformSupertypeList(showHideClause!.shownSupertypes);
+      v.transformSupertypeList(showHideClause!.hiddenSupertypes);
+    }
   }
 
   @override
@@ -1705,6 +1725,117 @@
   }
 }
 
+/// Elements of the 'show' and 'hide' clauses of an extension type declaration.
+class ExtensionTypeShowHideClause {
+  /// The types in the 'show clause' of the extension type declaration.
+  ///
+  /// For instance A, B in:
+  ///
+  ///   class A {}
+  ///   class B {}
+  ///   class C extends B implements A {}
+  ///   extension type E on C show B, A {}
+  final List<Supertype> shownSupertypes = <Supertype>[];
+
+  /// The methods in the 'show clause' of the extension type declaration.
+  ///
+  /// For instance foo in
+  ///
+  ///   class A {
+  ///     void foo() {}
+  ///   }
+  ///   extension type E on A show foo {}
+  final List<Reference> shownMethods = <Reference>[];
+
+  /// The getters in the 'show clause' of the extension type declaration.
+  ///
+  /// For instance foo, bar, baz in
+  ///
+  ///   class A {
+  ///     void foo() {}
+  ///     int? bar;
+  ///     int get baz => 42;
+  ///   }
+  ///   extension type E on A show get foo, get bar, get baz {}
+  final List<Reference> shownGetters = <Reference>[];
+
+  /// The setters in the 'show clause' of the extension type declaration.
+  ///
+  /// For instance foo, bar in
+  ///
+  ///   class A {
+  ///     int? foo;
+  ///     void set bar(int value) {}
+  ///   }
+  ///   extension type E on A show set foo, set bar {}
+  final List<Reference> shownSetters = <Reference>[];
+
+  /// The operators in the 'show clause' of the extension type declaration.
+  ///
+  /// For instance +, * in
+  ///
+  ///   class A {
+  ///     A operator+(A other) => other;
+  ///     A operator*(A other) => this;
+  ///   }
+  ///   extension type E on A show operator +, operator * {}
+  final List<Reference> shownOperators = <Reference>[];
+
+  /// The types in the 'hide clause' of the extension type declaration.
+  ///
+  /// For instance A, B in:
+  ///
+  ///   class A {}
+  ///   class B {}
+  ///   class C extends B implements A {}
+  ///   extension E on C hide A, B {}
+  final List<Supertype> hiddenSupertypes = <Supertype>[];
+
+  /// The methods in the 'hide clause' of the extension type declaration.
+  ///
+  /// For instance foo in
+  ///
+  ///   class A {
+  ///     void foo() {}
+  ///   }
+  ///   extension type E on A hide foo {}
+  final List<Reference> hiddenMethods = <Reference>[];
+
+  /// The getters in the 'hide clause' of the extension type declaration.
+  ///
+  /// For instance foo, bar, baz in
+  ///
+  ///   class A {
+  ///     void foo() {}
+  ///     int? bar;
+  ///     int get baz => 42;
+  ///   }
+  ///   extension type E on A hide get foo, get bar, get baz {}
+  final List<Reference> hiddenGetters = <Reference>[];
+
+  /// The setters in the 'hide clause' of the extension type declaration.
+  ///
+  /// For instance foo, bar in
+  ///
+  ///   class A {
+  ///     int? foo;
+  ///     void set bar(int value) {}
+  ///   }
+  ///   extension type E on A hide set foo, set bar {}
+  final List<Reference> hiddenSetters = <Reference>[];
+
+  /// The operators in the 'hide clause' of the extension type declaration.
+  ///
+  /// For instance +, * in
+  ///
+  ///   class A {
+  ///     A operator+(A other) => other;
+  ///     A operator*(A other) => this;
+  ///   }
+  ///   extension type E on A hide operator +, operator * {}
+  final List<Reference> hiddenOperators = <Reference>[];
+}
+
 // ------------------------------------------------------------------------
 //                            MEMBERS
 // ------------------------------------------------------------------------
@@ -14054,6 +14185,11 @@
 /// polymorphism. See https://dart-review.googlesource.com/c/sdk/+/185828.
 final List<String> emptyListOfString = List.filled(0, '', growable: false);
 
+/// Almost const <Reference>[], but not const in an attempt to avoid
+/// polymorphism. See https://dart-review.googlesource.com/c/sdk/+/185828.
+final List<Reference> emptyListOfReference =
+    List.filled(0, Reference(), growable: false);
+
 /// Almost const <Typedef>[], but not const in an attempt to avoid
 /// polymorphism. See https://dart-review.googlesource.com/c/sdk/+/185828.
 final List<Typedef> emptyListOfTypedef =
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index d53d7de..14eb7b8 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -529,6 +529,16 @@
         growable: useGrowableLists);
   }
 
+  List<Reference> readNonNullReferenceList() {
+    int length = readUInt30();
+    if (!useGrowableLists && length == 0) {
+      return emptyListOfReference;
+    }
+    return new List<Reference>.generate(
+        length, (_) => readNonNullMemberReference(),
+        growable: useGrowableLists);
+  }
+
   String? readStringOrNullIfEmpty() {
     String string = readStringReference();
     return string.isEmpty ? null : string;
@@ -1448,11 +1458,32 @@
 
     readAndPushTypeParameterList(node.typeParameters, node);
     DartType onType = readDartType();
+    List<Supertype> shownSupertypes = readSupertypeList();
+    List<Reference> shownMembers = readNonNullReferenceList();
+    List<Reference> shownGetters = readNonNullReferenceList();
+    List<Reference> shownSetters = readNonNullReferenceList();
+    List<Reference> shownOperators = readNonNullReferenceList();
+    List<Supertype> hiddenSupertypes = readSupertypeList();
+    List<Reference> hiddenMembers = readNonNullReferenceList();
+    List<Reference> hiddenGetters = readNonNullReferenceList();
+    List<Reference> hiddenSetters = readNonNullReferenceList();
+    List<Reference> hiddenOperators = readNonNullReferenceList();
     typeParameterStack.length = 0;
 
     node.name = name;
     node.fileUri = fileUri;
     node.onType = onType;
+    node.showHideClause = new ExtensionTypeShowHideClause()
+      ..shownSupertypes.addAll(shownSupertypes)
+      ..shownMethods.addAll(shownMembers)
+      ..shownGetters.addAll(shownGetters)
+      ..shownSetters.addAll(shownSetters)
+      ..shownOperators.addAll(shownOperators)
+      ..hiddenSupertypes.addAll(hiddenSupertypes)
+      ..hiddenMethods.addAll(hiddenMembers)
+      ..hiddenGetters.addAll(hiddenGetters)
+      ..hiddenSetters.addAll(hiddenSetters)
+      ..hiddenOperators.addAll(hiddenOperators);
 
     node.members = _readExtensionMemberDescriptorList();
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index a295640..31281ff 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2451,6 +2451,18 @@
     enterScope(typeParameters: node.typeParameters);
     writeNodeList(node.typeParameters);
     writeDartType(node.onType);
+    ExtensionTypeShowHideClause showHideClause =
+        node.showHideClause ?? new ExtensionTypeShowHideClause();
+    writeNodeList(showHideClause.shownSupertypes);
+    writeList(showHideClause.shownMethods, writeNonNullReference);
+    writeList(showHideClause.shownGetters, writeNonNullReference);
+    writeList(showHideClause.shownSetters, writeNonNullReference);
+    writeList(showHideClause.shownOperators, writeNonNullReference);
+    writeNodeList(showHideClause.hiddenSupertypes);
+    writeList(showHideClause.hiddenMethods, writeNonNullReference);
+    writeList(showHideClause.hiddenGetters, writeNonNullReference);
+    writeList(showHideClause.hiddenSetters, writeNonNullReference);
+    writeList(showHideClause.hiddenOperators, writeNonNullReference);
     leaveScope(typeParameters: node.typeParameters);
 
     final int len = node.members.length;
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index f9a62ce..2fe1841 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -176,7 +176,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 70;
+  static const int BinaryFormatVersion = 71;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/src/equivalence.dart b/pkg/kernel/lib/src/equivalence.dart
index a8edddb..b307532 100644
--- a/pkg/kernel/lib/src/equivalence.dart
+++ b/pkg/kernel/lib/src/equivalence.dart
@@ -1516,6 +1516,49 @@
     return result;
   }
 
+  bool checkExtensionTypeShowHideClause(EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause? node, Object? other) {
+    if (identical(node, other)) return true;
+    if (node is! ExtensionTypeShowHideClause) return false;
+    if (other is! ExtensionTypeShowHideClause) return false;
+    bool result = true;
+    if (!checkExtensionTypeShowHideClause_shownSupertypes(
+        visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_shownMethods(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_shownGetters(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_shownSetters(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_shownOperators(
+        visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_hiddenSupertypes(
+        visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_hiddenMethods(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_hiddenGetters(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_hiddenSetters(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkExtensionTypeShowHideClause_hiddenOperators(
+        visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    return result;
+  }
+
   bool checkExtensionMemberDescriptor(EquivalenceVisitor visitor,
       ExtensionMemberDescriptor? node, Object? other) {
     if (identical(node, other)) return true;
@@ -1559,6 +1602,9 @@
     if (!checkExtension_onType(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkExtension_showHideClause(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkExtension_members(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -4723,6 +4769,87 @@
     return visitor.checkNodes(node.onType, other.onType, 'onType');
   }
 
+  bool checkExtensionTypeShowHideClause_shownSupertypes(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.shownSupertypes, other.shownSupertypes,
+        visitor.checkNodes, 'shownSupertypes');
+  }
+
+  bool checkExtensionTypeShowHideClause_shownMethods(EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node, ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.shownMethods, other.shownMethods,
+        visitor.checkReferences, 'shownMethods');
+  }
+
+  bool checkExtensionTypeShowHideClause_shownGetters(EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node, ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.shownGetters, other.shownGetters,
+        visitor.checkReferences, 'shownGetters');
+  }
+
+  bool checkExtensionTypeShowHideClause_shownSetters(EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node, ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.shownSetters, other.shownSetters,
+        visitor.checkReferences, 'shownSetters');
+  }
+
+  bool checkExtensionTypeShowHideClause_shownOperators(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.shownOperators, other.shownOperators,
+        visitor.checkReferences, 'shownOperators');
+  }
+
+  bool checkExtensionTypeShowHideClause_hiddenSupertypes(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.hiddenSupertypes, other.hiddenSupertypes,
+        visitor.checkNodes, 'hiddenSupertypes');
+  }
+
+  bool checkExtensionTypeShowHideClause_hiddenMethods(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.hiddenMethods, other.hiddenMethods,
+        visitor.checkReferences, 'hiddenMethods');
+  }
+
+  bool checkExtensionTypeShowHideClause_hiddenGetters(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.hiddenGetters, other.hiddenGetters,
+        visitor.checkReferences, 'hiddenGetters');
+  }
+
+  bool checkExtensionTypeShowHideClause_hiddenSetters(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.hiddenSetters, other.hiddenSetters,
+        visitor.checkReferences, 'hiddenSetters');
+  }
+
+  bool checkExtensionTypeShowHideClause_hiddenOperators(
+      EquivalenceVisitor visitor,
+      ExtensionTypeShowHideClause node,
+      ExtensionTypeShowHideClause other) {
+    return visitor.checkLists(node.hiddenOperators, other.hiddenOperators,
+        visitor.checkReferences, 'hiddenOperators');
+  }
+
+  bool checkExtension_showHideClause(
+      EquivalenceVisitor visitor, Extension node, Extension other) {
+    'showHideClause';
+    return checkExtensionTypeShowHideClause(
+        visitor, node.showHideClause, other.showHideClause);
+  }
+
   bool checkExtensionMemberDescriptor_name(EquivalenceVisitor visitor,
       ExtensionMemberDescriptor node, ExtensionMemberDescriptor other) {
     return visitor.checkNodes(node.name, other.name, 'name');
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 132a4e1..6119f33 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1351,10 +1351,67 @@
     writeTypeParameterList(node.typeParameters);
     writeSpaced('on');
     writeType(node.onType);
+
+    ExtensionTypeShowHideClause? showHideClause = node.showHideClause;
+    if (showHideClause != null) {
+      // 'Show' clause elements.
+      if (showHideClause.shownSupertypes.isNotEmpty) {
+        writeSpaced('show-types');
+        writeList(showHideClause.shownSupertypes, visitSupertype);
+      }
+      if (showHideClause.shownMethods.isNotEmpty) {
+        writeSpaced('show-methods');
+        writeList(
+            showHideClause.shownMethods, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.shownGetters.isNotEmpty) {
+        writeSpaced('show-getters');
+        writeList(
+            showHideClause.shownGetters, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.shownSetters.isNotEmpty) {
+        writeSpaced('show-setters');
+        writeList(
+            showHideClause.shownSetters, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.shownOperators.isNotEmpty) {
+        writeSpaced('show-operators');
+        writeList(
+            showHideClause.shownOperators, writeMemberReferenceFromReference);
+      }
+
+      // 'Hide' clause elements.
+      if (showHideClause.hiddenSupertypes.isNotEmpty) {
+        writeSpaced('hide-types');
+        writeList(showHideClause.hiddenSupertypes, visitSupertype);
+      }
+      if (showHideClause.hiddenMethods.isNotEmpty) {
+        writeSpaced('hide-methods');
+        writeList(
+            showHideClause.hiddenMethods, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.hiddenGetters.isNotEmpty) {
+        writeSpaced('hide-getters');
+        writeList(
+            showHideClause.hiddenGetters, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.hiddenSetters.isNotEmpty) {
+        writeSpaced('hide-setters');
+        writeList(
+            showHideClause.hiddenSetters, writeMemberReferenceFromReference);
+      }
+      if (showHideClause.hiddenOperators.isNotEmpty) {
+        writeSpaced('hide-operators');
+        writeList(
+            showHideClause.hiddenOperators, writeMemberReferenceFromReference);
+      }
+    }
+
     String endLineString = ' {';
     if (node.enclosingLibrary.fileUri != node.fileUri) {
       endLineString += ' // from ${node.fileUri}';
     }
+
     endLine(endLineString);
     ++indentation;
     node.members.forEach((ExtensionMemberDescriptor descriptor) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 0602be0..442248a 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2252,6 +2252,13 @@
   }
 }
 
+void KernelReaderHelper::SkipListOfCanonicalNameReferences() {
+  intptr_t list_length = ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    SkipCanonicalNameReference();
+  }
+}
+
 void KernelReaderHelper::SkipTypeParametersList() {
   intptr_t list_length = ReadListLength();  // read list length.
   for (intptr_t i = 0; i < list_length; ++i) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 39d9d18..d7e5542 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1239,6 +1239,7 @@
   void SkipListOfDartTypes();
   void SkipListOfStrings();
   void SkipListOfVariableDeclarations();
+  void SkipListOfCanonicalNameReferences();
   void SkipTypeParametersList();
   void SkipInitializer();
   void SkipExpression();
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index fa1b774..653c0fd 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 70;
-static const uint32_t kMaxSupportedKernelFormatVersion = 70;
+static const uint32_t kMinSupportedKernelFormatVersion = 71;
+static const uint32_t kMaxSupportedKernelFormatVersion = 71;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 3a35bd4..f018ad4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1088,6 +1088,16 @@
       helper_.ReadByte();                    // skip flags.
       helper_.SkipTypeParametersList();      // skip type parameter list.
       helper_.SkipDartType();                // skip on-type.
+      helper_.SkipListOfDartTypes();         // skip shown types.
+      helper_.SkipListOfCanonicalNameReferences();  // skip shown members.
+      helper_.SkipListOfCanonicalNameReferences();  // skip shown getters.
+      helper_.SkipListOfCanonicalNameReferences();  // skip shown setters.
+      helper_.SkipListOfCanonicalNameReferences();  // skip shown operators.
+      helper_.SkipListOfDartTypes();                // skip hidden types.
+      helper_.SkipListOfCanonicalNameReferences();  // skip hidden members.
+      helper_.SkipListOfCanonicalNameReferences();  // skip hidden getters.
+      helper_.SkipListOfCanonicalNameReferences();  // skip hidden setters.
+      helper_.SkipListOfCanonicalNameReferences();  // skip hidden operators.
 
       const intptr_t extension_member_count = helper_.ReadListLength();
       for (intptr_t j = 0; j < extension_member_count; ++j) {