Version 2.15.0-88.0.dev

Merge commit 'e161187728c824d062be8282a7c6de9b703d12e5' into 'dev'
diff --git a/DEPS b/DEPS
index 503c2f8..0719a0f 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "a4f77a02a3676b1c2e7390c860cb0486c8515d3f",
+  "co19_rev": "4aae571b0358e2f063ab68f2eb92857e31deb0b9",
   "co19_2_rev": "3e1ea1af9ef293d7f6a8f3332b5c71c7072a30e0",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 93ebfdc..613e335 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -651,9 +651,9 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
-    listener?.endExtensionDeclaration(
-        extensionKeyword, typeKeyword, onKeyword, endToken);
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
+    listener?.endExtensionDeclaration(extensionKeyword, typeKeyword, onKeyword,
+        showKeyword, hideKeyword, endToken);
   }
 
   @override
@@ -1160,6 +1160,13 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    listener?.handleExtensionShowHide(
+        showKeyword, showElementCount, hideKeyword, hideElementCount);
+  }
+
+  @override
   void handleClassWithClause(Token withKeyword) {
     listener?.handleClassWithClause(withKeyword);
   }
@@ -1281,6 +1288,11 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    listener?.handleShowHideIdentifier(modifier, identifier);
+  }
+
+  @override
   void handleIdentifier(Token token, IdentifierContext context) {
     listener?.handleIdentifier(token, context);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
index 4615974..5236661 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context.dart
@@ -226,6 +226,30 @@
   static const ExpressionIdentifierContext expressionContinuation =
       const ExpressionIdentifierContext.continuation();
 
+  /// Identifier appears in a show or a hide clause of an extension type
+  /// declaration preceded by 'get'.
+  static const ExtensionShowHideElementIdentifierContext
+      extensionShowHideElementGetter =
+      const ExtensionShowHideElementIdentifierContext.getter();
+
+  /// Identifier appears in a show or a hide clause of an extension type
+  /// declaration, not preceded by 'get', 'set', or 'operator'.
+  static const ExtensionShowHideElementIdentifierContext
+      extensionShowHideElementMemberOrType =
+      const ExtensionShowHideElementIdentifierContext.memberOrType();
+
+  /// Identifier appears in a show or a hide clause of an extension type
+  /// declaration preceded by 'operator'.
+  static const ExtensionShowHideElementIdentifierContext
+      extensionShowHideElementOperator =
+      const ExtensionShowHideElementIdentifierContext.operator();
+
+  /// Identifier appears in a show or a hide clause of an extension type
+  /// declaration preceded by 'set'.
+  static const ExtensionShowHideElementIdentifierContext
+      extensionShowHideElementSetter =
+      const ExtensionShowHideElementIdentifierContext.setter();
+
   /// Identifier is a reference to a named argument of a function or method
   /// invocation (e.g. `foo` in `f(foo: 0);`.
   static const NamedArgumentReferenceIdentifierContext namedArgumentReference =
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
index 68721e0..6e224d0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
@@ -371,6 +371,84 @@
   }
 }
 
+/// See [IdentifierContext.extensionShowHideElementGetter],
+/// [IdentifierContext.extensionShowHideElementMemberOrType],
+/// [IdentifierContext.extensionShowHideElementOperator],
+/// [IdentifierContext.extensionShowHideElementSetter].
+class ExtensionShowHideElementIdentifierContext extends IdentifierContext {
+  static const int _getterKind = 0;
+  static const int _memberOrTypeKind = 1;
+  static const int _operator = 2;
+  static const int _setterKind = 3;
+
+  final int _kind;
+
+  const ExtensionShowHideElementIdentifierContext.getter()
+      : _kind = _getterKind,
+        super('extensionShowHideElementGetter', inDeclaration: true);
+
+  const ExtensionShowHideElementIdentifierContext.memberOrType()
+      : _kind = _memberOrTypeKind,
+        super('extensionShowHideElementMemberOrType', inDeclaration: true);
+
+  const ExtensionShowHideElementIdentifierContext.operator()
+      : _kind = _operator,
+        super('extensionShowHideElementOperator', inDeclaration: true);
+
+  const ExtensionShowHideElementIdentifierContext.setter()
+      : _kind = _setterKind,
+        super('extensionShowHideElementSetter', inDeclaration: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next!;
+    if (identifier.isIdentifier ||
+        _kind == _operator && identifier.isOperator) {
+      return identifier;
+    }
+
+    // Recovery
+    const List<String> afterIdentifier = const [
+      '<',
+      '{',
+      'extends',
+      'with',
+      'implements',
+      'on',
+      '=',
+    ];
+    if (identifier.isEof ||
+        (looksLikeStartOfNextTopLevelDeclaration(identifier) &&
+            (identifier.next == null ||
+                !isOneOfOrEof(identifier.next!, afterIdentifier))) ||
+        (isOneOfOrEof(identifier, afterIdentifier) &&
+            (identifier.next == null ||
+                !isOneOfOrEof(identifier.next!, afterIdentifier)))) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: codes.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      if (!identifier.isKeywordOrIdentifier) {
+        parser.reportRecoverableErrorWithToken(
+            identifier, codes.templateExpectedIdentifier);
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      } else {
+        // Use the keyword as the identifier.
+        parser.reportRecoverableErrorWithToken(
+            identifier, codes.templateExpectedIdentifierButGotKeyword);
+      }
+    }
+    return identifier;
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return other is ExtensionShowHideElementIdentifierContext &&
+        _kind == other._kind;
+  }
+}
+
 /// See [IdentifierContext.fieldDeclaration].
 class FieldDeclarationIdentifierContext extends IdentifierContext {
   const FieldDeclarationIdentifierContext()
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 564eaaa..d597b3a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -144,6 +144,14 @@
     logEvent("ClassImplements");
   }
 
+  /// Handle a show clause in an extension declaration.
+  /// Substructures:
+  /// - shown types and instance members
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    logEvent("ExtensionShowHide");
+  }
+
   /// Handle the header of a class declaration.  Substructures:
   /// - metadata
   /// - modifiers
@@ -238,7 +246,7 @@
   /// - on type
   /// - body
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     logEvent('ExtensionDeclaration');
   }
 
@@ -1445,6 +1453,13 @@
     logEvent("Identifier");
   }
 
+  /// Handle an identifier token in a show or hide clause.
+  ///
+  /// [context] indicates what kind of construct the identifier appears in.
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    logEvent("ShowHideIdentifier");
+  }
+
   void handleIndexedExpression(
       Token? question, Token openSquareBracket, Token closeSquareBracket) {
     logEvent("IndexedExpression");
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index f35035f..c59af84 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -2391,6 +2391,63 @@
     }
     TypeInfo typeInfo = computeType(onKeyword, /* required = */ true);
     token = typeInfo.ensureTypeOrVoid(onKeyword, this);
+
+    int handleShowHideElements() {
+      int elementCount = 0;
+      do {
+        Token next = token.next!.next!;
+        if (optional('get', next)) {
+          token = IdentifierContext.extensionShowHideElementGetter
+              .ensureIdentifier(next, this);
+          listener.handleShowHideIdentifier(next, token);
+        } else if (optional('operator', next)) {
+          token = IdentifierContext.extensionShowHideElementOperator
+              .ensureIdentifier(next, this);
+          listener.handleShowHideIdentifier(next, token);
+        } else if (optional('set', next)) {
+          token = IdentifierContext.extensionShowHideElementSetter
+              .ensureIdentifier(next, this);
+          listener.handleShowHideIdentifier(next, token);
+        } else {
+          TypeInfo typeInfo = computeType(
+              token.next!,
+              /* required = */ true,
+              /* inDeclaration = */ true,
+              /* acceptKeywordForSimpleType = */ true);
+          final bool isUnambiguouslyType =
+              typeInfo.hasTypeArguments || typeInfo is PrefixedType;
+          if (isUnambiguouslyType) {
+            token = typeInfo.ensureTypeOrVoid(token.next!, this);
+          } else {
+            token = IdentifierContext.extensionShowHideElementMemberOrType
+                .ensureIdentifier(token.next!, this);
+            listener.handleShowHideIdentifier(null, token);
+          }
+        }
+        ++elementCount;
+      } while (optional(',', token.next!));
+      return elementCount;
+    }
+
+    Token? showKeyword = token.next!;
+    int showElementCount = 0;
+    if (optional('show', showKeyword)) {
+      showElementCount = handleShowHideElements();
+    } else {
+      showKeyword = null;
+    }
+
+    Token? hideKeyword = token.next!;
+    int hideElementCount = 0;
+    if (optional('hide', hideKeyword)) {
+      hideElementCount = handleShowHideElements();
+    } else {
+      hideKeyword = null;
+    }
+
+    listener.handleExtensionShowHide(
+        showKeyword, showElementCount, hideKeyword, hideElementCount);
+
     if (!optional('{', token.next!)) {
       // Recovery
       Token next = token.next!;
@@ -2417,8 +2474,8 @@
     }
     token = parseClassOrMixinOrExtensionBody(
         token, DeclarationKind.Extension, name?.lexeme);
-    listener.endExtensionDeclaration(
-        extensionKeyword, typeKeyword, onKeyword, token);
+    listener.endExtensionDeclaration(extensionKeyword, typeKeyword, onKeyword,
+        showKeyword, hideKeyword, token);
     return token;
   }
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 96a61a4..d475eed 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -48,6 +48,7 @@
   FunctionBody,
   FunctionBodyAsyncToken,
   FunctionBodyStarToken,
+  HideClause,
   Identifier,
   IdentifierList,
   Initializers,
@@ -55,8 +56,10 @@
   Metadata,
   Modifiers,
   Name,
+  OperatorList,
   ParameterDefaultValue,
   Prefix,
+  ShowClause,
   StringLiteral,
   SwitchScope,
   Token,
@@ -346,6 +349,12 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    debugEvent("ExtensionShow");
+  }
+
+  @override
   void handleNoTypeArguments(Token token) {
     debugEvent("NoTypeArguments");
     push(NullValue.TypeArguments);
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
index 2546579..84f65f6 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
@@ -36,6 +36,9 @@
   /// void Function foo(int x);
   bool get isFunctionType;
 
+  /// Returns true if the type has type arguments.
+  bool get hasTypeArguments;
+
   /// Call this function when the token after [token] must be a type (not void).
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type, inserting a synthetic type reference if
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index 899bbd4..939bcc0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -99,6 +99,9 @@
   bool get couldBeExpression => false;
 
   @override
+  bool get hasTypeArguments => false;
+
+  @override
   bool get isNullable => false;
 
   @override
@@ -143,6 +146,9 @@
   bool get couldBeExpression => true;
 
   @override
+  bool get hasTypeArguments => false;
+
+  @override
   bool get isNullable => false;
 
   @override
@@ -229,6 +235,9 @@
   bool get couldBeExpression => false;
 
   @override
+  bool get hasTypeArguments => true;
+
+  @override
   bool get isNullable => false;
 
   @override
@@ -306,6 +315,9 @@
   bool get couldBeExpression => true;
 
   @override
+  bool get hasTypeArguments => false;
+
+  @override
   bool get isNullable => false;
 
   @override
@@ -354,6 +366,9 @@
   bool get couldBeExpression => false;
 
   @override
+  bool get hasTypeArguments => false;
+
+  @override
   bool get isNullable => false;
 
   @override
@@ -493,6 +508,9 @@
       typeArguments == noTypeParamOrArg && typeVariableStarters.isEmpty;
 
   @override
+  bool get hasTypeArguments => typeArguments is! NoTypeParamOrArg;
+
+  @override
   bool get isNullable => beforeQuestionMark != null;
 
   @override
@@ -828,11 +846,8 @@
     listener.beginTypeVariable(token);
     listener.handleTypeVariablesDefined(token, /* count = */ 1);
     listener.handleNoType(token);
-    listener.endTypeVariable(
-        endGroup,
-        /* index = */ 0,
-        /* extendsOrSuper = */ null,
-        /* variance = */ null);
+    listener.endTypeVariable(endGroup, /* index = */ 0,
+        /* extendsOrSuper = */ null, /* variance = */ null);
     listener.endTypeVariables(beginGroup, endGroup);
     return endGroup;
   }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 2df5ebb..bfbb493 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -469,6 +469,8 @@
 
   R? visitGenericTypeAlias(GenericTypeAlias node);
 
+  R? visitHideClause(HideClause node);
+
   R? visitHideCombinator(HideCombinator node);
 
   R? visitIfElement(IfElement node);
@@ -544,8 +546,12 @@
 
   R? visitSetOrMapLiteral(SetOrMapLiteral node);
 
+  R? visitShowClause(ShowClause node);
+
   R? visitShowCombinator(ShowCombinator node);
 
+  R? visitShowHideElement(ShowHideElement node);
+
   R? visitSimpleFormalParameter(SimpleFormalParameter node);
 
   R? visitSimpleIdentifier(SimpleIdentifier node);
@@ -1683,7 +1689,8 @@
 ///
 ///    extension ::=
 ///        'extension' [SimpleIdentifier]? [TypeParameterList]?
-///        'on' [TypeAnnotation] '{' [ClassMember]* '}'
+///        'on' [TypeAnnotation] [ShowClause]? [HideClause]?
+///        '{' [ClassMember]* '}'
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ExtensionDeclaration implements CompilationUnitMember {
@@ -1696,6 +1703,10 @@
   /// Return the token representing the 'extension' keyword.
   Token get extensionKeyword;
 
+  /// Return the hide clause, or `null` if the extension does not have a hide
+  /// clause.
+  HideClause? get hideClause;
+
   /// Return the left curly bracket.
   Token get leftBracket;
 
@@ -1712,6 +1723,10 @@
   /// Return the right curly bracket.
   Token get rightBracket;
 
+  /// Return the show clause, or `null` if the extension does not have a show
+  /// clause.
+  ShowClause? get showClause;
+
   /// Return the token representing the 'type' keyword.
   Token? get typeKeyword;
 
@@ -2437,6 +2452,20 @@
   TypeParameterList? get typeParameters;
 }
 
+/// The "hide" clause in an extension declaration.
+///
+///    hideClause ::=
+///        'hide' [TypeName] (',' [TypeName])*
+///
+///  Clients may not extend, implement or mix-in this class.
+abstract class HideClause implements AstNode {
+  /// Return the list of the elements that are being shown.
+  NodeList<ShowHideClauseElement> get elements;
+
+  /// Return the token representing the 'hide' keyword.
+  Token get hideKeyword;
+}
+
 /// A combinator that restricts the names being imported to those that are not
 /// in a given list.
 ///
@@ -3667,6 +3696,20 @@
   Token get rightBracket;
 }
 
+/// The "show" clause in an extension declaration.
+///
+///    showClause ::=
+///        'show' [TypeName] (',' [TypeName])*
+///
+///  Clients may not extend, implement or mix-in this class.
+abstract class ShowClause implements AstNode {
+  /// Return the list of the elements that are being shown.
+  NodeList<ShowHideClauseElement> get elements;
+
+  /// Return the token representing the 'show' keyword.
+  Token get showKeyword;
+}
+
 /// A combinator that restricts the names being imported to those in a given list.
 ///
 ///    showCombinator ::=
@@ -3679,6 +3722,29 @@
   NodeList<SimpleIdentifier> get shownNames;
 }
 
+/// A node that can appear in the show or hide clauses.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ShowHideClauseElement implements AstNode {}
+
+/// A potentially non-type element of a show or a hide clause.
+///
+///    showHideElement ::=
+///        'get' [SimpleIdentifier] |
+///        'set' [SimpleIdentifier] |
+///        'operator' [SimpleIdentifier] |
+///        [SimpleIdentifier]
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ShowHideElement implements AstNode, ShowHideClauseElement {
+  /// Return the 'get', 'set', or 'operator' modifier that appears before the
+  /// name, or `null` if there is no modifier.
+  Token? get modifier;
+
+  /// Return the name of the member the element refers to.
+  SimpleIdentifier get name;
+}
+
 /// A simple formal parameter.
 ///
 ///    simpleFormalParameter ::=
@@ -4182,7 +4248,7 @@
 ///        [Identifier] typeArguments?
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class TypeName implements NamedType {}
+abstract class TypeName implements NamedType, ShowHideClauseElement {}
 
 /// A type parameter.
 ///
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index d8469f2..7dc28ed 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -545,6 +545,11 @@
       TypeAnnotation type,
       Token semicolon);
 
+  /// Returns a newly created hide clause.
+  HideClause hideClause(
+      {required Token hideKeyword,
+      required List<ShowHideClauseElement> elements});
+
   /// Returns a newly created import show combinator.
   HideCombinator hideCombinator(
       Token keyword, List<SimpleIdentifier> hiddenNames);
@@ -792,10 +797,19 @@
       required List<CollectionElement> elements,
       required Token rightBracket});
 
+  /// Returns a newly created show clause.
+  ShowClause showClause(
+      {required Token showKeyword,
+      required List<ShowHideClauseElement> elements});
+
   /// Returns a newly created import show combinator.
   ShowCombinator showCombinator(
       Token keyword, List<SimpleIdentifier> shownNames);
 
+  /// Returns a newly created element of a show or hide clause.
+  ShowHideElement showHideElement(
+      {required Token? modifier, required SimpleIdentifier name});
+
   /// Returns a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [keyword] can be `null` if a type was
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index a10cb66d..5129ab3 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -366,6 +366,9 @@
   R? visitGenericTypeAlias(GenericTypeAlias node) => visitTypeAlias(node);
 
   @override
+  R? visitHideClause(HideClause node) => visitNode(node);
+
+  @override
   R? visitHideCombinator(HideCombinator node) => visitCombinator(node);
 
   R? visitIdentifier(Identifier node) => visitExpression(node);
@@ -510,9 +513,15 @@
   R? visitSetOrMapLiteral(SetOrMapLiteral node) => visitTypedLiteral(node);
 
   @override
+  R? visitShowClause(ShowClause node) => visitNode(node);
+
+  @override
   R? visitShowCombinator(ShowCombinator node) => visitCombinator(node);
 
   @override
+  R? visitShowHideElement(ShowHideElement node) => visitNode(node);
+
+  @override
   R? visitSimpleFormalParameter(SimpleFormalParameter node) =>
       visitNormalFormalParameter(node);
 
@@ -991,6 +1000,12 @@
   }
 
   @override
+  R? visitHideClause(HideClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitHideCombinator(HideCombinator node) {
     node.visitChildren(this);
     return null;
@@ -1214,12 +1229,24 @@
   }
 
   @override
+  R? visitShowClause(ShowClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitShowCombinator(ShowCombinator node) {
     node.visitChildren(this);
     return null;
   }
 
   @override
+  R? visitShowHideElement(ShowHideElement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitSimpleFormalParameter(SimpleFormalParameter node) {
     node.visitChildren(this);
     return null;
@@ -1570,6 +1597,9 @@
   R? visitGenericTypeAlias(GenericTypeAlias node) => null;
 
   @override
+  R? visitHideClause(HideClause node) => null;
+
+  @override
   R? visitHideCombinator(HideCombinator node) => null;
 
   @override
@@ -1683,9 +1713,15 @@
   R? visitSetOrMapLiteral(SetOrMapLiteral node) => null;
 
   @override
+  R? visitShowClause(ShowClause node) => null;
+
+  @override
   R? visitShowCombinator(ShowCombinator node) => null;
 
   @override
+  R? visitShowHideElement(ShowHideElement node) => null;
+
+  @override
   R? visitSimpleFormalParameter(SimpleFormalParameter node) => null;
 
   @override
@@ -1964,6 +2000,9 @@
   R? visitGenericTypeAlias(GenericTypeAlias node) => _throw(node);
 
   @override
+  R? visitHideClause(HideClause node) => _throw(node);
+
+  @override
   R? visitHideCombinator(HideCombinator node) => _throw(node);
 
   @override
@@ -2078,9 +2117,15 @@
   R? visitSetOrMapLiteral(SetOrMapLiteral node) => _throw(node);
 
   @override
+  R? visitShowClause(ShowClause node) => _throw(node);
+
+  @override
   R? visitShowCombinator(ShowCombinator node) => _throw(node);
 
   @override
+  R? visitShowHideElement(ShowHideElement node) => _throw(node);
+
+  @override
   R? visitSimpleFormalParameter(SimpleFormalParameter node) => _throw(node);
 
   @override
@@ -2662,6 +2707,14 @@
   }
 
   @override
+  T? visitHideClause(HideClause node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitHideClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitHideCombinator(HideCombinator node) {
     stopwatch.start();
     T? result = _baseVisitor.visitHideCombinator(node);
@@ -2959,6 +3012,14 @@
   }
 
   @override
+  T? visitShowClause(ShowClause node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitShowClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitShowCombinator(ShowCombinator node) {
     stopwatch.start();
     T? result = _baseVisitor.visitShowCombinator(node);
@@ -2967,6 +3028,14 @@
   }
 
   @override
+  T? visitShowHideElement(ShowHideElement node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitShowHideElement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitSimpleFormalParameter(SimpleFormalParameter node) {
     stopwatch.start();
     T? result = _baseVisitor.visitSimpleFormalParameter(node);
@@ -3383,6 +3452,9 @@
   R? visitGenericTypeAlias(GenericTypeAlias node) => visitNode(node);
 
   @override
+  R? visitHideClause(HideClause node) => visitNode(node);
+
+  @override
   R? visitHideCombinator(HideCombinator node) => visitNode(node);
 
   @override
@@ -3504,9 +3576,15 @@
   R? visitSetOrMapLiteral(SetOrMapLiteral node) => visitNode(node);
 
   @override
+  R? visitShowClause(ShowClause node) => visitNode(node);
+
+  @override
   R? visitShowCombinator(ShowCombinator node) => visitNode(node);
 
   @override
+  R? visitShowHideElement(ShowHideElement node) => visitNode(node);
+
+  @override
   R? visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index af436f5..a62d6d3 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3679,10 +3679,18 @@
   @override
   Token? typeKeyword;
 
+  /// The hide clause for the extension or `null` if the declaration does not
+  /// hide any elements.
+  HideClauseImpl? _hideClause;
+
   /// The name of the extension, or `null` if the extension does not have a
   /// name.
   SimpleIdentifierImpl? _name;
 
+  /// The show clause for the extension or `null` if the declaration does not
+  /// show any elements.
+  ShowClauseImpl? _showClause;
+
   /// The type parameters for the extension, or `null` if the extension does not
   /// have any type parameters.
   TypeParameterListImpl? _typeParameters;
@@ -3713,6 +3721,8 @@
       this._typeParameters,
       this.onKeyword,
       this._extendedType,
+      this._showClause,
+      this._hideClause,
       this.leftBracket,
       List<ClassMember> members,
       this.rightBracket)
@@ -3756,6 +3766,13 @@
   Token get firstTokenAfterCommentAndMetadata => extensionKeyword;
 
   @override
+  HideClauseImpl? get hideClause => _hideClause;
+
+  set hideClause(HideClause? hideClause) {
+    _hideClause = _becomeParentOf(hideClause as HideClauseImpl?);
+  }
+
+  @override
   NodeListImpl<ClassMember> get members => _members;
 
   @override
@@ -3766,6 +3783,13 @@
   }
 
   @override
+  ShowClauseImpl? get showClause => _showClause;
+
+  set showClause(ShowClause? showClause) {
+    _showClause = _becomeParentOf(showClause as ShowClauseImpl?);
+  }
+
+  @override
   TypeParameterListImpl? get typeParameters => _typeParameters;
 
   set typeParameters(TypeParameterList? typeParameters) {
@@ -5457,6 +5481,46 @@
   }
 }
 
+/// The "hide" clause in an extension declaration.
+///
+///    hideClause ::=
+///        'hide' [TypeName] (',' [TypeName])*
+class HideClauseImpl extends AstNodeImpl implements HideClause {
+  /// The token representing the 'hide' keyword.
+  @override
+  Token hideKeyword;
+
+  /// The elements that are being shown.
+  final NodeListImpl<ShowHideClauseElement> _elements = NodeListImpl._();
+
+  /// Initialize a newly created show clause.
+  HideClauseImpl(this.hideKeyword, List<ShowHideClauseElement> elements) {
+    _elements._initialize(this, elements);
+  }
+
+  @override
+  Token get beginToken => hideKeyword;
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => ChildEntities()
+    ..add(hideKeyword)
+    ..addAll(elements);
+
+  @override
+  NodeListImpl<ShowHideClauseElement> get elements => _elements;
+
+  @override
+  Token get endToken => _elements.endToken!;
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitHideClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _elements.accept(visitor);
+  }
+}
+
 /// A combinator that restricts the names being imported to those that are not
 /// in a given list.
 ///
@@ -8620,6 +8684,46 @@
   }
 }
 
+/// The "show" clause in an extension declaration.
+///
+///    showClause ::=
+///        'show' [TypeName] (',' [TypeName])*
+class ShowClauseImpl extends AstNodeImpl implements ShowClause {
+  /// The token representing the 'show' keyword.
+  @override
+  Token showKeyword;
+
+  /// The elements that are being shown.
+  final NodeListImpl<ShowHideClauseElement> _elements = NodeListImpl._();
+
+  /// Initialize a newly created show clause.
+  ShowClauseImpl(this.showKeyword, List<ShowHideClauseElement> elements) {
+    _elements._initialize(this, elements);
+  }
+
+  @override
+  Token get beginToken => showKeyword;
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => ChildEntities()
+    ..add(showKeyword)
+    ..addAll(elements);
+
+  @override
+  NodeListImpl<ShowHideClauseElement> get elements => _elements;
+
+  @override
+  Token get endToken => _elements.endToken!;
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitShowClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _elements.accept(visitor);
+  }
+}
+
 /// A combinator that restricts the names being imported to those in a given
 /// list.
 ///
@@ -8657,6 +8761,45 @@
   }
 }
 
+/// A potentially non-type element of a show or a hide clause.
+///
+///    showHideElement ::=
+///        'get' [SimpleIdentifier] |
+///        'set' [SimpleIdentifier] |
+///        'operator' [SimpleIdentifier] |
+///        [SimpleIdentifier]
+///
+/// Clients may not extend, implement or mix-in this class.
+class ShowHideElementImpl extends AstNodeImpl implements ShowHideElement {
+  @override
+  Token? modifier;
+
+  @override
+  SimpleIdentifier name;
+
+  ShowHideElementImpl(this.modifier, this.name) {
+    _becomeParentOf<SimpleIdentifierImpl>(name as SimpleIdentifierImpl);
+  }
+
+  @override
+  Token get beginToken => modifier ?? name.beginToken;
+
+  @override
+  Iterable<SyntacticEntity> get childEntities =>
+      ChildEntities()..addAll([if (modifier != null) modifier!, name]);
+
+  @override
+  Token get endToken => name.endToken;
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) => visitor.visitShowHideElement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    name.accept(visitor);
+  }
+}
+
 /// A simple formal parameter.
 ///
 ///    simpleFormalParameter ::=
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index bc7287e..0b36161 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -446,6 +446,8 @@
           TypeParameterList? typeParameters,
           required Token onKeyword,
           required TypeAnnotation extendedType,
+          ShowClause? showClause,
+          HideClause? hideClause,
           required Token leftBracket,
           required List<ClassMember> members,
           required Token rightBracket}) =>
@@ -458,6 +460,8 @@
           typeParameters as TypeParameterListImpl?,
           onKeyword,
           extendedType as TypeAnnotationImpl,
+          showClause as ShowClauseImpl?,
+          hideClause as HideClauseImpl?,
           leftBracket,
           members,
           rightBracket);
@@ -730,6 +734,12 @@
           semicolon);
 
   @override
+  HideClauseImpl hideClause(
+          {required Token hideKeyword,
+          required List<ShowHideClauseElement> elements}) =>
+      HideClauseImpl(hideKeyword, elements);
+
+  @override
   HideCombinatorImpl hideCombinator(
           Token keyword, List<SimpleIdentifier> hiddenNames) =>
       HideCombinatorImpl(keyword, hiddenNames);
@@ -1077,11 +1087,22 @@
           leftBracket, elements, rightBracket);
 
   @override
+  ShowClauseImpl showClause(
+          {required Token showKeyword,
+          required List<ShowHideClauseElement> elements}) =>
+      ShowClauseImpl(showKeyword, elements);
+
+  @override
   ShowCombinatorImpl showCombinator(
           Token keyword, List<SimpleIdentifier> shownNames) =>
       ShowCombinatorImpl(keyword, shownNames);
 
   @override
+  ShowHideElementImpl showHideElement(
+          {required Token? modifier, required SimpleIdentifier name}) =>
+      ShowHideElementImpl(modifier, name);
+
+  @override
   SimpleFormalParameterImpl simpleFormalParameter2(
           {Comment? comment,
           List<Annotation>? metadata,
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index b5929ae..1731023 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -368,6 +368,8 @@
     _visitToken(node.onKeyword);
     sink.write(' ');
     _visitNode(node.extendedType, suffix: ' ');
+    _visitNode(node.showClause, suffix: ' ');
+    _visitNode(node.hideClause, suffix: ' ');
     _visitToken(node.leftBracket);
     _visitNodeList(node.members, separator: ' ');
     _visitToken(node.rightBracket);
@@ -565,6 +567,12 @@
   }
 
   @override
+  void visitHideClause(HideClause node) {
+    sink.write('hide ');
+    _visitNodeList(node.elements, separator: ', ');
+  }
+
+  @override
   void visitHideCombinator(HideCombinator node) {
     sink.write('hide ');
     _visitNodeList(node.hiddenNames, separator: ', ');
@@ -870,12 +878,24 @@
   }
 
   @override
+  void visitShowClause(ShowClause node) {
+    sink.write('show ');
+    _visitNodeList(node.elements, separator: ', ');
+  }
+
+  @override
   void visitShowCombinator(ShowCombinator node) {
     sink.write('show ');
     _visitNodeList(node.shownNames, separator: ', ');
   }
 
   @override
+  void visitShowHideElement(ShowHideElement node) {
+    _visitToken(node.modifier, suffix: ' ');
+    _visitNode(node.name);
+  }
+
+  @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     _visitToken(node.requiredKeyword, suffix: ' ');
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index a40e33a..e066a65 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -677,6 +677,13 @@
   }
 
   @override
+  bool visitHideClause(HideClause node) {
+    HideClause other = _other as HideClause;
+    return isEqualTokens(node.hideKeyword, other.hideKeyword) &&
+        _isEqualNodeLists(node.elements, other.elements);
+  }
+
+  @override
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator other = _other as HideCombinator;
     return isEqualTokens(node.keyword, other.keyword) &&
@@ -1007,6 +1014,13 @@
   }
 
   @override
+  bool visitShowClause(ShowClause node) {
+    ShowClause other = _other as ShowClause;
+    return isEqualTokens(node.showKeyword, other.showKeyword) &&
+        _isEqualNodeLists(node.elements, other.elements);
+  }
+
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator other = _other as ShowCombinator;
     return isEqualTokens(node.keyword, other.keyword) &&
@@ -1014,6 +1028,13 @@
   }
 
   @override
+  bool visitShowHideElement(ShowHideElement node) {
+    ShowHideElement other = _other as ShowHideElement;
+    return isEqualTokens(node.modifier, other.modifier) &&
+        isEqualNodes(node.name, other.name);
+  }
+
+  @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter other = _other as SimpleFormalParameter;
     return isEqualNodes(
@@ -2257,6 +2278,14 @@
   }
 
   @override
+  bool visitHideClause(covariant HideClauseImpl node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitHideCombinator(covariant HideCombinatorImpl node) {
     if (_replaceInList(node.hiddenNames)) {
       return true;
@@ -2646,6 +2675,14 @@
   }
 
   @override
+  bool visitShowClause(covariant ShowClauseImpl node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitShowCombinator(covariant ShowCombinatorImpl node) {
     if (_replaceInList(node.shownNames)) {
       return true;
@@ -2654,6 +2691,15 @@
   }
 
   @override
+  bool visitShowHideElement(covariant ShowHideElementImpl node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
   bool visitSimpleFormalParameter(covariant SimpleFormalParameterImpl node) {
     if (identical(node.type, _oldNode)) {
       node.type = _newNode as TypeAnnotation;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 9968a05..75bd8ed 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -258,6 +258,8 @@
         _tmpSimpleIdentifier(),
         null,
       ), // extendedType is set in [endExtensionDeclaration]
+      showClause: null,
+      hideClause: null,
       leftBracket: Tokens.openCurlyBracket(),
       rightBracket: Tokens.closeCurlyBracket(),
       members: [],
@@ -1192,7 +1194,7 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token token) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token token) {
     if (typeKeyword != null && !enableExtensionTypes) {
       var feature = ExperimentalFeatures.extension_types;
       handleRecoverableError(
@@ -1203,11 +1205,29 @@
           typeKeyword,
           typeKeyword);
     }
+
+    if ((showKeyword != null || hideKeyword != null) && !enableExtensionTypes) {
+      var feature = ExperimentalFeatures.extension_types;
+      handleRecoverableError(
+          templateExperimentNotEnabled.withArguments(
+            feature.enableString,
+            _versionAsString(ExperimentStatus.currentVersion),
+          ),
+          (showKeyword ?? hideKeyword)!,
+          (showKeyword ?? hideKeyword)!);
+    }
+
+    ShowClause? showClause = pop(NullValue.ShowClause) as ShowClause?;
+    HideClause? hideClause = pop(NullValue.HideClause) as HideClause?;
+
     var type = pop() as TypeAnnotation;
+
     extensionDeclaration!
       ..extendedType = type
       ..onKeyword = onKeyword
-      ..typeKeyword = typeKeyword;
+      ..typeKeyword = typeKeyword
+      ..showClause = showClause
+      ..hideClause = hideClause;
     extensionDeclaration = null;
   }
 
@@ -2706,6 +2726,29 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    assert(optionalOrNull('hide', hideKeyword));
+    assert(optionalOrNull('show', showKeyword));
+    debugEvent("ExtensionShowHide");
+
+    HideClause? hideClause;
+    if (hideKeyword != null) {
+      var elements = popTypedList2<ShowHideClauseElement>(hideElementCount);
+      hideClause = ast.hideClause(hideKeyword: hideKeyword, elements: elements);
+    }
+
+    ShowClause? showClause;
+    if (showKeyword != null) {
+      var elements = popTypedList2<ShowHideClauseElement>(showElementCount);
+      showClause = ast.showClause(showKeyword: showKeyword, elements: elements);
+    }
+
+    push(hideClause ?? NullValue.HideClause);
+    push(showClause ?? NullValue.ShowClause);
+  }
+
+  @override
   void handleFinallyBlock(Token finallyKeyword) {
     debugEvent("FinallyBlock");
     // The finally block is popped in "endTryStatement".
@@ -3479,6 +3522,22 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    debugEvent("handleShowHideIdentifier");
+
+    assert(modifier == null ||
+        modifier.stringValue! == "get" ||
+        modifier.stringValue! == "set" ||
+        modifier.stringValue! == "operator");
+
+    SimpleIdentifier name = ast.simpleIdentifier(identifier);
+    ShowHideElement element =
+        ast.showHideElement(modifier: modifier, name: name);
+
+    push(element);
+  }
+
+  @override
   void handleSpreadExpression(Token spreadToken) {
     var expression = pop() as Expression;
     if (enableSpreadCollections) {
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 71aab4d..ed3e329 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -519,6 +519,8 @@
           required bool isExtensionTypeDeclaration,
           TypeParameterList? typeParameters,
           required TypeAnnotation extendedType,
+          ShowClause? showClause,
+          HideClause? hideClause,
           List<ClassMember> members = const []}) =>
       astFactory.extensionDeclaration(
           comment: null,
@@ -531,6 +533,8 @@
           typeParameters: typeParameters,
           onKeyword: TokenFactory.tokenFromKeyword(Keyword.ON),
           extendedType: extendedType,
+          showClause: showClause,
+          hideClause: hideClause,
           leftBracket: TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
           members: members,
           rightBracket:
@@ -720,6 +724,11 @@
           functionType,
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
+  static HideClauseImpl hideClause(List<ShowHideClauseElement> elements) =>
+      astFactory.hideClause(
+          hideKeyword: TokenFactory.tokenFromString("hide"),
+          elements: elements);
+
   static HideCombinatorImpl hideCombinator(
           List<SimpleIdentifier> identifiers) =>
       astFactory.hideCombinator(
@@ -1205,6 +1214,11 @@
         rightBracket: TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET),
       );
 
+  static ShowClauseImpl showClause(List<ShowHideClauseElement> elements) =>
+      astFactory.showClause(
+          showKeyword: TokenFactory.tokenFromString("show"),
+          elements: elements);
+
   static ShowCombinatorImpl showCombinator(
           List<SimpleIdentifier> identifiers) =>
       astFactory.showCombinator(
@@ -1214,6 +1228,24 @@
       astFactory.showCombinator(
           TokenFactory.tokenFromString("show"), identifierList(identifiers));
 
+  static ShowHideElementImpl showHideElement(String name) =>
+      astFactory.showHideElement(modifier: null, name: identifier3(name));
+
+  static ShowHideElementImpl showHideElementGetter(String name) =>
+      astFactory.showHideElement(
+          modifier: TokenFactory.tokenFromString("get"),
+          name: identifier3(name));
+
+  static ShowHideElementImpl showHideElementOperator(String name) =>
+      astFactory.showHideElement(
+          modifier: TokenFactory.tokenFromString("operator"),
+          name: identifier3(name));
+
+  static ShowHideElementImpl showHideElementSetter(String name) =>
+      astFactory.showHideElement(
+          modifier: TokenFactory.tokenFromString("set"),
+          name: identifier3(name));
+
   static SimpleFormalParameterImpl simpleFormalParameter(
           Keyword keyword, String parameterName) =>
       simpleFormalParameter2(keyword, null, parameterName);
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 52f9b94e..4269b08 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -342,6 +342,8 @@
     node.typeParameters?.accept(this);
     _token(node.onKeyword);
     node.extendedType.accept(this);
+    node.showClause?.accept(this);
+    node.hideClause?.accept(this);
     _token(node.leftBracket);
     node.members.accept(this);
     _token(node.rightBracket);
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 48ea92e..5d366e2 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -750,9 +750,9 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token token) {
-    super.endExtensionDeclaration(
-        extensionKeyword, typeKeyword, onKeyword, token);
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token token) {
+    super.endExtensionDeclaration(extensionKeyword, typeKeyword, onKeyword,
+        showKeyword, hideKeyword, token);
     end('ExtensionDeclaration');
   }
 
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 88e81b9..b14053b 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -895,6 +895,201 @@
             isExtensionTypeDeclaration: false));
   }
 
+  void test_visitExtensionDeclarationHideClause_empty() {
+    _assertSource(
+        'extension type E on C hide B {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            hideClause:
+                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationHideClause_multipleMember() {
+    _assertSource(
+        'extension type E on C hide B {var a; var b;}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            members: [
+              AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
+                  [AstTestFactory.variableDeclaration('a')]),
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
+            ],
+            hideClause:
+                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationHideClause_parameters() {
+    _assertSource(
+        'extension type E<T> on C hide B {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            typeParameters: AstTestFactory.typeParameterList(['T']),
+            extendedType: AstTestFactory.typeName4('C'),
+            hideClause:
+                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationHideClause_singleMember() {
+    _assertSource(
+        'extension type E on C hide B {var a;}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            members: [
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
+            ],
+            hideClause:
+                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_ambiguousElement() {
+    _assertSource(
+        'extension type E on C show foo {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause(
+                [AstTestFactory.showHideElement("foo")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_empty() {
+    _assertSource(
+        'extension type E on C show B {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause:
+                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_getterElement() {
+    _assertSource(
+        'extension type E on C show get foo {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause(
+                [AstTestFactory.showHideElementGetter("foo")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_multipleMember() {
+    _assertSource(
+        'extension type E on C show B {var a; var b;}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            members: [
+              AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
+                  [AstTestFactory.variableDeclaration('a')]),
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
+            ],
+            showClause:
+                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_operatorElement() {
+    _assertSource(
+        'extension type E on C show operator * {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause(
+                [AstTestFactory.showHideElementOperator("*")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_parameters() {
+    _assertSource(
+        'extension type E<T> on C show B {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            typeParameters: AstTestFactory.typeParameterList(['T']),
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause:
+                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_qualifiedTypeElement() {
+    _assertSource(
+        'extension type E on C show prefix.B {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause([
+              AstTestFactory.typeName3(
+                  AstTestFactory.identifier5('prefix', 'B'))
+            ]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_setterElement() {
+    _assertSource(
+        'extension type E on C show set foo {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause(
+                [AstTestFactory.showHideElementSetter("foo")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_singleMember() {
+    _assertSource(
+        'extension type E on C show B {var a;}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            members: [
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
+            ],
+            showClause:
+                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowClause_typeWithArgumentsElement() {
+    _assertSource(
+        'extension type E on C show B<int, String> {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause: AstTestFactory.showClause([
+              AstTestFactory.typeName3(AstTestFactory.identifier3('B'), [
+                AstTestFactory.typeName4('int'),
+                AstTestFactory.typeName4('String')
+              ])
+            ]),
+            isExtensionTypeDeclaration: true));
+  }
+
+  void test_visitExtensionDeclarationShowHideClause_empty() {
+    _assertSource(
+        'extension type E on C show B hide foo {}',
+        AstTestFactory.extensionDeclaration(
+            name: 'E',
+            extendedType: AstTestFactory.typeName4('C'),
+            showClause:
+                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+            hideClause: AstTestFactory.hideClause(
+                [AstTestFactory.showHideElement("foo")]),
+            isExtensionTypeDeclaration: true));
+  }
+
   void test_visitExtensionOverride_prefixedName_noTypeArgs() {
     _assertSource(
         'p.E(o)',
diff --git a/pkg/dds/lib/src/dap/adapters/dart.dart b/pkg/dds/lib/src/dap/adapters/dart.dart
index 5099eef..1343db2 100644
--- a/pkg/dds/lib/src/dap/adapters/dart.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart.dart
@@ -1654,10 +1654,18 @@
   /// enabling debugging.
   final bool? noDebug;
 
+  /// The program/Dart script to be run.
   final String program;
+
+  /// Arguments to be passed to [program].
   final List<String>? args;
+
+  /// Arguments to be passed to the tool that will run [program] (for example,
+  /// the VM or Flutter tool).
+  final List<String>? toolArgs;
+
   final int? vmServicePort;
-  final List<String>? vmAdditionalArgs;
+
   final bool? enableAsserts;
 
   /// Which console to run the program in.
@@ -1678,7 +1686,7 @@
     required this.program,
     this.args,
     this.vmServicePort,
-    this.vmAdditionalArgs,
+    this.toolArgs,
     this.console,
     this.enableAsserts,
     String? name,
@@ -1705,7 +1713,7 @@
         noDebug = obj['noDebug'] as bool?,
         program = obj['program'] as String,
         args = (obj['args'] as List?)?.cast<String>(),
-        vmAdditionalArgs = (obj['vmAdditionalArgs'] as List?)?.cast<String>(),
+        toolArgs = (obj['toolArgs'] as List?)?.cast<String>(),
         vmServicePort = obj['vmServicePort'] as int?,
         console = obj['console'] as String?,
         enableAsserts = obj['enableAsserts'] as bool?,
@@ -1718,7 +1726,7 @@
         if (noDebug != null) 'noDebug': noDebug,
         'program': program,
         if (args != null) 'args': args,
-        if (vmAdditionalArgs != null) 'vmAdditionalArgs': vmAdditionalArgs,
+        if (toolArgs != null) 'toolArgs': toolArgs,
         if (vmServicePort != null) 'vmServicePort': vmServicePort,
         if (console != null) 'console': console,
         if (enableAsserts != null) 'enableAsserts': enableAsserts,
diff --git a/pkg/dds/lib/src/dap/adapters/dart_cli.dart b/pkg/dds/lib/src/dap/adapters/dart_cli.dart
index bf0eab9..2a3f351 100644
--- a/pkg/dds/lib/src/dap/adapters/dart_cli.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart_cli.dart
@@ -10,25 +10,18 @@
 import 'package:pedantic/pedantic.dart';
 import 'package:vm_service/vm_service.dart' as vm;
 
-import '../exceptions.dart';
 import '../logging.dart';
 import '../protocol_generated.dart';
 import '../protocol_stream.dart';
 import 'dart.dart';
+import 'mixins.dart';
 
 /// A DAP Debug Adapter for running and debugging Dart CLI scripts.
 class DartCliDebugAdapter extends DartDebugAdapter<DartLaunchRequestArguments,
-    DartAttachRequestArguments> {
+        DartAttachRequestArguments>
+    with PidTracker, VmServiceInfoFileUtils, PackageConfigUtils {
   Process? _process;
 
-  /// Process IDs to terminate during shutdown.
-  ///
-  /// This may be populated with pids from the VM Service to ensure we clean up
-  /// properly where signals may not be passed through the shell to the
-  /// underlying VM process.
-  /// https://github.com/Dart-Code/Dart-Code/issues/907
-  final pidsToTerminate = <int>{};
-
   @override
   final parseLaunchArgs = DartLaunchRequestArguments.fromJson;
 
@@ -75,45 +68,7 @@
   /// Called by [disconnectRequest] to request that we forcefully shut down the
   /// app being run (or in the case of an attach, disconnect).
   Future<void> disconnectImpl() async {
-    // TODO(dantup): In Dart-Code DAP, we first try again with sigint and wait
-    // for a few seconds before sending sigkill.
-    pidsToTerminate.forEach(
-      (pid) => Process.killPid(pid, ProcessSignal.sigkill),
-    );
-  }
-
-  /// Waits for [vmServiceInfoFile] to exist and become valid before returning
-  /// the VM Service URI contained within.
-  Future<Uri> waitForVmServiceInfoFile(File vmServiceInfoFile) async {
-    final completer = Completer<Uri>();
-    late final StreamSubscription<FileSystemEvent> vmServiceInfoFileWatcher;
-
-    Uri? tryParseServiceInfoFile(FileSystemEvent event) {
-      final uri = _readVmServiceInfoFile(vmServiceInfoFile);
-      if (uri != null && !completer.isCompleted) {
-        vmServiceInfoFileWatcher.cancel();
-        completer.complete(uri);
-      }
-    }
-
-    vmServiceInfoFileWatcher = vmServiceInfoFile.parent
-        .watch(events: FileSystemEvent.all)
-        .where((event) => event.path == vmServiceInfoFile.path)
-        .listen(
-          tryParseServiceInfoFile,
-          onError: (e) => logger?.call('Ignoring exception from watcher: $e'),
-        );
-
-    // After setting up the watcher, also check if the file already exists to
-    // ensure we don't miss it if it was created right before we set the
-    // watched up.
-    final uri = _readVmServiceInfoFile(vmServiceInfoFile);
-    if (uri != null && !completer.isCompleted) {
-      unawaited(vmServiceInfoFileWatcher.cancel());
-      completer.complete(uri);
-    }
-
-    return completer.future;
+    terminatePids(ProcessSignal.sigkill);
   }
 
   /// Called by [launchRequest] to request that we actually start the app to be
@@ -128,25 +83,15 @@
 
     final debug = !(args.noDebug ?? false);
     if (debug) {
-      // Create a temp folder for the VM to write the service-info-file into.
-      // Using tmpDir.createTempory() is flakey on Windows+Linux (at least
-      // on GitHub Actions) complaining the file does not exist when creating a
-      // watcher. Creating/watching a folder and writing the file into it seems
-      // to be reliable.
-      final serviceInfoFilePath = path.join(
-        Directory.systemTemp.createTempSync('dart-vm-service').path,
-        'vm.json',
-      );
-
-      vmServiceInfoFile = File(serviceInfoFilePath);
-      unawaited(waitForVmServiceInfoFile(vmServiceInfoFile)
+      vmServiceInfoFile = generateVmServiceInfoFile();
+      unawaited(waitForVmServiceInfoFile(logger, vmServiceInfoFile)
           .then((uri) => connectDebugger(uri, resumeIfStarting: true)));
     }
 
     final vmArgs = <String>[
       if (debug) ...[
         '--enable-vm-service=${args.vmServicePort ?? 0}${ipv6 ? '/::1' : ''}',
-        '--pause_isolates_on_start=true',
+        '--pause_isolates_on_start',
         if (!enableAuthCodes) '--disable-service-auth-codes'
       ],
       '--disable-dart-dev',
@@ -156,10 +101,11 @@
       ],
       // Default to asserts on, this seems like the most useful behaviour for
       // editor-spawned debug sessions.
-      if (args.enableAsserts ?? true) '--enable-asserts'
+      if (args.enableAsserts ?? true) '--enable-asserts',
     ];
     final processArgs = [
       ...vmArgs,
+      ...?args.toolArgs,
       args.program,
       ...?args.args,
     ];
@@ -171,7 +117,7 @@
     var possibleRoot = path.isAbsolute(args.program)
         ? path.dirname(args.program)
         : path.dirname(path.normalize(path.join(args.cwd ?? '', args.program)));
-    final packageConfig = _findPackageConfigFile(possibleRoot);
+    final packageConfig = findPackageConfigFile(possibleRoot);
     if (packageConfig != null) {
       this.usePackageConfigFile(packageConfig);
     }
@@ -209,9 +155,12 @@
     final vmServiceInfoFile = args.vmServiceInfoFile;
 
     if ((vmServiceUri == null) == (vmServiceInfoFile == null)) {
-      throw DebugAdapterException(
-        'To attach, provide exactly one of vmServiceUri/vmServiceInfoFile',
+      sendOutput(
+        'console',
+        '\nTo attach, provide exactly one of vmServiceUri/vmServiceInfoFile',
       );
+      handleSessionTerminate();
+      return;
     }
 
     // Find the package_config file for this script.
@@ -220,7 +169,7 @@
     //   necessary.
     final cwd = args.cwd;
     if (cwd != null) {
-      final packageConfig = _findPackageConfigFile(cwd);
+      final packageConfig = findPackageConfigFile(cwd);
       if (packageConfig != null) {
         this.usePackageConfigFile(packageConfig);
       }
@@ -228,7 +177,7 @@
 
     final uri = vmServiceUri != null
         ? Uri.parse(vmServiceUri)
-        : await waitForVmServiceInfoFile(File(vmServiceInfoFile!));
+        : await waitForVmServiceInfoFile(logger, File(vmServiceInfoFile!));
 
     unawaited(connectDebugger(uri, resumeIfStarting: false));
   }
@@ -297,42 +246,10 @@
     unawaited(process.exitCode.then(_handleExitCode));
   }
 
-  /// Find the `package_config.json` file for the program being launched.
-  ///
-  /// TODO(dantup): Remove this once
-  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-  ///   necessary.
-  File? _findPackageConfigFile(String possibleRoot) {
-    File? packageConfig;
-    while (true) {
-      packageConfig =
-          File(path.join(possibleRoot, '.dart_tool', 'package_config.json'));
-
-      // If this packageconfig exists, use it.
-      if (packageConfig.existsSync()) {
-        break;
-      }
-
-      final parent = path.dirname(possibleRoot);
-
-      // If we can't go up anymore, the search failed.
-      if (parent == possibleRoot) {
-        packageConfig = null;
-        break;
-      }
-
-      possibleRoot = parent;
-    }
-
-    return packageConfig;
-  }
-
   /// Called by [terminateRequest] to request that we gracefully shut down the
   /// app being run (or in the case of an attach, disconnect).
   Future<void> terminateImpl() async {
-    pidsToTerminate.forEach(
-      (pid) => Process.killPid(pid, ProcessSignal.sigint),
-    );
+    terminatePids(ProcessSignal.sigint);
     await _process?.exitCode;
   }
 
@@ -349,19 +266,4 @@
   void _handleStdout(List<int> data) {
     sendOutput('stdout', utf8.decode(data));
   }
-
-  /// Attempts to read VM Service info from a watcher event.
-  ///
-  /// If successful, returns the URI. Otherwise, returns null.
-  Uri? _readVmServiceInfoFile(File file) {
-    try {
-      final content = file.readAsStringSync();
-      final json = jsonDecode(content);
-      return Uri.parse(json['uri']);
-    } catch (e) {
-      // It's possible we tried to read the file before it was completely
-      // written so ignore and try again on the next event.
-      logger?.call('Ignoring error parsing vm-service-info file: $e');
-    }
-  }
 }
diff --git a/pkg/dds/lib/src/dap/adapters/mixins.dart b/pkg/dds/lib/src/dap/adapters/mixins.dart
new file mode 100644
index 0000000..8c73716
--- /dev/null
+++ b/pkg/dds/lib/src/dap/adapters/mixins.dart
@@ -0,0 +1,139 @@
+// 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.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:pedantic/pedantic.dart';
+
+import '../logging.dart';
+
+/// A mixin providing some utility functions for locating/working with
+/// package_config.json files.
+mixin PackageConfigUtils {
+  /// Find the `package_config.json` file for the program being launched.
+  ///
+  /// TODO(dantup): Remove this once
+  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
+  ///   necessary.
+  File? findPackageConfigFile(String possibleRoot) {
+    File? packageConfig;
+    while (true) {
+      packageConfig =
+          File(path.join(possibleRoot, '.dart_tool', 'package_config.json'));
+
+      // If this packageconfig exists, use it.
+      if (packageConfig.existsSync()) {
+        break;
+      }
+
+      final parent = path.dirname(possibleRoot);
+
+      // If we can't go up anymore, the search failed.
+      if (parent == possibleRoot) {
+        packageConfig = null;
+        break;
+      }
+
+      possibleRoot = parent;
+    }
+
+    return packageConfig;
+  }
+}
+
+/// A mixin for tracking additional PIDs that can be shut down at the end of a
+/// debug session.
+mixin PidTracker {
+  /// Process IDs to terminate during shutdown.
+  ///
+  /// This may be populated with pids from the VM Service to ensure we clean up
+  /// properly where signals may not be passed through the shell to the
+  /// underlying VM process.
+  /// https://github.com/Dart-Code/Dart-Code/issues/907
+  final pidsToTerminate = <int>{};
+
+  /// Terminates all processes with the PIDs registered in [pidsToTerminate].
+  void terminatePids(ProcessSignal signal) {
+    // TODO(dantup): In Dart-Code DAP, we first try again with sigint and wait
+    // for a few seconds before sending sigkill.
+    pidsToTerminate.forEach(
+      (pid) => Process.killPid(pid, signal),
+    );
+  }
+}
+
+/// A mixin providing some utility functions for working with vm-service-info
+/// files such as ensuring a temp folder exists to create them in, and waiting
+/// for the file to become valid parsable JSON.
+mixin VmServiceInfoFileUtils {
+  /// Creates a temp folder for the VM to write the service-info-file into and
+  /// returns the [File] to use.
+  File generateVmServiceInfoFile() {
+    // Using tmpDir.createTempory() is flakey on Windows+Linux (at least
+    // on GitHub Actions) complaining the file does not exist when creating a
+    // watcher. Creating/watching a folder and writing the file into it seems
+    // to be reliable.
+    final serviceInfoFilePath = path.join(
+      Directory.systemTemp.createTempSync('dart-vm-service').path,
+      'vm.json',
+    );
+
+    return File(serviceInfoFilePath);
+  }
+
+  /// Waits for [vmServiceInfoFile] to exist and become valid before returning
+  /// the VM Service URI contained within.
+  Future<Uri> waitForVmServiceInfoFile(
+    Logger? logger,
+    File vmServiceInfoFile,
+  ) async {
+    final completer = Completer<Uri>();
+    late final StreamSubscription<FileSystemEvent> vmServiceInfoFileWatcher;
+
+    Uri? tryParseServiceInfoFile(FileSystemEvent event) {
+      final uri = _readVmServiceInfoFile(logger, vmServiceInfoFile);
+      if (uri != null && !completer.isCompleted) {
+        vmServiceInfoFileWatcher.cancel();
+        completer.complete(uri);
+      }
+    }
+
+    vmServiceInfoFileWatcher = vmServiceInfoFile.parent
+        .watch(events: FileSystemEvent.all)
+        .where((event) => event.path == vmServiceInfoFile.path)
+        .listen(
+          tryParseServiceInfoFile,
+          onError: (e) => logger?.call('Ignoring exception from watcher: $e'),
+        );
+
+    // After setting up the watcher, also check if the file already exists to
+    // ensure we don't miss it if it was created right before we set the
+    // watched up.
+    final uri = _readVmServiceInfoFile(logger, vmServiceInfoFile);
+    if (uri != null && !completer.isCompleted) {
+      unawaited(vmServiceInfoFileWatcher.cancel());
+      completer.complete(uri);
+    }
+
+    return completer.future;
+  }
+
+  /// Attempts to read VM Service info from a watcher event.
+  ///
+  /// If successful, returns the URI. Otherwise, returns null.
+  Uri? _readVmServiceInfoFile(Logger? logger, File file) {
+    try {
+      final content = file.readAsStringSync();
+      final json = jsonDecode(content);
+      return Uri.parse(json['uri']);
+    } catch (e) {
+      // It's possible we tried to read the file before it was completely
+      // written so ignore and try again on the next event.
+      logger?.call('Ignoring error parsing vm-service-info file: $e');
+    }
+  }
+}
diff --git a/pkg/dds/lib/src/dap/protocol_generated.dart b/pkg/dds/lib/src/dap/protocol_generated.dart
index 30620e4..a39f56f 100644
--- a/pkg/dds/lib/src/dap/protocol_generated.dart
+++ b/pkg/dds/lib/src/dap/protocol_generated.dart
@@ -4,8 +4,8 @@
 
 // This code was auto-generated by tool/dap/generate_all.dart - do not hand-edit!
 
-import 'package:dds/src/dap/protocol_common.dart';
-import 'package:dds/src/dap/protocol_special.dart';
+import 'protocol_common.dart';
+import 'protocol_special.dart';
 
 /// Arguments for 'attach' request. Additional attributes are implementation
 /// specific.
diff --git a/pkg/dds/test/dap/integration/test_support.dart b/pkg/dds/test/dap/integration/test_support.dart
index 4c804c6..a8cbd0f 100644
--- a/pkg/dds/test/dap/integration/test_support.dart
+++ b/pkg/dds/test/dap/integration/test_support.dart
@@ -88,7 +88,7 @@
   vmArgs ??= [];
   vmArgs.addAll([
     '--enable-vm-service=0',
-    '--pause_isolates_on_start=true',
+    '--pause_isolates_on_start',
   ]);
   final processArgs = [
     ...vmArgs,
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 6a57d1d..ef7f461 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -618,9 +618,15 @@
     if (trackNeededDillLibraries) {
       // Which dill builders were built?
       neededDillLibraries = new Set<Library>();
+
+      // Propagate data from constant evaluator: Libraries used in the constant
+      // evaluator - that comes from dill - are marked.
+      Set<Library> librariesUsedByConstantEvaluator = userCode!.librariesUsed;
+
       for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder) {
-          if (builder.isBuiltAndMarked) {
+          if (builder.isBuiltAndMarked ||
+              librariesUsedByConstantEvaluator.contains(builder.library)) {
             neededDillLibraries!.add(builder.library);
           }
         }
@@ -2396,6 +2402,7 @@
     implements ChangedStructureNotifier {
   Set<Class>? classHierarchyChanges;
   Set<Class>? classMemberChanges;
+  Set<Library> librariesUsed = {};
 
   IncrementalKernelTarget(FileSystem fileSystem, bool includeComments,
       DillTarget dillTarget, UriTranslator uriTranslator)
@@ -2415,4 +2422,9 @@
     classHierarchyChanges ??= <Class>{};
     classHierarchyChanges!.add(cls);
   }
+
+  @override
+  void markLibrariesUsed(Set<Library> visitedLibraries) {
+    librariesUsed.addAll(visitedLibraries);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 329190f..3484b81 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -82,7 +82,7 @@
   return component;
 }
 
-ConstantCoverage transformLibraries(
+ConstantEvaluationData transformLibraries(
     List<Library> libraries,
     ConstantsBackend backend,
     Map<String, String>? environmentDefines,
@@ -118,7 +118,10 @@
   for (final Library library in libraries) {
     constantsTransformer.convertLibrary(library);
   }
-  return constantsTransformer.constantEvaluator.getConstantCoverage();
+
+  return new ConstantEvaluationData(
+      constantsTransformer.constantEvaluator.getConstantCoverage(),
+      constantsTransformer.constantEvaluator.visitedLibraries);
 }
 
 void transformProcedure(
@@ -911,6 +914,8 @@
   final BoolConstant trueConstant = new BoolConstant(true);
   final BoolConstant falseConstant = new BoolConstant(false);
 
+  final Set<Library> visitedLibraries = {};
+
   InstanceBuilder? instanceBuilder;
   EvaluationEnvironment env;
   Set<Expression> replacementNodes = new Set<Expression>.identity();
@@ -2835,6 +2840,7 @@
   Constant visitStaticGet(StaticGet node) {
     return withNewEnvironment(() {
       final Member target = node.target;
+      visitedLibraries.add(target.enclosingLibrary);
       if (target is Field) {
         if (target.isConst) {
           return _evaluateExpressionInContext(target, target.initializer!);
@@ -4028,6 +4034,13 @@
   ConstantCoverage(this.constructorCoverage);
 }
 
+class ConstantEvaluationData {
+  final ConstantCoverage coverage;
+  final Set<Library> visitedLibraries;
+
+  ConstantEvaluationData(this.coverage, this.visitedLibraries);
+}
+
 /// Holds the necessary information for a constant object, namely
 ///   * the [klass] being instantiated
 ///   * the [typeArguments] used for the instantiation
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 f38b46b..a4ccfdf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -80,7 +80,8 @@
         EvaluationMode,
         transformLibraries,
         transformProcedure,
-        ConstantCoverage;
+        ConstantCoverage,
+        ConstantEvaluationData;
 import 'kernel_constants.dart' show KernelConstantErrorReporter;
 import 'kernel_helper.dart';
 import 'verifier.dart' show verifyComponent, verifyGetStaticType;
@@ -1230,23 +1231,27 @@
         new TypeEnvironment(loader.coreTypes, loader.hierarchy);
     constants.EvaluationMode evaluationMode = _getConstantEvaluationMode();
 
-    constants.ConstantCoverage coverage = constants.transformLibraries(
-        loader.libraries,
-        backendTarget.constantsBackend(loader.coreTypes),
-        environmentDefines,
-        environment,
-        new KernelConstantErrorReporter(loader),
-        evaluationMode,
-        evaluateAnnotations: true,
-        enableTripleShift:
-            isExperimentEnabledGlobally(ExperimentalFlag.tripleShift),
-        enableConstFunctions:
-            isExperimentEnabledGlobally(ExperimentalFlag.constFunctions),
-        enableConstructorTearOff:
-            isExperimentEnabledGlobally(ExperimentalFlag.constructorTearoffs),
-        errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
+    constants.ConstantEvaluationData constantEvaluationData =
+        constants.transformLibraries(
+            loader.libraries,
+            backendTarget.constantsBackend(loader.coreTypes),
+            environmentDefines,
+            environment,
+            new KernelConstantErrorReporter(loader),
+            evaluationMode,
+            evaluateAnnotations: true,
+            enableTripleShift:
+                isExperimentEnabledGlobally(ExperimentalFlag.tripleShift),
+            enableConstFunctions:
+                isExperimentEnabledGlobally(ExperimentalFlag.constFunctions),
+            enableConstructorTearOff: isExperimentEnabledGlobally(
+                ExperimentalFlag.constructorTearoffs),
+            errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
     ticker.logMs("Evaluated constants");
 
+    markLibrariesUsed(constantEvaluationData.visitedLibraries);
+
+    constants.ConstantCoverage coverage = constantEvaluationData.coverage;
     coverage.constructorCoverage.forEach((Uri fileUri, Set<Reference> value) {
       Source? source = uriToSource[fileUri];
       // ignore: unnecessary_null_comparison
@@ -1387,6 +1392,10 @@
   void releaseAncillaryResources() {
     component = null;
   }
+
+  void markLibrariesUsed(Set<Library> visitedLibraries) {
+    // Default implementation does nothing.
+  }
 }
 
 /// Looks for a constructor call that matches `super()` from a constructor in
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index fb22647..2a08cd3 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -862,6 +862,12 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token? identifier) {
+    debugEvent("");
+    // Do nothing
+  }
+
+  @override
   void beginClassOrMixinBody(DeclarationKind kind, Token token) {
     assert(checkState(token, [
       ValueKinds.Token,
@@ -928,7 +934,7 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     debugEvent("endExtensionDeclaration");
     checkEmpty(extensionKeyword.charOffset);
   }
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 c1ac2cf..1666eb8 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -328,6 +328,30 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    debugEvent("ShowHideIdentifier");
+
+    assert(modifier == null ||
+        modifier.stringValue! == "get" ||
+        modifier.stringValue! == "set" ||
+        modifier.stringValue! == "operator");
+
+    if (modifier == null) {
+      handleIdentifier(
+          identifier, IdentifierContext.extensionShowHideElementMemberOrType);
+    } else if (modifier.stringValue! == "get") {
+      handleIdentifier(
+          identifier, IdentifierContext.extensionShowHideElementGetter);
+    } else if (modifier.stringValue! == "set") {
+      handleIdentifier(
+          identifier, IdentifierContext.extensionShowHideElementSetter);
+    } else if (modifier.stringValue! == "operator") {
+      handleIdentifier(
+          identifier, IdentifierContext.extensionShowHideElementOperator);
+    }
+  }
+
+  @override
   void handleIdentifier(Token token, IdentifierContext context) {
     if (context == IdentifierContext.enumValueDeclaration) {
       debugEvent("handleIdentifier");
@@ -337,6 +361,16 @@
       } else {
         push(new EnumConstantInfo(metadata, token.lexeme, token.charOffset));
       }
+    } else if (context == IdentifierContext.extensionShowHideElementGetter ||
+        context == IdentifierContext.extensionShowHideElementMemberOrType ||
+        context == IdentifierContext.extensionShowHideElementSetter) {
+      push(context);
+      super.handleIdentifier(token, context);
+      push(token.charOffset);
+    } else if (context == IdentifierContext.extensionShowHideElementOperator) {
+      push(context);
+      push(operatorFromString(token.stringValue!));
+      push(token.charOffset);
     } else {
       super.handleIdentifier(token, context);
       push(token.charOffset);
@@ -492,9 +526,22 @@
   void beginClassOrMixinBody(DeclarationKind kind, Token token) {
     if (kind == DeclarationKind.Extension) {
       assert(checkState(token, [
+        /* hide type elements = */ ValueKinds.TypeBuilderListOrNull,
+        /* hide get elements = */ ValueKinds.NameListOrNull,
+        /* hide member or type elements = */ ValueKinds.NameListOrNull,
+        /* hide set elements = */ ValueKinds.NameListOrNull,
+        /* hide operator elements = */ ValueKinds.OperatorListOrNull,
+        /* show type elements = */ ValueKinds.TypeBuilderListOrNull,
+        /* show get elements = */ ValueKinds.NameListOrNull,
+        /* show member or type elements = */ ValueKinds.NameListOrNull,
+        /* show set elements */ ValueKinds.NameListOrNull,
+        /* show operator elements*/ ValueKinds.OperatorListOrNull,
         unionOfKinds([ValueKinds.ParserRecovery, ValueKinds.TypeBuilder])
       ]));
-      Object? extensionThisType = peek();
+
+      // We peek into 10th frame on the stack for the extension 'this' type.
+      Object? extensionThisType = stack[10];
+
       if (extensionThisType is TypeBuilder) {
         libraryBuilder.currentTypeParameterScopeBuilder
             .registerExtensionThisType(extensionThisType);
@@ -533,6 +580,75 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    debugEvent("ExtensionShow");
+
+    List<dynamic> toBePushed = <dynamic>[];
+    void handleShowHideElements(int elementCount) {
+      if (elementCount == 0) {
+        toBePushed.add(NullValue.TypeBuilderList);
+        toBePushed.add(NullValue.IdentifierList);
+        toBePushed.add(NullValue.IdentifierList);
+        toBePushed.add(NullValue.IdentifierList);
+        toBePushed.add(NullValue.OperatorList);
+      } else {
+        List<TypeBuilder> typeElements = <TypeBuilder>[];
+        List<String> getElements = <String>[];
+        List<String> ambiguousMemberOrTypeElements = <String>[];
+        List<String> setElements = <String>[];
+        List<Operator> operatorElements = <Operator>[];
+
+        for (int i = 0; i < elementCount; ++i) {
+          Object leadingElementPart = pop()!;
+          if (leadingElementPart is TypeBuilder) {
+            typeElements.add(leadingElementPart);
+          } else {
+            leadingElementPart as int; // Offset.
+            Object name = pop()!;
+            IdentifierContext context = pop() as IdentifierContext;
+
+            if (name is! ParserRecovery) {
+              assert(context ==
+                      IdentifierContext.extensionShowHideElementGetter ||
+                  context ==
+                      IdentifierContext.extensionShowHideElementMemberOrType ||
+                  context ==
+                      IdentifierContext.extensionShowHideElementOperator ||
+                  context == IdentifierContext.extensionShowHideElementSetter);
+
+              if (context == IdentifierContext.extensionShowHideElementGetter) {
+                getElements.add(name as String);
+              } else if (context ==
+                  IdentifierContext.extensionShowHideElementMemberOrType) {
+                ambiguousMemberOrTypeElements.add(name as String);
+              } else if (context ==
+                  IdentifierContext.extensionShowHideElementOperator) {
+                operatorElements.add(name as Operator);
+              } else if (context ==
+                  IdentifierContext.extensionShowHideElementSetter) {
+                setElements.add(name as String);
+              }
+            }
+          }
+        }
+
+        toBePushed.add(typeElements);
+        toBePushed.add(getElements);
+        toBePushed.add(ambiguousMemberOrTypeElements);
+        toBePushed.add(setElements);
+        toBePushed.add(operatorElements);
+      }
+    }
+
+    handleShowHideElements(hideElementCount);
+    handleShowHideElements(showElementCount);
+    for (int i = toBePushed.length - 1; i >= 0; --i) {
+      push(toBePushed[i]);
+    }
+  }
+
+  @override
   void handleRecoverClassHeader() {
     debugEvent("handleRecoverClassHeader");
     // TODO(jensj): Possibly use these instead... E.g. "class A extend B {}"
@@ -774,8 +890,18 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     assert(checkState(extensionKeyword, [
+      /* hide type elements = */ ValueKinds.TypeBuilderListOrNull,
+      /* hide get elements = */ ValueKinds.NameListOrNull,
+      /* hide member or type elements = */ ValueKinds.NameListOrNull,
+      /* hide set elements = */ ValueKinds.NameListOrNull,
+      /* hide operator elements = */ ValueKinds.OperatorListOrNull,
+      /* show type elements = */ ValueKinds.TypeBuilderListOrNull,
+      /* show get elements = */ ValueKinds.NameListOrNull,
+      /* show member or type elements = */ ValueKinds.NameListOrNull,
+      /* show set elements = */ ValueKinds.NameListOrNull,
+      /* show operator elements = */ ValueKinds.OperatorListOrNull,
       unionOfKinds([ValueKinds.ParserRecovery, ValueKinds.TypeBuilder]),
       ValueKinds.TypeVariableListOrNull,
       ValueKinds.Integer,
@@ -783,6 +909,23 @@
       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.
+    if (showKeyword != null && !libraryBuilder.enableExtensionTypesInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('extension-types',
+              libraryBuilder.enableExtensionTypesVersionInLibrary.toText()),
+          showKeyword.charOffset,
+          showKeyword.length);
+    }
     Object? onType = pop();
     if (onType is ParserRecovery) {
       ParserRecovery parserRecovery = onType;
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index 6f24626..85426fc 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -75,6 +75,8 @@
   static const ValueKind ModifiersOrNull =
       const SingleValueKind<List<type.Modifier>>(NullValue.Modifiers);
   static const ValueKind Name = const SingleValueKind<String>();
+  static const ValueKind NameListOrNull =
+      const SingleValueKind<List<String>>(NullValue.IdentifierList);
   static const ValueKind NameOrNull =
       const SingleValueKind<String>(NullValue.Name);
   static const ValueKind NameOrOperator =
@@ -87,6 +89,8 @@
       const SingleValueKind<List<type.MetadataBuilder>>(NullValue.Metadata);
   static const ValueKind ObjectList = const SingleValueKind<List<Object>>();
   static const ValueKind Operator = const SingleValueKind<type.Operator>();
+  static const ValueKind OperatorListOrNull =
+      const SingleValueKind<List<type.Operator>>(NullValue.OperatorList);
   static const ValueKind ParserRecovery =
       const SingleValueKind<type.ParserRecovery>();
   static const ValueKind ProblemBuilder =
@@ -94,8 +98,7 @@
   static const ValueKind QualifiedName =
       const SingleValueKind<type.QualifiedName>();
   static const ValueKind Scope = const SingleValueKind<type.Scope>();
-  static const ValueKind Selector =
-      const SingleValueKind<type.Selector>();
+  static const ValueKind Selector = const SingleValueKind<type.Selector>();
   static const ValueKind SwitchScopeOrNull =
       const SingleValueKind<type.Scope>(NullValue.SwitchScope);
   static const ValueKind Statement = const SingleValueKind<type.Statement>();
@@ -114,6 +117,8 @@
       const SingleValueKind<type.TypeBuilder>();
   static const ValueKind TypeBuilderOrNull =
       const SingleValueKind<type.TypeBuilder>(NullValue.Type);
+  static const ValueKind TypeBuilderListOrNull =
+      const SingleValueKind<List<type.TypeBuilder>>(NullValue.TypeBuilderList);
   static const ValueKind TypeVariableListOrNull =
       const SingleValueKind<List<type.TypeVariableBuilder>>(
           NullValue.TypeVariables);
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
index 1b9883e..8c34151 100644
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
@@ -216,6 +216,19 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    DirectParserASTContentExtensionShowHideHandle data =
+        new DirectParserASTContentExtensionShowHideHandle(
+            DirectParserASTType.HANDLE,
+            showKeyword: showKeyword,
+            showElementCount: showElementCount,
+            hideKeyword: hideKeyword,
+            hideElementCount: hideElementCount);
+    seen(data);
+  }
+
+  @override
   void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     DirectParserASTContentClassHeaderHandle data =
         new DirectParserASTContentClassHeaderHandle(DirectParserASTType.HANDLE,
@@ -311,13 +324,15 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     DirectParserASTContentExtensionDeclarationEnd data =
         new DirectParserASTContentExtensionDeclarationEnd(
             DirectParserASTType.END,
             extensionKeyword: extensionKeyword,
             typeKeyword: typeKeyword,
             onKeyword: onKeyword,
+            showKeyword: showKeyword,
+            hideKeyword: hideKeyword,
             endToken: endToken);
     seen(data);
   }
@@ -2314,6 +2329,16 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    DirectParserASTContentShowHideIdentifierHandle data =
+        new DirectParserASTContentShowHideIdentifierHandle(
+            DirectParserASTType.HANDLE,
+            modifier: modifier,
+            identifier: identifier);
+    seen(data);
+  }
+
+  @override
   void handleIndexedExpression(
       Token? question, Token openSquareBracket, Token closeSquareBracket) {
     DirectParserASTContentIndexedExpressionHandle data =
@@ -3157,6 +3182,29 @@
       };
 }
 
+class DirectParserASTContentExtensionShowHideHandle
+    extends DirectParserASTContent {
+  final Token? showKeyword;
+  final int showElementCount;
+  final Token? hideKeyword;
+  final int hideElementCount;
+
+  DirectParserASTContentExtensionShowHideHandle(DirectParserASTType type,
+      {this.showKeyword,
+      required this.showElementCount,
+      this.hideKeyword,
+      required this.hideElementCount})
+      : super("ExtensionShowHide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+        "showElementCount": showElementCount,
+        "hideKeyword": hideKeyword,
+        "hideElementCount": hideElementCount,
+      };
+}
+
 class DirectParserASTContentClassHeaderHandle extends DirectParserASTContent {
   final Token begin;
   final Token classKeyword;
@@ -3317,12 +3365,16 @@
   final Token extensionKeyword;
   final Token? typeKeyword;
   final Token onKeyword;
+  final Token? showKeyword;
+  final Token? hideKeyword;
   final Token endToken;
 
   DirectParserASTContentExtensionDeclarationEnd(DirectParserASTType type,
       {required this.extensionKeyword,
       this.typeKeyword,
       required this.onKeyword,
+      this.showKeyword,
+      this.hideKeyword,
       required this.endToken})
       : super("ExtensionDeclaration", type);
 
@@ -3331,6 +3383,8 @@
         "extensionKeyword": extensionKeyword,
         "typeKeyword": typeKeyword,
         "onKeyword": onKeyword,
+        "showKeyword": showKeyword,
+        "hideKeyword": hideKeyword,
         "endToken": endToken,
       };
 }
@@ -6627,6 +6681,22 @@
       };
 }
 
+class DirectParserASTContentShowHideIdentifierHandle
+    extends DirectParserASTContent {
+  final Token? modifier;
+  final Token identifier;
+
+  DirectParserASTContentShowHideIdentifierHandle(DirectParserASTType type,
+      {this.modifier, required this.identifier})
+      : super("ShowHideIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "modifier": modifier,
+        "identifier": identifier,
+      };
+}
+
 class DirectParserASTContentIndexedExpressionHandle
     extends DirectParserASTContent {
   final Token? question;
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index fe35178..3392abe 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -805,7 +805,7 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     classStartToChunk[extensionKeyword] =
         new _ExtensionDeclarationChunk(extensionKeyword, endToken);
   }
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
index 58a0949..ec1dd0c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
@@ -31,6 +31,7 @@
         handleType(T, null)
       endTypeArguments(1, <, >)
       handleType(List, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(bool)
         endMetadataStar(0)
@@ -108,7 +109,7 @@
           endExtensionMethod(set, set, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 3, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration(void)
   beginMetadataStar(void)
   endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
index 0a0206e..0244778 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
@@ -31,6 +31,7 @@
         listener: handleType(T, null)
         listener: endTypeArguments(1, <, >)
         listener: handleType(List, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Extension, E)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, bool)
@@ -172,7 +173,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 3, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration(void)
   parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
     parseMetadataStar(})
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
index a502ee7..96b6956 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
@@ -22,6 +22,7 @@
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(method)
         endMetadataStar(0)
@@ -39,7 +40,7 @@
           endExtensionMethod(null, method, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration(test)
   beginMetadataStar(test)
   endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
index dc87b68..c5f52cb 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
@@ -43,6 +43,7 @@
         listener: handleIdentifier(A, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(A, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(A, DeclarationKind.Extension, type)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, method)
@@ -79,7 +80,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration(test)
   parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
     parseMetadataStar(})
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.expect b/pkg/front_end/parser_testcases/extension_type.dart.expect
index c759acc..1efa3c2 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.expect
@@ -22,8 +22,9 @@
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
       endClassOrMixinBody(DeclarationKind.Extension, 0, {, })
-    endExtensionDeclaration(extension, type, on, })
+    endExtensionDeclaration(extension, type, on, null, null, })
   endTopLevelDeclaration()
 endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
index c8f125d..2272376 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
@@ -43,11 +43,12 @@
         listener: handleIdentifier(A, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(A, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(A, DeclarationKind.Extension, E)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 0, {, })
-        listener: endExtensionDeclaration(extension, type, on, })
+        listener: endExtensionDeclaration(extension, type, on, null, null, })
   listener: endTopLevelDeclaration()
   reportAllErrorTokens(class)
   listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
index 3cc233a..f6e44b8 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
@@ -45,6 +45,7 @@
       handleIdentifier(C, typeReference)
       handleNoTypeArguments({)
       handleType(C, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(addChild)
         endMetadataStar(0)
@@ -72,6 +73,6 @@
           endExtensionMethod(null, addChild, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration()
 endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
index b493885..f04b161 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
@@ -74,6 +74,7 @@
         listener: handleIdentifier(C, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(C, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
@@ -124,7 +125,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration()
   reportAllErrorTokens(class)
   listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
index b6adb53..23440f4 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
@@ -39,6 +39,7 @@
       handleIdentifier(C, typeReference)
       handleNoTypeArguments({)
       handleType(C, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(addChild)
         endMetadataStar(0)
@@ -65,6 +66,6 @@
           endExtensionMethod(null, addChild, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration()
 endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
index 333ccf1..8735e12 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
@@ -74,6 +74,7 @@
         listener: handleIdentifier(C, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(C, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
@@ -122,7 +123,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration()
   reportAllErrorTokens(class)
   listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.expect b/pkg/front_end/parser_testcases/extensions/static.dart.expect
index 568639a..5147f20 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.expect
@@ -39,6 +39,7 @@
       handleIdentifier(C, typeReference)
       handleNoTypeArguments({)
       handleType(C, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(static)
         endMetadataStar(0)
@@ -65,6 +66,6 @@
           endExtensionMethod(null, static, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration()
 endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
index f91d314..560c41b 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
@@ -74,6 +74,7 @@
         listener: handleIdentifier(C, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(C, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
@@ -121,7 +122,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration()
   reportAllErrorTokens(class)
   listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
index 1e1a39a..b4a4c33 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
@@ -45,6 +45,7 @@
       handleIdentifier(C, typeReference)
       handleNoTypeArguments({)
       handleType(C, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(static)
         endMetadataStar(0)
@@ -72,6 +73,6 @@
           endExtensionMethod(null, static, (, null, })
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration()
 endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
index c1ae5d5..3e0aba8 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
@@ -74,6 +74,7 @@
         listener: handleIdentifier(C, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(C, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
@@ -123,7 +124,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 1, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration()
   reportAllErrorTokens(class)
   listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
index 616d7b4..3a34750 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
@@ -7,6 +7,7 @@
       handleIdentifier(Symbol, typeReference)
       handleNoTypeArguments({)
       handleType(Symbol, null)
+      handleExtensionShowHide(null, 0, null, 0)
       beginClassOrMixinBody(DeclarationKind.Extension, {)
         beginMetadataStar(String)
         endMetadataStar(0)
@@ -59,7 +60,7 @@
           endExtensionMethod(null, String, (, null, ;)
         endMember()
       endClassOrMixinBody(DeclarationKind.Extension, 2, {, })
-    endExtensionDeclaration(extension, null, on, })
+    endExtensionDeclaration(extension, null, on, null, null, })
   endTopLevelDeclaration(void)
   beginMetadataStar(void)
   endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
index aea9af2..3e7a724 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
@@ -15,6 +15,7 @@
         listener: handleIdentifier(Symbol, typeReference)
         listener: handleNoTypeArguments({)
         listener: handleType(Symbol, null)
+        listener: handleExtensionShowHide(null, 0, null, 0)
         parseClassOrMixinOrExtensionBody(Symbol, DeclarationKind.Extension, null)
           listener: beginClassOrMixinBody(DeclarationKind.Extension, {)
           notEofOrValue(}, String)
@@ -122,7 +123,7 @@
             listener: endMember()
           notEofOrValue(}, })
           listener: endClassOrMixinBody(DeclarationKind.Extension, 2, {, })
-        listener: endExtensionDeclaration(extension, null, on, })
+        listener: endExtensionDeclaration(extension, null, on, null, null, })
   listener: endTopLevelDeclaration(void)
   parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
     parseMetadataStar(})
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index 51801fd..2f68e15f 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -299,8 +299,12 @@
   checkIsEqual(normalDillData, initializedDillData);
 }
 
-Future<Map<String, List<int>>> createModules(Map module,
-    final List<int> sdkSummaryData, Target target, String sdkSummary) async {
+Future<Map<String, List<int>>> createModules(
+    Map module,
+    final List<int> sdkSummaryData,
+    Target target,
+    Target originalTarget,
+    String sdkSummary) async {
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummaryUri = base.resolve(sdkSummary);
 
@@ -332,6 +336,10 @@
         moduleSources.add(uri);
       }
     }
+    bool outlineOnly = false;
+    if (originalTarget is DevCompilerTarget) {
+      outlineOnly = true;
+    }
     CompilerOptions options =
         getOptions(target: target, sdkSummary: sdkSummary);
     options.fileSystem = fs;
@@ -345,8 +353,8 @@
     if (packagesUri != null) {
       options.packagesFileUri = packagesUri;
     }
-    TestIncrementalCompiler compiler =
-        new TestIncrementalCompiler(options, moduleSources.first, null);
+    TestIncrementalCompiler compiler = new TestIncrementalCompiler(
+        options, moduleSources.first, /* initializeFrom = */ null, outlineOnly);
     Component c = await compiler.computeDelta(entryPoints: moduleSources);
     c.computeCanonicalNames();
     List<Library> wantedLibs = <Library>[];
@@ -416,6 +424,7 @@
         throw "Unknown target name '$targetName'";
       }
     }
+    Target originalTarget = target;
     target = new TestTargetWrapper(target, targetFlags);
 
     String sdkSummary = computePlatformDillName(
@@ -442,8 +451,8 @@
     Map<String, Component>? moduleComponents;
 
     if (modules != null) {
-      moduleData =
-          await createModules(modules, sdkSummaryData, target, sdkSummary);
+      moduleData = await createModules(
+          modules, sdkSummaryData, target, originalTarget, sdkSummary);
       sdk = newestWholeComponent = new Component();
       new BinaryBuilder(sdkSummaryData,
               filename: null, disableLazyReading: false)
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index 1a797be..4d45463 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -223,6 +223,18 @@
   }
 
   @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    seen(showKeyword);
+    seen(hideKeyword);
+    doPrint('handleExtensionShowHide('
+        '$showKeyword, '
+        '$showElementCount, '
+        '$hideKeyword, '
+        '$hideElementCount)');
+  }
+
+  @override
   void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     seen(begin);
     seen(classKeyword);
@@ -300,16 +312,20 @@
 
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token endToken) {
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
     indent--;
     seen(extensionKeyword);
     seen(typeKeyword);
     seen(onKeyword);
+    seen(showKeyword);
+    seen(hideKeyword);
     seen(endToken);
     doPrint('endExtensionDeclaration('
         '$extensionKeyword, '
         '$typeKeyword, '
         '$onKeyword, '
+        '$showKeyword, '
+        '$hideKeyword, '
         '$endToken)');
   }
 
@@ -2084,6 +2100,13 @@
   }
 
   @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    seen(modifier);
+    seen(identifier);
+    doPrint('handleShowHideIdentifier(' '$modifier, ' '$identifier)');
+  }
+
+  @override
   void handleIndexedExpression(
       Token? question, Token openSquareBracket, Token closeSquareBracket) {
     seen(question);
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 73be42a..2ee0aa7 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -3156,6 +3156,7 @@
 unaliased
 unaliasing
 unambiguous
+unambiguously
 unary
 unassignable
 unassigned
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart b/pkg/front_end/testcases/extension_types/basic_show.dart
new file mode 100644
index 0000000..c4f310b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart
@@ -0,0 +1,17 @@
+// 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.
+
+extension E1 on int show num {} // Ok.
+
+extension E2 on int {} // Ok.
+
+extension E3 on int show {} // Error.
+
+extension E4 on int show num, Comparable {} // Ok.
+
+extension E5 on int show num, {} // Error.
+
+extension E6 on int show , num {} // Error.
+
+main() {}
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
new file mode 100644
index 0000000..2777045
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int {
+}
+extension E5 on core::int {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic {}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..2777045
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int {
+}
+extension E5 on core::int {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.textual_outline.expect
new file mode 100644
index 0000000..63b59b8
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+extension E1 on int show num {}
+extension E2 on int {}
+extension E3 on int show {}
+extension E4 on int show num, Comparable {}
+extension E5 on int show num, {}
+extension E6 on int show , {}
+num (){}
+main() {}
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
new file mode 100644
index 0000000..2777045
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int {
+}
+extension E5 on core::int {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic {}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..cabf277
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.outline.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int {
+}
+extension E5 on core::int {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic
+  ;
+static method main() → dynamic
+  ;
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
new file mode 100644
index 0000000..2777045
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int {
+}
+extension E5 on core::int {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart
new file mode 100644
index 0000000..1caf93a
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart
@@ -0,0 +1,13 @@
+// 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 {
+  void mixin() {}
+  void as() {}
+}
+
+extension type E1 on A show mixin, as {}
+extension type E2 on A hide mixin, as {}
+
+main() {}
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
new file mode 100644
index 0000000..02b44ca
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method mixin() → void {}
+  method as() → void {}
+}
+extension type E1 on self::A {
+}
+extension type E2 on self::A {
+}
+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
new file mode 100644
index 0000000..02b44ca
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method mixin() → void {}
+  method as() → void {}
+}
+extension type E1 on self::A {
+}
+extension type E2 on self::A {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.textual_outline.expect
new file mode 100644
index 0000000..b36dba8
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+class A {
+  void mixin() {}
+  void as() {}
+}
+extension type E1 on A show mixin, as {}
+extension type E2 on A hide mixin, as {}
+main() {}
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
new file mode 100644
index 0000000..02b44ca
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method mixin() → void {}
+  method as() → void {}
+}
+extension type E1 on self::A {
+}
+extension type E2 on self::A {
+}
+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
new file mode 100644
index 0000000..4149c70
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  method mixin() → void
+    ;
+  method as() → void
+    ;
+}
+extension type E1 on self::A {
+}
+extension type E2 on self::A {
+}
+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
new file mode 100644
index 0000000..02b44ca
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method mixin() → void {}
+  method as() → void {}
+}
+extension type E1 on self::A {
+}
+extension type E2 on self::A {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart
new file mode 100644
index 0000000..0b39bde
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart
@@ -0,0 +1,33 @@
+// 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 I1<X, Y> {}
+
+class I2<X, Y, Z> {}
+
+class A {}
+
+class B extends A implements I1<int, int> {
+  void methodB() {}
+  void methodB2() {}
+  int get getterB => throw 42;
+  void set setterB(int value) {}
+  B operator *(B other) => throw 42;
+}
+
+class C extends B {}
+
+class D extends C implements I2<int, int, int> {
+  void methodD() {}
+  int get getterD => throw 42;
+  void set setterD(int value) {}
+  D operator +(D other) => throw 42;
+}
+
+extension type E on D
+  show C, I2<int, int, int>, methodD, get getterD, set setterD, operator +
+  hide A, I1<int, int>, methodB, methodB2, get getterB, set setterB, operator *
+  {}
+
+main() {}
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
new file mode 100644
index 0000000..a545388
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    : super core::Object::•()
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method methodB() → void {}
+  method methodB2() → void {}
+  get getterB() → core::int
+    return throw 42;
+  set setterB(core::int value) → void {}
+  operator *(self::B other) → self::B
+    return throw 42;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method methodD() → void {}
+  get getterD() → core::int
+    return throw 42;
+  set setterD(core::int value) → void {}
+  operator +(self::D other) → self::D
+    return throw 42;
+}
+extension type E on self::D {
+}
+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
new file mode 100644
index 0000000..a545388
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    : super core::Object::•()
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method methodB() → void {}
+  method methodB2() → void {}
+  get getterB() → core::int
+    return throw 42;
+  set setterB(core::int value) → void {}
+  operator *(self::B other) → self::B
+    return throw 42;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method methodD() → void {}
+  get getterD() → core::int
+    return throw 42;
+  set setterD(core::int value) → void {}
+  operator +(self::D other) → self::D
+    return throw 42;
+}
+extension type E on self::D {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.textual_outline.expect
new file mode 100644
index 0000000..fe1d85f
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.textual_outline.expect
@@ -0,0 +1,19 @@
+class I1<X, Y> {}
+class I2<X, Y, Z> {}
+class A {}
+class B extends A implements I1<int, int> {
+  void methodB() {}
+  void methodB2() {}
+  int get getterB => throw 42;
+  void set setterB(int value) {}
+  B operator *(B other) => throw 42;
+}
+class C extends B {}
+class D extends C implements I2<int, int, int> {
+  void methodD() {}
+  int get getterD => throw 42;
+  void set setterD(int value) {}
+  D operator +(D other) => throw 42;
+}
+extension type E on D show C, I2<int, int, int>, methodD, get getterD, set setterD, operator + hide A, I1<int, int>, methodB, methodB2, get getterB, set setterB, operator * {}
+main() {}
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
new file mode 100644
index 0000000..a545388
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    : super core::Object::•()
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method methodB() → void {}
+  method methodB2() → void {}
+  get getterB() → core::int
+    return throw 42;
+  set setterB(core::int value) → void {}
+  operator *(self::B other) → self::B
+    return throw 42;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method methodD() → void {}
+  get getterD() → core::int
+    return throw 42;
+  set setterD(core::int value) → void {}
+  operator +(self::D other) → self::D
+    return throw 42;
+}
+extension type E on self::D {
+}
+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
new file mode 100644
index 0000000..37477da
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.outline.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    ;
+  method methodB() → void
+    ;
+  method methodB2() → void
+    ;
+  get getterB() → core::int
+    ;
+  set setterB(core::int value) → void
+    ;
+  operator *(self::B other) → self::B
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    ;
+  method methodD() → void
+    ;
+  get getterD() → core::int
+    ;
+  set setterD(core::int value) → void
+    ;
+  operator +(self::D other) → self::D
+    ;
+}
+extension type E on self::D {
+}
+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
new file mode 100644
index 0000000..a545388
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.transformed.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    : super core::Object::•()
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method methodB() → void {}
+  method methodB2() → void {}
+  get getterB() → core::int
+    return throw 42;
+  set setterB(core::int value) → void {}
+  operator *(self::B other) → self::B
+    return throw 42;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method methodD() → void {}
+  get getterD() → core::int
+    return throw 42;
+  set setterD(core::int value) → void {}
+  operator +(self::D other) → self::D
+    return throw 42;
+}
+extension type E on self::D {
+}
+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 cfd32eb..534644b 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
@@ -2,99 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {}
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:25: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension type MyInt on int show num, isEven hide floor {
-//                         ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: Expected ';' after this.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:34: Error: 'num' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                  ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Context: Previous declaration of 'num'.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: 'isEven' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Context: Previous declaration of 'isEven'.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:51: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension type MyInt on int show num, isEven hide floor {
-//                                                   ^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {}
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:29: Error: Type 'show' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                             ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:46: Error: Type 'hide' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                                              ^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:9:3: Error: Undefined name 'e2'.
 //   e2.floor(); // Ok.
 //   ^^
@@ -109,10 +16,6 @@
 //   e1.isEven; // Error.
 //      ^^^^^^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {}
-//                     ^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
 // Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
 //   e2.ceil(); // Error.
@@ -138,28 +41,6 @@
 //   e3.isEven; // Error.
 //      ^^^^^^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:29: Error: 'show' isn't a type.
-// extension type MyInt on int show num, isEven hide floor {
-//                             ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:7: Error: Expected ';' after this.
-//   int get twice => 2 * this;
-//       ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   int get twice => 2 * this;
-//                 ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:24: Error: Expected identifier, but got 'this'.
-//   int get twice => 2 * this;
-//                        ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:34:5: Error: The getter 'twice' isn't defined for the extension 'MyInt'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'twice'.
-//   m.twice; // OK, in the extension type.
-//     ^^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:35:5: Error: The getter 'isEven' isn't defined for the extension 'MyInt'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
 //   m.isEven; // OK, a shown instance member.
@@ -185,8 +66,8 @@
 extension E3 on core::int {
 }
 extension type MyInt on core::int {
+  get twice = self::MyInt|get#twice;
 }
-static method num() → invalid-type {}
 static method test1(self::E1 e1) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:8:6: Error: The method 'ceil' isn't defined for the extension 'E1'.
 Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
@@ -200,7 +81,6 @@
   e1.isEven; // Error.
      ^^^^^^" in e1{<unresolved>}.isEven;
 }
-static method ceil() → invalid-type {}
 static method test2(self::E2 e2) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
 Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
@@ -215,7 +95,6 @@
   e2.isEven; // Error.
      ^^^^^^" in e2{<unresolved>}.isEven;
 }
-static method isEven() → invalid-type {}
 static method test3(self::E3 e3) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:24:6: Error: The getter 'isOdd' isn't defined for the extension 'E3'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'isOdd'.
@@ -226,19 +105,11 @@
   e3.isEven; // Error.
      ^^^^^^" in e3{<unresolved>}.isEven;
 }
-static method floor() → invalid-type {
-  core::int get;
-  function twice() → core::double
-    return 2.{core::num::*}(invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:24: Error: Expected identifier, but got 'this'.
-  int get twice => 2 * this;
-                       ^^^^"){(core::num) → core::double};
-}
+static method MyInt|get#twice(lowered final core::int #this) → core::int
+  return 2.{core::num::*}(#this){(core::num) → core::int};
 static method test() → dynamic {
   self::MyInt m = 42;
-  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:34:5: Error: The getter 'twice' isn't defined for the extension 'MyInt'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'twice'.
-  m.twice; // OK, in the extension type.
-    ^^^^^" in m{<unresolved>}.twice;
+  self::MyInt|get#twice(m);
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:35:5: Error: The getter 'isEven' isn't defined for the extension 'MyInt'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
   m.isEven; // OK, a shown instance member.
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.textual_outline.expect
index 6296476..ab59429 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.textual_outline.expect
@@ -1,15 +1,11 @@
-extension E1 on int {}
-show num (){}
+extension E1 on int show num {}
 test1(E1 e1) {}
-extension E2 on int {}
-show num ;
-hide ceil (){}
+extension E2 on int show num hide ceil {}
 test2(E2 e2) {}
-extension E3 on int {}
-hide isEven (){}
+extension E3 on int hide isEven {}
 test3(E3 e3) {}
-extension type MyInt on int {}
-show num, isEven ;
-hide floor (){}
+extension type MyInt on int show num, isEven hide floor {
+  int get twice => 2 * this;
+}
 test() {}
 main() {}
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 cfd32eb..534644b 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
@@ -2,99 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {}
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:25: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension type MyInt on int show num, isEven hide floor {
-//                         ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: Expected ';' after this.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:34: Error: 'num' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                  ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Context: Previous declaration of 'num'.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: 'isEven' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Context: Previous declaration of 'isEven'.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:51: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension type MyInt on int show num, isEven hide floor {
-//                                                   ^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {}
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:29: Error: Type 'show' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                             ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:46: Error: Type 'hide' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                                              ^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:9:3: Error: Undefined name 'e2'.
 //   e2.floor(); // Ok.
 //   ^^
@@ -109,10 +16,6 @@
 //   e1.isEven; // Error.
 //      ^^^^^^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {}
-//                     ^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
 // Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
 //   e2.ceil(); // Error.
@@ -138,28 +41,6 @@
 //   e3.isEven; // Error.
 //      ^^^^^^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:29: Error: 'show' isn't a type.
-// extension type MyInt on int show num, isEven hide floor {
-//                             ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:7: Error: Expected ';' after this.
-//   int get twice => 2 * this;
-//       ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   int get twice => 2 * this;
-//                 ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:24: Error: Expected identifier, but got 'this'.
-//   int get twice => 2 * this;
-//                        ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:34:5: Error: The getter 'twice' isn't defined for the extension 'MyInt'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'twice'.
-//   m.twice; // OK, in the extension type.
-//     ^^^^^
-//
 // pkg/front_end/testcases/extension_types/simple_show_hide.dart:35:5: Error: The getter 'isEven' isn't defined for the extension 'MyInt'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
 //   m.isEven; // OK, a shown instance member.
@@ -185,8 +66,8 @@
 extension E3 on core::int {
 }
 extension type MyInt on core::int {
+  get twice = self::MyInt|get#twice;
 }
-static method num() → invalid-type {}
 static method test1(self::E1 e1) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:8:6: Error: The method 'ceil' isn't defined for the extension 'E1'.
 Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
@@ -200,7 +81,6 @@
   e1.isEven; // Error.
      ^^^^^^" in e1{<unresolved>}.isEven;
 }
-static method ceil() → invalid-type {}
 static method test2(self::E2 e2) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
 Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
@@ -215,7 +95,6 @@
   e2.isEven; // Error.
      ^^^^^^" in e2{<unresolved>}.isEven;
 }
-static method isEven() → invalid-type {}
 static method test3(self::E3 e3) → dynamic {
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:24:6: Error: The getter 'isOdd' isn't defined for the extension 'E3'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'isOdd'.
@@ -226,19 +105,11 @@
   e3.isEven; // Error.
      ^^^^^^" in e3{<unresolved>}.isEven;
 }
-static method floor() → invalid-type {
-  core::int get;
-  function twice() → core::double
-    return 2.{core::num::*}(invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:29:24: Error: Expected identifier, but got 'this'.
-  int get twice => 2 * this;
-                       ^^^^"){(core::num) → core::double};
-}
+static method MyInt|get#twice(lowered final core::int #this) → core::int
+  return 2.{core::num::*}(#this){(core::num) → core::int};
 static method test() → dynamic {
   self::MyInt m = 42;
-  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:34:5: Error: The getter 'twice' isn't defined for the extension 'MyInt'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'twice'.
-  m.twice; // OK, in the extension type.
-    ^^^^^" in m{<unresolved>}.twice;
+  self::MyInt|get#twice(m);
   invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:35:5: Error: The getter 'isEven' isn't defined for the extension 'MyInt'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
   m.isEven; // OK, a shown instance member.
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 7a2b050..6962dcb 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
@@ -1,100 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {}
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {}
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:25: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension type MyInt on int show num, isEven hide floor {
-//                         ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: Expected ';' after this.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:34: Error: 'num' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                  ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:26: Context: Previous declaration of 'num'.
-// extension E2 on int show num hide ceil {}
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:39: Error: 'isEven' is already declared in this scope.
-// extension type MyInt on int show num, isEven hide floor {
-//                                       ^^^^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:26: Context: Previous declaration of 'isEven'.
-// extension E3 on int hide isEven {}
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:51: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension type MyInt on int show num, isEven hide floor {
-//                                                   ^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:13:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {}
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:21:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {}
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:29: Error: Type 'show' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                             ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide.dart:28:46: Error: Type 'hide' not found.
-// extension type MyInt on int show num, isEven hide floor {
-//                                              ^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -105,20 +9,15 @@
 extension E3 on core::int {
 }
 extension type MyInt on core::int {
+  get twice = self::MyInt|get#twice;
 }
-static method num() → invalid-type
-  ;
 static method test1(self::E1 e1) → dynamic
   ;
-static method ceil() → invalid-type
-  ;
 static method test2(self::E2 e2) → dynamic
   ;
-static method isEven() → invalid-type
-  ;
 static method test3(self::E3 e3) → dynamic
   ;
-static method floor() → invalid-type
+static method MyInt|get#twice(lowered final core::int #this) → core::int
   ;
 static method test() → 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 b62bef7..8129aa4 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
@@ -2,140 +2,58 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Error.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Ok.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int floor() {} // Error.
-//   ^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Error: Expected ';' after this.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:18: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isOdd => throw 42; // Error.
-//                  ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Context: Previous declaration of 'get'.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: Expected ';' after this.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:19: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isEven => throw 42; // Ok.
-//                   ^^
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 extension E1 on core::int {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
 }
 extension E2 on core::int {
+  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 {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
 }
-static method num() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method ceil() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Ok.
-  ^" in null;
-  }
-  function floor() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+      ^" in null;
+}
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int floor() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method isEven() → invalid-type {
-  core::bool get;
-  function isOdd() → Never
-    return throw 42;
-  core::bool get = invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-  bool get isEven => throw 42; // Ok.
-       ^^^";
-  function isEven() → Never
-    return throw 42;
-}
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  return throw 42;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
+  return throw 42;
 static method main() → dynamic {}
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 b62bef7..8129aa4 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
@@ -2,140 +2,58 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Error.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Ok.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int floor() {} // Error.
-//   ^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Error: Expected ';' after this.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:18: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isOdd => throw 42; // Error.
-//                  ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Context: Previous declaration of 'get'.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: Expected ';' after this.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:19: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isEven => throw 42; // Ok.
-//                   ^^
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 extension E1 on core::int {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
 }
 extension E2 on core::int {
+  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 {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
 }
-static method num() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method ceil() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Ok.
-  ^" in null;
-  }
-  function floor() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+      ^" in null;
+}
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int floor() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method isEven() → invalid-type {
-  core::bool get;
-  function isOdd() → Never
-    return throw 42;
-  core::bool get = invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-  bool get isEven => throw 42; // Ok.
-       ^^^";
-  function isEven() → Never
-    return throw 42;
-}
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  return throw 42;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
+  return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.textual_outline.expect
index b92215c..89838f5 100644
--- a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.textual_outline.expect
@@ -1,13 +1,12 @@
-extension E1 on int {}
-
-show num() {}
-
-extension E2 on int {}
-
-show num;
-hide ceil() {}
-
-extension E3 on int {}
-
-hide isEven() {}
+extension E1 on int show num {
+  int ceil() {}
+}
+extension E2 on int show num hide ceil {
+  int ceil() {}
+  int floor() {}
+}
+extension E3 on int hide isEven {
+  bool get isOdd => throw 42;
+  bool get isEven => throw 42;
+}
 main() {}
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 b62bef7..8129aa4 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
@@ -2,140 +2,58 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Error.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Ok.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int floor() {} // Error.
-//   ^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Error: Expected ';' after this.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:18: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isOdd => throw 42; // Error.
-//                  ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Context: Previous declaration of 'get'.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: Expected ';' after this.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:19: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isEven => throw 42; // Ok.
-//                   ^^
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 extension E1 on core::int {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
 }
 extension E2 on core::int {
+  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 {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
 }
-static method num() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method ceil() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Ok.
-  ^" in null;
-  }
-  function floor() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+      ^" in null;
+}
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int floor() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method isEven() → invalid-type {
-  core::bool get;
-  function isOdd() → Never
-    return throw 42;
-  core::bool get = invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-  bool get isEven => throw 42; // Ok.
-       ^^^";
-  function isEven() → Never
-    return throw 42;
-}
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  return throw 42;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
+  return throw 42;
 static method main() → dynamic {}
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 5c68071..db64d10 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
@@ -1,78 +1,36 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {
-//                     ^^^^
-//
 import self as self;
 import "dart:core" as core;
 
 extension E1 on core::int {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
 }
 extension E2 on core::int {
+  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 {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
 }
-static method num() → invalid-type
+static method E1|ceil(lowered final core::int #this) → core::int
   ;
-static method ceil() → invalid-type
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int
   ;
-static method isEven() → invalid-type
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int
+  ;
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  ;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
   ;
 static method main() → dynamic
   ;
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 b62bef7..8129aa4 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
@@ -2,140 +2,58 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E1 on int show num {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E2 on int show num hide ceil {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: Expected ';' after this.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:26: Error: 'num' is already declared in this scope.
-// extension E2 on int show num hide ceil {
-//                          ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:26: Context: Previous declaration of 'num'.
-// extension E1 on int show num {
-//                          ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:35: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E2 on int show num hide ceil {
-//                                   ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:17: Error: A extension declaration must have a body, even if it is empty.
-// Try adding an empty body.
-// extension E3 on int hide isEven {
-//                 ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:26: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E3 on int hide isEven {
-//                          ^^^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:5:21: Error: Type 'show' not found.
-// extension E1 on int show num {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: Type 'show' not found.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:30: Error: Type 'hide' not found.
-// extension E2 on int show num hide ceil {
-//                              ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:14:21: Error: Type 'hide' not found.
-// extension E3 on int hide isEven {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Error.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:9:21: Error: 'show' isn't a type.
-// extension E2 on int show num hide ceil {
-//                     ^^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int ceil() {} // Ok.
-//   ^
+//       ^
 //
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
 //   int floor() {} // Error.
-//   ^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Error: Expected ';' after this.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:18: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isOdd => throw 42; // Error.
-//                  ^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:16:8: Context: Previous declaration of 'get'.
-//   bool get isOdd => throw 42; // Error.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: Expected ';' after this.
-//   bool get isEven => throw 42; // Ok.
-//        ^^^
-//
-// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:19: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   bool get isEven => throw 42; // Ok.
-//                   ^^
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 extension E1 on core::int {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
 }
 extension E2 on core::int {
+  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 {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
 }
-static method num() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method ceil() → invalid-type {
-  function ceil() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int ceil() {} // Ok.
-  ^" in null;
-  }
-  function floor() → core::int {
-    return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+      ^" in null;
+}
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
   int floor() {} // Error.
-  ^" in null;
-  }
+      ^" in null;
 }
-static method isEven() → invalid-type {
-  core::bool get;
-  function isOdd() → Never
-    return throw 42;
-  core::bool get = invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:17:8: Error: 'get' is already declared in this scope.
-  bool get isEven => throw 42; // Ok.
-       ^^^";
-  function isEven() → Never
-    return throw 42;
-}
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  return throw 42;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
+  return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart b/pkg/front_end/testcases/extension_types/various_hide_elements.dart
new file mode 100644
index 0000000..cd041cd
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart
@@ -0,0 +1,32 @@
+// 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.
+
+import 'dart:core' as prefixedCore;
+import 'dart:core';
+
+extension type E0 on int hide operator * {}
+extension type E1 on int hide get isEven {}
+extension type E2<T> on List<T> hide set length {}
+extension type E3 on int hide num {}
+extension type E4 on List<int> hide prefixedCore.Iterable<int> {} // Error?
+extension type E5 on List hide prefixedCore.Iterable {} // Error?
+extension type E6 on List<int> hide Iterable<int> {}
+
+abstract class A {
+  A operator *(A other);
+}
+
+class B<X> implements A {
+  bool get foo => throw 42;
+  A operator *(A other) => throw 42;
+}
+
+class C extends B<int> {
+  void set bar(int value) {}
+  void baz() {}
+}
+
+extension type E on C hide A, B<int>, operator *, get foo, set bar, baz {}
+
+main() {}
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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.textual_outline.expect
new file mode 100644
index 0000000..fbcacbf
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+import 'dart:core' as prefixedCore;
+import 'dart:core';
+extension type E0 on int hide operator * {}
+extension type E1 on int hide get isEven {}
+extension type E2<T> on List<T> hide set length {}
+extension type E3 on int hide num {}
+extension type E4 on List<int> hide prefixedCore.Iterable<int> {}
+extension type E5 on List hide prefixedCore.Iterable {}
+extension type E6 on List<int> hide Iterable<int> {}
+abstract class A {
+  A operator *(A other);
+}
+class B<X> implements A {
+  bool get foo => throw 42;
+  A operator *(A other) => throw 42;
+}
+class C extends B<int> {
+  void set bar(int value) {}
+  void baz() {}
+}
+extension type E on C hide A, B<int>, operator *, get foo, set bar, baz {}
+main() {}
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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..4a47ac5
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.outline.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+  get foo() → core::bool
+    ;
+  operator *(self::A other) → self::A
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    ;
+  set bar(core::int value) → void
+    ;
+  method baz() → void
+    ;
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart b/pkg/front_end/testcases/extension_types/various_show_elements.dart
new file mode 100644
index 0000000..1588d78a
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart
@@ -0,0 +1,32 @@
+// 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.
+
+import 'dart:core' as prefixedCore;
+import 'dart:core';
+
+extension type E0 on int show operator * {}
+extension type E1 on int show get isEven {}
+extension type E2<T> on List<T> show set length {}
+extension type E3 on int show num {}
+extension type E4 on List<int> show prefixedCore.Iterable<int> {} // Error?
+extension type E5 on List show prefixedCore.Iterable {} // Error?
+extension type E6 on List<int> show Iterable<int> {}
+
+abstract class A {
+  A operator *(A other);
+}
+
+class B<X> implements A {
+  bool get foo => throw 42;
+  A operator *(A other) => throw 42;
+}
+
+class C extends B<int> {
+  void set bar(int value) {}
+  void baz() {}
+}
+
+extension type E on C show A, B<int>, operator *, get foo, set bar, baz {}
+
+main() {}
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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.textual_outline.expect
new file mode 100644
index 0000000..dcd8445
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+import 'dart:core' as prefixedCore;
+import 'dart:core';
+extension type E0 on int show operator * {}
+extension type E1 on int show get isEven {}
+extension type E2<T> on List<T> show set length {}
+extension type E3 on int show num {}
+extension type E4 on List<int> show prefixedCore.Iterable<int> {}
+extension type E5 on List show prefixedCore.Iterable {}
+extension type E6 on List<int> show Iterable<int> {}
+abstract class A {
+  A operator *(A other);
+}
+class B<X> implements A {
+  bool get foo => throw 42;
+  A operator *(A other) => throw 42;
+}
+class C extends B<int> {
+  void set bar(int value) {}
+  void baz() {}
+}
+extension type E on C show A, B<int>, operator *, get foo, set bar, baz {}
+main() {}
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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..4a47ac5
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.outline.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+  get foo() → core::bool
+    ;
+  operator *(self::A other) → self::A
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    ;
+  set bar(core::int value) → void
+    ;
+  method baz() → void
+    ;
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+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
new file mode 100644
index 0000000..69ddb3b
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int {
+}
+extension type E1 on core::int {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> {
+}
+extension type E3 on core::int {
+}
+extension type E4 on core::List<core::int> {
+}
+extension type E5 on core::List<dynamic> {
+}
+extension type E6 on core::List<core::int> {
+}
+extension type E on self::C {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47057.dart b/pkg/front_end/testcases/general/issue47057.dart
new file mode 100644
index 0000000..8d5b88d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart
@@ -0,0 +1,15 @@
+// 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.
+
+import 'dart:async';
+
+Future<int> foo<X extends Object?>(X x) async {
+  if (x is Future<int>) {
+    return x;
+  } else {
+    throw 42;
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47057.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47057.dart.textual_outline.expect
new file mode 100644
index 0000000..af27955
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+import 'dart:async';
+
+Future<int> foo<X extends Object?>(X x) async {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47057.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47057.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..af27955
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+import 'dart:async';
+
+Future<int> foo<X extends Object?>(X x) async {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47057.dart.weak.expect b/pkg/front_end/testcases/general/issue47057.dart.weak.expect
new file mode 100644
index 0000000..abd22ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method foo<X extends core::Object?>(self::foo::X% x) → asy::Future<core::int> async {
+  if(x is{ForNonNullableByDefault} asy::Future<core::int>) {
+    return x{self::foo::X% & asy::Future<core::int> /* '%' & '!' = '!' */};
+  }
+  else {
+    throw 42;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47057.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47057.dart.weak.outline.expect
new file mode 100644
index 0000000..e803dbe
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.weak.outline.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method foo<X extends core::Object?>(self::foo::X% x) → asy::Future<core::int> async 
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47057.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47057.dart.weak.transformed.expect
new file mode 100644
index 0000000..e2413bc
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.weak.transformed.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method foo<X extends core::Object?>(self::foo::X% x) → asy::Future<core::int> /* originally async */ {
+  final asy::_Future<core::int> :async_future = new asy::_Future::•<core::int>();
+  core::bool* :is_sync = false;
+  FutureOr<core::int>? :return_value;
+  (dynamic) → dynamic :async_op_then;
+  (core::Object, core::StackTrace) → dynamic :async_op_error;
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        if(x is{ForNonNullableByDefault} asy::Future<core::int>) {
+          :return_value = x{self::foo::X% & asy::Future<core::int> /* '%' & '!' = '!' */};
+          break #L1;
+        }
+        else {
+          throw 42;
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
+      return;
+    }
+    on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+      asy::_completeOnAsyncError(:async_future, exception, stack_trace, :is_sync);
+    }
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_op(){() → dynamic};
+  :is_sync = true;
+  return :async_future;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental/changing_modules_14.yaml b/pkg/front_end/testcases/incremental/changing_modules_14.yaml
new file mode 100644
index 0000000..641accf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/changing_modules_14.yaml
@@ -0,0 +1,59 @@
+# 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.md file.
+
+# Compile an application with modules compiled as outlines with constants.
+# When compiling the "real" library (as non-outline) constant evaluation
+# goes into more modules than in just the outline version.
+
+type: newworld
+# Set to DDC for compiling modules as outline.
+target: DDC
+modules:
+  moduleC:
+    moduleC/lib.dart: |
+      const constC = ['value_c'];
+    moduleC/.packages: |
+      moduleC:.
+  moduleB:
+    moduleB/lib.dart: |
+      import "package:moduleC/lib.dart";
+      const constB = ['value_b', constC];
+    moduleB/.packages: |
+      moduleB:.
+      moduleC:../moduleC
+worlds:
+  - entry: main.dart
+    fromComponent: true
+    sources:
+      main.dart: |
+        import 'package:moduleB/lib.dart';
+        import 'lib.dart';
+        const constA = ['value_a', constB];
+        const constLib = constFromLib;
+      lib.dart: |
+        const constFromLib = 42;
+      .packages: |
+        moduleB:moduleB
+        moduleC:moduleC
+    modules:
+      - moduleB
+      - moduleC
+    expectedLibraryCount: 4
+    neededDillLibraries:
+      # Because the modules are complied as outlines they haven't had constants
+      # evaluated. As this is fully compiled it does evaluate constants and thus
+      # goes into both B and C.
+      # We do not mark "lib.dart" though as it is not loaded from dill.
+      - package:moduleB/lib.dart
+      - package:moduleC/lib.dart
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Field constA
+        - Field constLib
+      org-dartlang-test:///lib.dart:
+        - Field constFromLib
+      package:moduleB/lib.dart:
+        - Field constB
+      package:moduleC/lib.dart:
+        - Field constC
diff --git a/pkg/front_end/testcases/incremental/changing_modules_14.yaml.world.1.expect b/pkg/front_end/testcases/incremental/changing_modules_14.yaml.world.1.expect
new file mode 100644
index 0000000..ac9e649
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/changing_modules_14.yaml.world.1.expect
@@ -0,0 +1,32 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  static const field dart.core::int constFromLib = #C1;
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:moduleB/lib.dart";
+  import "org-dartlang-test:///lib.dart";
+
+  static const field dart.core::List<dart.core::Object> constA = #C7;
+  static const field dart.core::int constLib = #C1;
+}
+library from "package:moduleB/lib.dart" as lib2 {
+
+  import "package:moduleC/lib.dart";
+
+  static const field dart.core::List<dart.core::Object*>* constB = const <dart.core::Object*>["value_b", lib3::constC];
+}
+library from "package:moduleC/lib.dart" as lib3 {
+
+  static const field dart.core::List<dart.core::String*>* constC = const <dart.core::String*>["value_c"];
+}
+constants  {
+  #C1 = 42.0
+  #C2 = "value_a"
+  #C3 = "value_b"
+  #C4 = "value_c"
+  #C5 = <dart.core::String*>[#C4]
+  #C6 = <dart.core::Object*>[#C3, #C5]
+  #C7 = <dart.core::Object*>[#C2, #C6]
+}
diff --git a/pkg/front_end/testcases/incremental/changing_modules_15.yaml b/pkg/front_end/testcases/incremental/changing_modules_15.yaml
new file mode 100644
index 0000000..d0753b8
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/changing_modules_15.yaml
@@ -0,0 +1,51 @@
+# 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.md file.
+
+# Compile an application with modules compiled as outlines with constants.
+# When compiling the "real" library (as non-outline) constant evaluation
+# goes into more modules than in just the outline version.
+
+type: newworld
+# Set to DDC for compiling modules as outline.
+target: DDC
+modules:
+  moduleC:
+    moduleC/lib.dart: |
+      const constC = true;
+    moduleC/.packages: |
+      moduleC:.
+  moduleB:
+    moduleB/lib.dart: |
+      import "package:moduleC/lib.dart";
+      const constB = false || constC;
+    moduleB/.packages: |
+      moduleB:.
+      moduleC:../moduleC
+worlds:
+  - entry: main.dart
+    fromComponent: true
+    sources:
+      main.dart: |
+        import 'package:moduleB/lib.dart';
+        const constA = true && constB;
+      .packages: |
+        moduleB:moduleB
+        moduleC:moduleC
+    modules:
+      - moduleB
+      - moduleC
+    expectedLibraryCount: 3
+    neededDillLibraries:
+      # Because the modules are complied as outlines they haven't had constants
+      # evaluated. As this is fully compiled it does evaluate constants and thus
+      # goes into both B and C.
+      - package:moduleB/lib.dart
+      - package:moduleC/lib.dart
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Field constA
+      package:moduleB/lib.dart:
+        - Field constB
+      package:moduleC/lib.dart:
+        - Field constC
diff --git a/pkg/front_end/testcases/incremental/changing_modules_15.yaml.world.1.expect b/pkg/front_end/testcases/incremental/changing_modules_15.yaml.world.1.expect
new file mode 100644
index 0000000..c7ef4da
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/changing_modules_15.yaml.world.1.expect
@@ -0,0 +1,20 @@
+main = <No Member>;
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "package:moduleB/lib.dart";
+
+  static const field dart.core::bool constA = #C1;
+}
+library from "package:moduleB/lib.dart" as lib {
+
+  import "package:moduleC/lib.dart";
+
+  static const field dart.core::bool* constB = false || lib2::constC;
+}
+library from "package:moduleC/lib.dart" as lib2 {
+
+  static const field dart.core::bool* constC = true;
+}
+constants  {
+  #C1 = true
+}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 45bfa23..1ca96b2 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -27,11 +27,17 @@
 constructor_tearoffs/issue47075: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
+extension_types/basic_show: FormatterCrash
+extension_types/keyword_in_show_hide_element: FormatterCrash
 extension_types/simple_getter_resolution: FormatterCrash
 extension_types/simple_method_resolution: FormatterCrash
 extension_types/simple_operator_resolution: FormatterCrash
 extension_types/simple_setter_resolution: FormatterCrash
+extension_types/simple_show_and_hide: FormatterCrash
 extension_types/simple_show_hide: FormatterCrash
+extension_types/simple_show_hide_conflicts: FormatterCrash
+extension_types/various_hide_elements: FormatterCrash
+extension_types/various_show_elements: FormatterCrash
 extensions/extension_constructor: FormatterCrash
 extensions/extension_field_with_type_parameter_usage: FormatterCrash
 extensions/issue38600: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 15062a3..6af034c 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -74,7 +74,6 @@
 general/error_recovery/issue_39958_04: RuntimeError
 general/error_recovery/yield_not_in_generator: RuntimeError
 general/expressions: RuntimeError
-general/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 general/getter_vs_setter_type: TypeCheckError
 general/incomplete_field_formal_parameter: RuntimeError
 general/infer_field_from_multiple: TypeCheckError
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 6b22016..5320daf 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -102,8 +102,7 @@
       List<DartType>? futureArguments =
           getTypeArgumentsAsInstanceOf(resolved, coreTypes.futureClass);
       if (futureArguments != null) {
-        return _withDeclaredNullability(
-            futureArguments.single, t.declaredNullability);
+        return _withDeclaredNullability(futureArguments.single, t.nullability);
       }
     }
 
diff --git a/tools/VERSION b/tools/VERSION
index ea2e9f8..8b36375 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 87
+PRERELEASE 88
 PRERELEASE_PATCH 0
\ No newline at end of file