Version 2.13.0-152.0.dev

Merge commit '9ad76fe7bd884cb6b7f821401eb17295896cc1b8' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index c4c4e5c..2f32e9a 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -361,7 +361,14 @@
     }
 
     MetadataBuilder.buildAnnotations(
-        isPatch ? origin.cls : cls, metadata, library, this, null);
+        isPatch ? origin.cls : cls, metadata, library, this, null, fileUri);
+    if (typeVariables != null) {
+      for (int i = 0; i < typeVariables.length; i++) {
+        typeVariables[i].buildOutlineExpressions(
+            library, this, null, coreTypes, delayedActionPerformers);
+      }
+    }
+
     constructors.forEach(build);
     scope.forEach(build);
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index 8617f88..d7978bd 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -205,20 +205,4 @@
 
   @override
   String get debugName => "ExtensionBuilder";
-
-  @override
-  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
-      List<DelayedActionPerformer> delayedActionPerformers) {
-    void build(String ignore, Builder declaration) {
-      MemberBuilder member = declaration;
-      member.buildOutlineExpressions(
-          library, coreTypes, delayedActionPerformers);
-    }
-
-    // TODO(johnniwinther): Handle annotations on the extension declaration.
-    //MetadataBuilder.buildAnnotations(
-    //    isPatch ? origin.extension : extension,
-    //    metadata, library, this, null);
-    scope.forEach(build);
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 1e93f43..fd05495 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -389,7 +389,7 @@
     ClassBuilder classBuilder = isClassMember ? parent : null;
     for (Annotatable annotatable in _fieldEncoding.annotatables) {
       MetadataBuilder.buildAnnotations(
-          annotatable, metadata, library, classBuilder, this);
+          annotatable, metadata, library, classBuilder, this, fileUri);
     }
 
     // For modular compilation we need to include initializers of all const
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 8477784..15880c6 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -41,6 +41,7 @@
 
 import 'builder.dart';
 import 'class_builder.dart';
+import 'declaration_builder.dart';
 import 'extension_builder.dart';
 import 'formal_parameter_builder.dart';
 import 'library_builder.dart';
@@ -506,8 +507,20 @@
   void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
       List<DelayedActionPerformer> delayedActionPerformers) {
     if (!_hasBuiltOutlineExpressions) {
+      DeclarationBuilder classOrExtensionBuilder =
+          isClassMember || isExtensionMember ? parent : null;
       MetadataBuilder.buildAnnotations(
-          member, metadata, library, isClassMember ? parent : null, this);
+          member, metadata, library, classOrExtensionBuilder, this, fileUri);
+      if (typeVariables != null) {
+        for (int i = 0; i < typeVariables.length; i++) {
+          typeVariables[i].buildOutlineExpressions(
+              library,
+              classOrExtensionBuilder,
+              this,
+              coreTypes,
+              delayedActionPerformers);
+        }
+      }
 
       if (formals != null) {
         // For const constructors we need to include default parameter values
diff --git a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
index 910119c..00998c8 100644
--- a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
@@ -8,7 +8,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 
-import 'package:kernel/ast.dart' show Annotatable, Class, Library;
+import 'package:kernel/ast.dart';
 
 import '../kernel/body_builder.dart' show BodyBuilder;
 
@@ -16,7 +16,7 @@
 
 import '../scope.dart' show Scope;
 
-import 'class_builder.dart';
+import 'declaration_builder.dart';
 import 'member_builder.dart';
 
 class MetadataBuilder {
@@ -30,16 +30,19 @@
       Annotatable parent,
       List<MetadataBuilder> metadata,
       SourceLibraryBuilder library,
-      ClassBuilder classBuilder,
-      MemberBuilder member) {
+      DeclarationBuilder classOrExtensionBuilder,
+      MemberBuilder member,
+      Uri fileUri) {
     if (metadata == null) return;
-    Uri fileUri = member?.fileUri ?? classBuilder?.fileUri ?? library.fileUri;
-    Scope scope = parent is Library || parent is Class || classBuilder == null
+    Scope scope = parent is Library ||
+            parent is Class ||
+            parent is Extension ||
+            classOrExtensionBuilder == null
         ? library.scope
-        : classBuilder.scope;
+        : classOrExtensionBuilder.scope;
     BodyBuilder bodyBuilder = library.loader
         .createBodyBuilderForOutlineExpression(
-            library, classBuilder, member, scope, fileUri);
+            library, classOrExtensionBuilder, member, scope, fileUri);
     for (int i = 0; i < metadata.length; ++i) {
       MetadataBuilder annotationBuilder = metadata[i];
       parent.addAnnotation(
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index 2f94d08..0ff9c8e 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -14,6 +14,7 @@
         Nullability,
         TypeParameter,
         Typedef;
+import 'package:kernel/core_types.dart';
 
 import 'package:kernel/type_algebra.dart' show substitute, uniteNullabilities;
 import 'package:kernel/src/legacy_erasure.dart';
@@ -27,6 +28,7 @@
         messageTypedefTypeVariableNotConstructorCause;
 
 import '../problems.dart' show unhandled;
+import '../util/helpers.dart';
 
 import 'class_builder.dart';
 import 'library_builder.dart';
@@ -114,6 +116,9 @@
   /// arguments for passing to the [ClassBuilder] which is the end of the
   /// unaliasing chain.
   List<TypeBuilder> unaliasTypeArguments(List<TypeBuilder> typeArguments);
+
+  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers);
 }
 
 abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index d8d4a27..b884f68 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -8,6 +8,7 @@
 
 import 'package:kernel/ast.dart'
     show DartType, Nullability, TypeParameter, TypeParameterType;
+import 'package:kernel/core_types.dart';
 
 import '../fasta_codes.dart'
     show
@@ -16,9 +17,13 @@
         templateTypeArgumentsOnTypeVariable;
 
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+import '../util/helpers.dart';
 
 import 'class_builder.dart';
+import 'declaration_builder.dart';
 import 'library_builder.dart';
+import 'member_builder.dart';
+import 'metadata_builder.dart';
 import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
@@ -37,11 +42,14 @@
 
   TypeVariableBuilder(
       String name, SourceLibraryBuilder compilationUnit, int charOffset,
-      {this.bound, this.isExtensionTypeParameter: false, int variableVariance})
+      {this.bound,
+      this.isExtensionTypeParameter: false,
+      int variableVariance,
+      List<MetadataBuilder> metadata})
       : actualParameter = new TypeParameter(name, null)
           ..fileOffset = charOffset
           ..variance = variableVariance,
-        super(null, 0, name, compilationUnit, charOffset);
+        super(metadata, 0, name, compilationUnit, charOffset);
 
   TypeVariableBuilder.fromKernel(
       TypeParameter parameter, LibraryBuilder compilationUnit)
@@ -238,6 +246,16 @@
         bound: bound.clone(newTypes), variableVariance: variance);
   }
 
+  void buildOutlineExpressions(
+      LibraryBuilder libraryBuilder,
+      DeclarationBuilder classOrExtensionBuilder,
+      MemberBuilder memberBuilder,
+      CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    MetadataBuilder.buildAnnotations(parameter, metadata, libraryBuilder,
+        classOrExtensionBuilder, memberBuilder, fileUri);
+  }
+
   @override
   bool operator ==(Object other) {
     return other is TypeVariableBuilder && parameter == other.parameter;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index ea03898..8da14de 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -4,7 +4,9 @@
 
 // @dart = 2.9
 
+import 'package:front_end/src/fasta/util/helpers.dart';
 import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
 
 import '../builder/extension_builder.dart';
 import '../builder/library_builder.dart';
@@ -105,4 +107,10 @@
     }
     return _onType;
   }
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    // TODO(johnniwinther): Remove the need for this.
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index 9020e68..6b7b54b 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -6,7 +6,9 @@
 
 library fasta.dill_typedef_builder;
 
+import 'package:front_end/src/fasta/util/helpers.dart';
 import 'package:kernel/ast.dart' show DartType, InvalidType, NullType, Typedef;
+import 'package:kernel/core_types.dart';
 
 import '../builder/library_builder.dart';
 import '../builder/metadata_builder.dart';
@@ -92,4 +94,10 @@
 
   @override
   bool get isNullAlias => typedef.type is NullType;
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    // TODO(johnniwinther): Remove the need for this.
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 21443af..4386b20 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1401,7 +1401,7 @@
   }
 
   @override
-  List<Expression> finishMetadata(TreeNode parent) {
+  List<Expression> finishMetadata(Annotatable parent) {
     List<Expression> expressions = pop();
     inferAnnotations(parent, expressions);
 
@@ -1412,35 +1412,7 @@
     // used.
     ListLiteral temporaryParent;
 
-    if (parent is Class) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is Library) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is LibraryDependency) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is LibraryPart) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is Member) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is Typedef) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is TypeParameter) {
-      for (Expression expression in expressions) {
-        parent.addAnnotation(expression);
-      }
-    } else if (parent is VariableDeclaration) {
+    if (parent != null) {
       for (Expression expression in expressions) {
         parent.addAnnotation(expression);
       }
@@ -3471,8 +3443,12 @@
     if (typeVariables != null) {
       for (TypeVariableBuilder builder in typeVariables) {
         if (builder.parameter.annotations.isNotEmpty) {
-          addProblem(fasta.messageAnnotationOnFunctionTypeTypeVariable,
-              builder.charOffset, builder.name.length);
+          if (!libraryBuilder.enableGenericMetadataInLibrary) {
+            addProblem(fasta.messageAnnotationOnFunctionTypeTypeVariable,
+                builder.charOffset, builder.name.length);
+          }
+          // Annotations on function types are not constant evaluated and are
+          // not included in the generated AST so we clear them here.
           builder.parameter.annotations = const <Expression>[];
         }
       }
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 98a5aad..1a39e6a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -383,6 +383,7 @@
     transformLibraryPartList(library.parts, library);
     transformTypedefList(library.typedefs, library);
     transformClassList(library.classes, library);
+    transformExtensionList(library.extensions, library);
     transformProcedureList(library.procedures, library);
     transformFieldList(library.fields, library);
 
@@ -432,6 +433,19 @@
   }
 
   @override
+  Extension visitExtension(Extension node, TreeNode removalSentinel) {
+    StaticTypeContext oldStaticTypeContext = _staticTypeContext;
+    _staticTypeContext = new StaticTypeContext.forAnnotations(
+        node.enclosingLibrary, typeEnvironment);
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformTypeParameterList(node.typeParameters, node);
+    });
+    _staticTypeContext = oldStaticTypeContext;
+    return node;
+  }
+
+  @override
   Procedure visitProcedure(Procedure node, TreeNode removalSentinel) {
     StaticTypeContext oldStaticTypeContext = _staticTypeContext;
     _staticTypeContext = new StaticTypeContext(node, typeEnvironment);
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 2787514..3d05b76 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -18,17 +18,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
-import 'package:kernel/ast.dart'
-    show
-        AsyncMarker,
-        Expression,
-        InterfaceType,
-        Library,
-        LibraryDependency,
-        LibraryPart,
-        TreeNode,
-        TypeParameter,
-        VariableDeclaration;
+import 'package:kernel/ast.dart';
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -277,12 +267,12 @@
 
     if (equals == null) pop(); // endToken
     Object name = pop();
-    Token metadata = pop();
+    // Metadata is handled in [SourceTypeAliasBuilder.buildOutlineExpressions].
+    pop(); // metadata
     checkEmpty(typedefKeyword.charOffset);
     if (name is ParserRecovery) return;
 
     TypeAliasBuilder typedefBuilder = lookupBuilder(typedefKeyword, null, name);
-    parseMetadata(typedefBuilder, metadata, typedefBuilder.typedef);
     if (typedefBuilder is TypeAliasBuilder) {
       TypeBuilder type = typedefBuilder.type;
       if (type is FunctionTypeBuilder) {
@@ -1111,7 +1101,7 @@
   /// If the [metadata] is not `null`, return the parsed metadata [Expression]s.
   /// Otherwise, return `null`.
   List<Expression> parseMetadata(
-      ModifierBuilder builder, Token metadata, TreeNode parent) {
+      ModifierBuilder builder, Token metadata, Annotatable parent) {
     if (metadata != null) {
       StackListenerImpl listener = createListener(builder, memberScope,
           isDeclarationInstanceMember: false);
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 990f491..4fd5278 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -1608,6 +1608,7 @@
         typeVariables,
         formals,
         libraryBuilder.nullableBuilderIfTrue(questionMark != null),
+        uri,
         functionToken.charOffset));
   }
 
@@ -1621,8 +1622,13 @@
     if (!libraryBuilder.isNonNullableByDefault) {
       reportErrorIfNullableType(question);
     }
-    push(libraryBuilder.addFunctionType(returnType, typeVariables, formals,
-        libraryBuilder.nullableBuilderIfTrue(question != null), formalsOffset));
+    push(libraryBuilder.addFunctionType(
+        returnType,
+        typeVariables,
+        formals,
+        libraryBuilder.nullableBuilderIfTrue(question != null),
+        uri,
+        formalsOffset));
   }
 
   @override
@@ -1653,7 +1659,7 @@
           hasMembers: false);
       // TODO(dmitryas): Make sure that RHS of typedefs can't have '?'.
       aliasedType = libraryBuilder.addFunctionType(returnType, null, formals,
-          const NullabilityBuilder.omitted(), charOffset);
+          const NullabilityBuilder.omitted(), uri, charOffset);
     } else {
       Object type = pop();
       typeVariables = pop();
@@ -1833,13 +1839,11 @@
     debugEvent("beginTypeVariable");
     int charOffset = pop();
     Object name = pop();
-    // TODO(paulberry): type variable metadata should not be ignored.  See
-    // dartbug.com/28981.
-    /* List<MetadataBuilder<TypeBuilder>> metadata = */ pop();
+    List<MetadataBuilder> metadata = pop();
     if (name is ParserRecovery) {
       push(name);
     } else {
-      push(libraryBuilder.addTypeVariable(name, null, charOffset));
+      push(libraryBuilder.addTypeVariable(metadata, name, null, charOffset));
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index a8d620c..264a65f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -5,6 +5,7 @@
 // @dart = 2.9
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
 import 'package:kernel/type_environment.dart';
 
 import '../../base/common.dart';
@@ -31,6 +32,8 @@
 
 import '../scope.dart';
 
+import '../util/helpers.dart';
+
 import 'source_library_builder.dart';
 
 const String extensionThisName = '#this';
@@ -258,4 +261,25 @@
       }
     });
   }
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    MetadataBuilder.buildAnnotations(isPatch ? origin.extension : extension,
+        metadata, library, this, null, fileUri);
+    if (typeParameters != null) {
+      for (int i = 0; i < typeParameters.length; i++) {
+        typeParameters[i].buildOutlineExpressions(
+            library, this, null, coreTypes, delayedActionPerformers);
+      }
+    }
+
+    void build(String ignore, Builder declaration) {
+      MemberBuilder member = declaration;
+      member.buildOutlineExpressions(
+          library, coreTypes, delayedActionPerformers);
+    }
+
+    scope.forEach(build);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 8f660b6..ce5fd71 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2525,10 +2525,21 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       NullabilityBuilder nullabilityBuilder,
+      Uri fileUri,
       int charOffset) {
     FunctionTypeBuilder builder = new FunctionTypeBuilder(returnType,
         typeVariables, formals, nullabilityBuilder, fileUri, charOffset);
     checkTypeVariables(typeVariables, null);
+    if (typeVariables != null) {
+      for (TypeVariableBuilder builder in typeVariables) {
+        if (builder.metadata != null) {
+          if (!enableGenericMetadataInLibrary) {
+            addProblem(messageAnnotationOnFunctionTypeTypeVariable,
+                builder.charOffset, builder.name.length, builder.fileUri);
+          }
+        }
+      }
+    }
     // Nested declaration began in `OutlineBuilder.beginFunctionType` or
     // `OutlineBuilder.beginFunctionTypedFormalParameter`.
     endNestedDeclaration(TypeParameterScopeKind.functionType, "#function_type")
@@ -2555,17 +2566,19 @@
     return formal;
   }
 
-  TypeVariableBuilder addTypeVariable(
+  TypeVariableBuilder addTypeVariable(List<MetadataBuilder> metadata,
       String name, TypeBuilder bound, int charOffset) {
-    TypeVariableBuilder builder =
-        new TypeVariableBuilder(name, this, charOffset, bound: bound);
+    TypeVariableBuilder builder = new TypeVariableBuilder(
+        name, this, charOffset,
+        bound: bound, metadata: metadata);
     boundlessTypeVariables.add(builder);
     return builder;
   }
 
   @override
   void buildOutlineExpressions() {
-    MetadataBuilder.buildAnnotations(library, metadata, this, null, null);
+    MetadataBuilder.buildAnnotations(
+        library, metadata, this, null, null, fileUri);
   }
 
   /// Builds the core AST structures for [declaration] needed for the outline.
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 1405152..1183386 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -25,7 +25,6 @@
         ScannerResult,
         Token,
         scan;
-import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import 'package:kernel/ast.dart'
     show
@@ -59,6 +58,7 @@
 
 import 'package:package_config/package_config.dart';
 
+import '../../api_prototype/experimental_flags.dart';
 import '../../api_prototype/file_system.dart';
 
 import '../../base/common.dart';
@@ -71,6 +71,7 @@
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
+import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/enum_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/field_builder.dart';
@@ -78,6 +79,8 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/named_type_builder.dart';
+import '../builder/never_type_declaration_builder.dart';
+import '../builder/prefix_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
@@ -1153,6 +1156,16 @@
           } else if (declaration is MemberBuilder) {
             declaration.buildOutlineExpressions(
                 library, coreTypes, delayedActionPerformers);
+          } else if (declaration is TypeAliasBuilder) {
+            declaration.buildOutlineExpressions(
+                library, coreTypes, delayedActionPerformers);
+          } else {
+            assert(
+                declaration is PrefixBuilder ||
+                    declaration is DynamicTypeDeclarationBuilder ||
+                    declaration is NeverTypeDeclarationBuilder,
+                "Unexpected builder in library: ${declaration} "
+                "(${declaration.runtimeType}");
           }
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index b84b276..6fb5965 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -17,6 +17,8 @@
         VariableDeclaration,
         getAsTypeArguments;
 
+import 'package:kernel/core_types.dart';
+
 import 'package:kernel/type_algebra.dart'
     show FreshTypeParameters, getFreshTypeParameters;
 
@@ -39,6 +41,8 @@
 import '../builder/type_declaration_builder.dart';
 import '../builder/type_variable_builder.dart';
 
+import '../util/helpers.dart';
+
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
 class SourceTypeAliasBuilder extends TypeAliasBuilderImpl {
@@ -243,4 +247,17 @@
     library.checkBoundsInType(
         typedef.type, typeEnvironment, fileUri, type?.charOffset ?? charOffset);
   }
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    MetadataBuilder.buildAnnotations(
+        typedef, metadata, library, null, null, fileUri);
+    if (typeVariables != null) {
+      for (int i = 0; i < typeVariables.length; i++) {
+        typeVariables[i].buildOutlineExpressions(
+            library, null, null, coreTypes, delayedActionPerformers);
+      }
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
index 3548229..12c8559 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
@@ -13,8 +13,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
-import 'package:kernel/ast.dart'
-    show AsyncMarker, Expression, FunctionNode, TreeNode;
+import 'package:kernel/ast.dart';
 
 import '../fasta_codes.dart';
 
@@ -62,7 +61,7 @@
 
   // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
   // and ast_builder.dart.
-  List<Expression> finishMetadata(TreeNode parent) {
+  List<Expression> finishMetadata(Annotatable parent) {
     return problems.unsupported("finishMetadata", -1, uri);
   }
 
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.weak.outline.expect b/pkg/front_end/testcases/general/annotation_top.dart.weak.outline.expect
index a3676d1..f0fe7fb 100644
--- a/pkg/front_end/testcases/general/annotation_top.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_top.dart.weak.outline.expect
@@ -4,7 +4,11 @@
 import self as self;
 import "dart:core" as core;
 
+@self::a
+@self::A::•(2)
 typedef F1 = () →* void;
+@self::a
+@self::A::•(3)
 typedef F2 = () →* void;
 class A extends core::Object /*hasConstConstructor*/  {
   const constructor •(core::int* value) → self::A*
@@ -53,6 +57,10 @@
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:5:2 -> InstanceConstant(const Object{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:6:2 -> InstanceConstant(const A{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:19:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:20:2 -> InstanceConstant(const A{})
+Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:23:2 -> InstanceConstant(const Object{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:24:2 -> InstanceConstant(const A{})
 Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:15:2 -> InstanceConstant(const Object{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:16:2 -> InstanceConstant(const A{})
 Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:31:2 -> InstanceConstant(const Object{})
@@ -62,4 +70,4 @@
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
 Evaluated: StaticGet @ org-dartlang-testcase:///annotation_top.dart:27:2 -> InstanceConstant(const Object{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotation_top.dart:28:2 -> InstanceConstant(const A{})
-Extra constant evaluation: evaluated: 11, effectively constant: 11
+Extra constant evaluation: evaluated: 15, effectively constant: 15
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart b/pkg/front_end/testcases/general/extension_annotation.dart
new file mode 100644
index 0000000..5e32514
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart
@@ -0,0 +1,12 @@
+// 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 {
+  const A();
+}
+
+@A()
+extension Extension on int {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline.expect b/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline.expect
new file mode 100644
index 0000000..35443c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A {
+  const A();
+}
+
+@A()
+extension Extension on int {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..35443c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class A {
+  const A();
+}
+
+@A()
+extension Extension on int {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.weak.expect b/pkg/front_end/testcases/general/extension_annotation.dart.weak.expect
new file mode 100644
index 0000000..d44af16
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+@#C1
+extension Extension on core::int {
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///extension_annotation.dart:
+- A. (from org-dartlang-testcase:///extension_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.weak.outline.expect b/pkg/front_end/testcases/general/extension_annotation.dart.weak.outline.expect
new file mode 100644
index 0000000..3a68e58
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.weak.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+@self::A::•()
+extension Extension on core::int {
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extension_annotation.dart.weak.transformed.expect
new file mode 100644
index 0000000..d44af16
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+@#C1
+extension Extension on core::int {
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///extension_annotation.dart:
+- A. (from org-dartlang-testcase:///extension_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart b/pkg/front_end/testcases/general/function_type_parameter.dart
new file mode 100644
index 0000000..a9cb3ee
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart
@@ -0,0 +1,25 @@
+// 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 {
+  const A();
+}
+
+void Function<@A() T>(T)? f;
+
+typedef F = void Function<@A() T>(T);
+
+typedef void G<@A() T>(T t);
+
+void method1<@A() T>(T t) {}
+
+void method2(void Function<@A() T>(T) f) {}
+
+class Class<T extends void Function<@A() S>(S)> {}
+
+main() {
+  void local<@A() T>(T t) {}
+
+  void Function<@A() T>(T)? f;
+}
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..31291f6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A {
+  const A();
+}
+
+void Function<@A() T>(T)? f;
+typedef F = void Function<@A() T>(T);
+typedef void G<@A() T>(T t);
+void method1<@A() T>(T t) {}
+void method2(void Function<@A() T>(T) f) {}
+
+class Class<T extends void Function<@A() S>(S)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e028d49
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class A {
+  const A();
+}
+
+class Class<T extends void Function<@A() S>(S)> {}
+
+main() {}
+typedef F = void Function<@A() T>(T);
+typedef void G<@A() T>(T t);
+void Function<@A() T>(T)? f;
+void method1<@A() T>(T t) {}
+void method2(void Function<@A() T>(T) f) {}
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.weak.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.expect
new file mode 100644
index 0000000..35519c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:9:20: Error: A type variable on a function type can't have annotations.
+// void Function<@A() T>(T)? f;
+//                    ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:11:32: Error: A type variable on a function type can't have annotations.
+// typedef F = void Function<@A() T>(T);
+//                                ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:17:33: Error: A type variable on a function type can't have annotations.
+// void method2(void Function<@A() T>(T) f) {}
+//                                 ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:42: Error: A type variable on a function type can't have annotations.
+// class Class<T extends void Function<@A() S>(S)> {}
+//                                          ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:13: Error: Type variables can't have generic function types in their bounds.
+// class Class<T extends void Function<@A() S>(S)> {}
+//             ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:24:22: Error: A type variable on a function type can't have annotations.
+//   void Function<@A() T>(T)? f;
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C1 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C1 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.outline.expect
new file mode 100644
index 0000000..0ce97a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.outline.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:9:20: Error: A type variable on a function type can't have annotations.
+// void Function<@A() T>(T)? f;
+//                    ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:11:32: Error: A type variable on a function type can't have annotations.
+// typedef F = void Function<@A() T>(T);
+//                                ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:17:33: Error: A type variable on a function type can't have annotations.
+// void method2(void Function<@A() T>(T) f) {}
+//                                 ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:42: Error: A type variable on a function type can't have annotations.
+// class Class<T extends void Function<@A() S>(S)> {}
+//                                          ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:13: Error: Type variables can't have generic function types in their bounds.
+// class Class<T extends void Function<@A() S>(S)> {}
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@self::A::•() contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@self::A::•() T extends core::Object? = dynamic>(self::method1::T% t) → void
+  ;
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///function_type_parameter.dart:13:17 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///function_type_parameter.dart:15:15 -> InstanceConstant(const A{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.transformed.expect
new file mode 100644
index 0000000..35519c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.transformed.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:9:20: Error: A type variable on a function type can't have annotations.
+// void Function<@A() T>(T)? f;
+//                    ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:11:32: Error: A type variable on a function type can't have annotations.
+// typedef F = void Function<@A() T>(T);
+//                                ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:17:33: Error: A type variable on a function type can't have annotations.
+// void method2(void Function<@A() T>(T) f) {}
+//                                 ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:42: Error: A type variable on a function type can't have annotations.
+// class Class<T extends void Function<@A() S>(S)> {}
+//                                          ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:13: Error: Type variables can't have generic function types in their bounds.
+// class Class<T extends void Function<@A() S>(S)> {}
+//             ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:24:22: Error: A type variable on a function type can't have annotations.
+//   void Function<@A() T>(T)? f;
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C1 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C1 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart b/pkg/front_end/testcases/general/type_variable_annotations.dart
new file mode 100644
index 0000000..0f9233b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart
@@ -0,0 +1,23 @@
+// 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 {
+  const A();
+}
+
+void method<@A() T>() {}
+
+typedef F<@A() T> = void Function(T);
+
+class Class<@A() T> {
+  void method<@A() T>() {
+    void local<@A() T>() {}
+  }
+}
+
+extension Extension<@A() T> on T {
+  void method<@A() T>() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline.expect
new file mode 100644
index 0000000..dd1805b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline.expect
@@ -0,0 +1,16 @@
+class A {
+  const A();
+}
+
+void method<@A() T>() {}
+typedef F<@A() T> = void Function(T);
+
+class Class<@A() T> {
+  void method<@A() T>() {}
+}
+
+extension Extension<@A() T> on T {
+  void method<@A() T>() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a640304
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+class A {
+  const A();
+}
+
+class Class<@A() T> {
+  void method<@A() T>() {}
+}
+
+extension Extension<@A() T> on T {
+  void method<@A() T>() {}
+}
+
+main() {}
+typedef F<@A() T> = void Function(T);
+void method<@A() T>() {}
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.expect
new file mode 100644
index 0000000..21c0f72
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  method method<@#C1 T extends core::Object? = dynamic>() → void {
+    function local<@#C1 T extends core::Object? = dynamic>() → void {}
+  }
+}
+extension Extension<@#C1 T extends core::Object? = dynamic> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method method<@#C1 T extends core::Object? = dynamic>() → void {}
+static method Extension|method<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Extension|method::#T% #this) → void {}
+static method Extension|get#method<#T extends core::Object? = dynamic>(lowered final self::Extension|get#method::#T% #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void => self::Extension|method<self::Extension|get#method::#T%, T%>(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///type_variable_annotations.dart:
+- A. (from org-dartlang-testcase:///type_variable_annotations.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.outline.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.outline.expect
new file mode 100644
index 0000000..503996e
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<@self::A::•() contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<@self::A::•() T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+  method method<@self::A::•() T extends core::Object? = dynamic>() → void
+    ;
+}
+extension Extension<@self::A::•() T extends core::Object? = dynamic> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method method<@self::A::•() T extends core::Object? = dynamic>() → void
+  ;
+static method Extension|method<#T extends core::Object? = dynamic, @self::A::•() T extends core::Object? = dynamic>(lowered final self::Extension|method::#T% #this) → void
+  ;
+static method Extension|get#method<#T extends core::Object? = dynamic>(lowered final self::Extension|get#method::#T% #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void => self::Extension|method<self::Extension|get#method::#T%, T%>(#this);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:11:12 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:13:14 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:14:16 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:19:22 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:9:14 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///type_variable_annotations.dart:20:16 -> InstanceConstant(const A{})
+Extra constant evaluation: evaluated: 9, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.transformed.expect
new file mode 100644
index 0000000..21c0f72
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.transformed.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  method method<@#C1 T extends core::Object? = dynamic>() → void {
+    function local<@#C1 T extends core::Object? = dynamic>() → void {}
+  }
+}
+extension Extension<@#C1 T extends core::Object? = dynamic> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method method<@#C1 T extends core::Object? = dynamic>() → void {}
+static method Extension|method<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Extension|method::#T% #this) → void {}
+static method Extension|get#method<#T extends core::Object? = dynamic>(lowered final self::Extension|get#method::#T% #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void => self::Extension|method<self::Extension|get#method::#T%, T%>(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///type_variable_annotations.dart:
+- A. (from org-dartlang-testcase:///type_variable_annotations.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart b/pkg/front_end/testcases/general/typedef_annotation.dart
new file mode 100644
index 0000000..fe8f57d
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.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.
+
+class A {
+  const A();
+}
+
+@A()
+typedef F = void Function();
+
+@A()
+typedef void G();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline.expect
new file mode 100644
index 0000000..796a732
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class A {
+  const A();
+}
+
+@A()
+typedef F = void Function();
+@A()
+typedef void G();
+main() {}
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a4408c3
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+class A {
+  const A();
+}
+
+main() {}
+@A()
+typedef F = void Function();
+@A()
+typedef void G();
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.weak.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.expect
new file mode 100644
index 0000000..3c94843
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+typedef F = () → void;
+@#C1
+typedef G = () → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///typedef_annotation.dart:
+- A. (from org-dartlang-testcase:///typedef_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.weak.outline.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.outline.expect
new file mode 100644
index 0000000..280c14f
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::A::•()
+typedef F = () → void;
+@self::A::•()
+typedef G = () → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///typedef_annotation.dart:9:2 -> InstanceConstant(const A{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///typedef_annotation.dart:12:2 -> InstanceConstant(const A{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.weak.transformed.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.transformed.expect
new file mode 100644
index 0000000..3c94843
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+typedef F = () → void;
+@#C1
+typedef G = () → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///typedef_annotation.dart:
+- A. (from org-dartlang-testcase:///typedef_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart
new file mode 100644
index 0000000..afca06a
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart
@@ -0,0 +1,27 @@
+// 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<T> {
+  const A(o);
+}
+
+void Function<@A<int>() T>(T)? f;
+
+// TODO(johnniwinther): Report errors on annotations here.
+typedef F = void Function<@A<bool>() T>(T);
+
+typedef void G<@A<dynamic>() T>(T t);
+
+void method1<@A<String>() T>(T t) {}
+
+void method2(void Function<@A<num>() T>(T) f) {}
+
+// TODO(johnniwinther): Report errors on annotations here.
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {
+  void local<@A<double>() T>(T t) {}
+
+  void Function<@A<int>() T>(T)? f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect
new file mode 100644
index 0000000..6ab9190
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:9:22: Error: Too few positional arguments: 1 required, 0 given.
+// void Function<@A<int>() T>(T)? f;
+//                      ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:18:35: Error: Too few positional arguments: 1 required, 0 given.
+// void method2(void Function<@A<num>() T>(T) f) {}
+//                                   ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void local<@A<double>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:26:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void Function<@A<int>() T>(T)? f;
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+  void local<@A<double>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..6ab9190
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:9:22: Error: Too few positional arguments: 1 required, 0 given.
+// void Function<@A<int>() T>(T)? f;
+//                      ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:18:35: Error: Too few positional arguments: 1 required, 0 given.
+// void method2(void Function<@A<num>() T>(T) f) {}
+//                                   ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void local<@A<double>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:26:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void Function<@A<int>() T>(T)? f;
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+  void local<@A<double>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..63866c4
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A<T> {
+  const A(o);
+}
+
+void Function<@A<int>() T>(T)? f;
+typedef F = void Function<@A<bool>() T>(T);
+typedef void G<@A<dynamic>() T>(T t);
+void method1<@A<String>() T>(T t) {}
+void method2(void Function<@A<num>() T>(T) f) {}
+
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7b92378
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class A<T> {
+  const A(o);
+}
+
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {}
+typedef F = void Function<@A<bool>() T>(T);
+typedef void G<@A<dynamic>() T>(T t);
+void Function<@A<int>() T>(T)? f;
+void method1<@A<String>() T>(T t) {}
+void method2(void Function<@A<num>() T>(T) f) {}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect
new file mode 100644
index 0000000..6ab9190
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:9:22: Error: Too few positional arguments: 1 required, 0 given.
+// void Function<@A<int>() T>(T)? f;
+//                      ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:18:35: Error: Too few positional arguments: 1 required, 0 given.
+// void method2(void Function<@A<num>() T>(T) f) {}
+//                                   ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void local<@A<double>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:26:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void Function<@A<int>() T>(T)? f;
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+  void local<@A<double>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect
new file mode 100644
index 0000000..edc7f22
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void
+  ;
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect
new file mode 100644
index 0000000..6ab9190
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:9:22: Error: Too few positional arguments: 1 required, 0 given.
+// void Function<@A<int>() T>(T)? f;
+//                      ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:18:35: Error: Too few positional arguments: 1 required, 0 given.
+// void method2(void Function<@A<num>() T>(T) f) {}
+//                                   ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void local<@A<double>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:26:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void Function<@A<int>() T>(T)? f;
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+  void local<@A<double>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart
new file mode 100644
index 0000000..551ae01
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart
@@ -0,0 +1,25 @@
+// 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<T> {
+  const A();
+}
+
+void Function<@A<int>() T>(T)? f;
+
+typedef F = void Function<@A<bool>() T>(T);
+
+typedef void G<@A<dynamic>() T>(T t);
+
+void method1<@A<String>() T>(T t) {}
+
+void method2(void Function<@A<num>() T>(T) f) {}
+
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {
+  void local<@A<double>() T>(T t) {}
+
+  void Function<@A<int>() T>(T)? f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect
new file mode 100644
index 0000000..493cc77
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C2 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C3 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A<dynamic> {}
+  #C2 = self::A<core::String> {}
+  #C3 = self::A<core::double> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..493cc77
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C2 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C3 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A<dynamic> {}
+  #C2 = self::A<core::String> {}
+  #C3 = self::A<core::double> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline.expect
new file mode 100644
index 0000000..e9838db
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+class A<T> {
+  const A();
+}
+
+void Function<@A<int>() T>(T)? f;
+typedef F = void Function<@A<bool>() T>(T);
+typedef void G<@A<dynamic>() T>(T t);
+void method1<@A<String>() T>(T t) {}
+void method2(void Function<@A<num>() T>(T) f) {}
+
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..32b733c
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class A<T> {
+  const A();
+}
+
+class Class<T extends void Function<@A<void>() S>(S)> {}
+
+main() {}
+typedef F = void Function<@A<bool>() T>(T);
+typedef void G<@A<dynamic>() T>(T t);
+void Function<@A<int>() T>(T)? f;
+void method1<@A<String>() T>(T t) {}
+void method2(void Function<@A<num>() T>(T) f) {}
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect
new file mode 100644
index 0000000..c1ead73
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C2 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C3 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A<dynamic> {}
+  #C2 = self::A<core::String*> {}
+  #C3 = self::A<core::double*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect
new file mode 100644
index 0000000..778e91b
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@self::A::•<dynamic>() contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@self::A::•<core::String>() T extends core::Object? = dynamic>(self::method1::T% t) → void
+  ;
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///function_type_parameter.dart:13:17 -> InstanceConstant(const A<dynamic>{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///function_type_parameter.dart:15:15 -> InstanceConstant(const A<String*>{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect
new file mode 100644
index 0000000..c1ead73
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C2 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C3 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A<dynamic> {}
+  #C2 = self::A<core::String*> {}
+  #C3 = self::A<core::double*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart
index 97e6015..5937e4a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart
@@ -9,14 +9,14 @@
   const Foo(List<String> l);
 }
 
-class C<@Foo(const []) T> {}
+class C<@Foo(/*@typeArgs=String**/ const []) T> {}
 
-typedef void F<@Foo(const []) T>();
+typedef void F<@Foo(/*@typeArgs=String**/ const []) T>();
 
-void f<@Foo(const []) T>() {}
+void f<@Foo(/*@typeArgs=String**/ const []) T>() {}
 
 class D {
-  void m<@Foo(const []) T>() {}
+  void m<@Foo(/*@typeArgs=String**/ const []) T>() {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.expect
index 33fedb6..60436b4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef F<@#C1 unrelated T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object /*hasConstConstructor*/  {
   const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends core::Object* = dynamic> extends core::Object {
+class C<@#C1 T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
@@ -37,7 +37,7 @@
   synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method m<T extends core::Object* = dynamic>() → void {}
+  method m<@#C1 T extends core::Object* = dynamic>() → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -49,5 +49,15 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static method f<T extends core::Object* = dynamic>() → void {}
+static method f<@#C1 T extends core::Object* = dynamic>() → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.outline.expect
index 801fd15..c523b74 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef F<@self::Foo::•(const <core::String*>[]) unrelated T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object /*hasConstConstructor*/  {
   const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends core::Object* = dynamic> extends core::Object {
+class C<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -35,7 +35,7 @@
 class D extends core::Object {
   synthetic constructor •() → self::D*
     ;
-  method m<T extends core::Object* = dynamic>() → void
+  method m<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -48,7 +48,15 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static method f<T extends core::Object* = dynamic>() → void
+static method f<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:14:17 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:12:10 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:19:11 -> InstanceConstant(const Foo{})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:16:9 -> InstanceConstant(const Foo{})
+Extra constant evaluation: evaluated: 4, effectively constant: 4
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.transformed.expect
index 33fedb6..60436b4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef F<@#C1 unrelated T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object /*hasConstConstructor*/  {
   const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends core::Object* = dynamic> extends core::Object {
+class C<@#C1 T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
@@ -37,7 +37,7 @@
   synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method m<T extends core::Object* = dynamic>() → void {}
+  method m<@#C1 T extends core::Object* = dynamic>() → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -49,5 +49,15 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static method f<T extends core::Object* = dynamic>() → void {}
+static method f<@#C1 T extends core::Object* = dynamic>() → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.outline.expect
index 7d68ee4..a88013f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.outline.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
+@self::Foo::•(const <core::String*>[])
 typedef F = () →* void;
 class Foo extends core::Object /*hasConstConstructor*/  {
   const constructor •(core::List<core::String*>* l) → self::Foo*
@@ -20,3 +21,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///downwards_inference_annotations_typedef.dart:12:2 -> InstanceConstant(const Foo{})
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 8c5f5a2..eb6976c 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 58;
+  UInt32 formatVersion = 59;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -337,6 +337,7 @@
   Byte tag = 115;
   CanonicalNameReference canonicalName;
   StringReference name;
+  List<Expression> annotations;
   UriReference fileUri;
   FileOffset fileOffset;
   List<TypeParameter> typeParameters;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 4ed539a..0b0de7e 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -577,9 +577,10 @@
 ///     export <url>;
 ///
 /// optionally with metadata and [Combinators].
-class LibraryDependency extends TreeNode {
+class LibraryDependency extends TreeNode implements Annotatable {
   int flags;
 
+  @override
   final List<Expression> annotations;
 
   Reference importedLibraryReference;
@@ -630,6 +631,7 @@
   bool get isImport => !isExport;
   bool get isDeferred => flags & DeferredFlag != 0;
 
+  @override
   void addAnnotation(Expression annotation) {
     annotations.add(annotation..parent = this);
   }
@@ -675,14 +677,17 @@
 ///     part <url>;
 ///
 /// optionally with metadata.
-class LibraryPart extends TreeNode {
+class LibraryPart extends TreeNode implements Annotatable {
+  @override
   final List<Expression> annotations;
+
   final String partUri;
 
   LibraryPart(this.annotations, this.partUri) {
     setParents(annotations, this);
   }
 
+  @override
   void addAnnotation(Expression annotation) {
     annotations.add(annotation..parent = this);
   }
@@ -760,12 +765,14 @@
 }
 
 /// Declaration of a type alias.
-class Typedef extends NamedNode implements FileUriNode {
+class Typedef extends NamedNode implements FileUriNode, Annotatable {
   /// The URI of the source file that contains the declaration of this typedef.
   @override
   Uri? fileUri;
 
+  @override
   List<Expression> annotations = const <Expression>[];
+
   String name;
   final List<TypeParameter> typeParameters;
   // TODO(johnniwinther): Make this non-nullable.
@@ -834,6 +841,7 @@
     }
   }
 
+  @override
   void addAnnotation(Expression node) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
@@ -1412,7 +1420,7 @@
 ///
 /// The members are converted into top-level procedures and only accessible
 /// by reference in the [Extension] node.
-class Extension extends NamedNode implements FileUriNode {
+class Extension extends NamedNode implements Annotatable, FileUriNode {
   /// Name of the extension.
   ///
   /// If unnamed, the extension will be given a synthesized name by the
@@ -1440,6 +1448,18 @@
   /// by reference through [ExtensionMemberDescriptor].
   final List<ExtensionMemberDescriptor> members;
 
+  @override
+  List<Expression> annotations = const <Expression>[];
+
+  @override
+  void addAnnotation(Expression node) {
+    if (annotations.isEmpty) {
+      annotations = <Expression>[];
+    }
+    annotations.add(node);
+    node.parent = this;
+  }
+
   Extension(
       {required this.name,
       List<TypeParameter>? typeParameters,
@@ -9843,7 +9863,7 @@
 /// When this occurs as a statement, it must be a direct child of a [Block].
 //
 // DESIGN TODO: Should we remove the 'final' modifier from variables?
-class VariableDeclaration extends Statement {
+class VariableDeclaration extends Statement implements Annotatable {
   /// Offset of the equals sign in the source file it comes from.
   ///
   /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset])
@@ -9855,6 +9875,7 @@
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
   /// annotations if needed.
+  @override
   List<Expression> annotations = const <Expression>[];
 
   /// For named parameters, this is the name of the parameter. No two named
@@ -10024,6 +10045,7 @@
     annotations = const <Expression>[];
   }
 
+  @override
   void addAnnotation(Expression annotation) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
@@ -11909,13 +11931,14 @@
 /// Type parameters declared by a [FunctionType] are orphans and have a `null`
 /// parent pointer.  [TypeParameter] objects should not be shared between
 /// different [FunctionType] objects.
-class TypeParameter extends TreeNode {
+class TypeParameter extends TreeNode implements Annotatable {
   int flags = 0;
 
   /// List of metadata annotations on the type parameter.
   ///
   /// This defaults to an immutable empty list. Use [addAnnotation] to add
   /// annotations if needed.
+  @override
   List<Expression> annotations = const <Expression>[];
 
   String? name; // Cosmetic name.
@@ -11970,6 +11993,7 @@
         : (flags & ~FlagGenericCovariantImpl);
   }
 
+  @override
   void addAnnotation(Expression annotation) {
     if (annotations.isEmpty) {
       annotations = <Expression>[];
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 4384c4d..15ebc86 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1359,6 +1359,8 @@
       return true;
     }());
 
+    node.annotations = readAnnotationList(node);
+
     Uri? fileUri = readUriReference();
     node.fileOffset = readOffset();
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 0d63926..5b2eec7 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2420,6 +2420,7 @@
     writeByte(Tag.Extension);
     writeNonNullCanonicalNameReference(getCanonicalNameOfExtension(node));
     writeStringReference(node.name);
+    writeAnnotationList(node.annotations);
     writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
 
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 7047f59..5e9fa25 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -174,7 +174,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 58;
+  static const int BinaryFormatVersion = 59;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index fe66446..9482f51 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1334,6 +1334,7 @@
   }
 
   visitExtension(Extension node) {
+    writeAnnotationList(node.annotations);
     writeIndentation();
     writeWord('extension');
     writeWord(getExtensionName(node));
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 6a4d1b1..2e1eee9 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 58;
-static const uint32_t kMaxSupportedKernelFormatVersion = 58;
+static const uint32_t kMinSupportedKernelFormatVersion = 59;
+static const uint32_t kMaxSupportedKernelFormatVersion = 59;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 58072ba..c9ff576 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1171,6 +1171,7 @@
       helper_.ReadTag();                     // read tag.
       helper_.SkipCanonicalNameReference();  // skip canonical name.
       helper_.SkipStringReference();         // skip name.
+      helper_.SkipListOfExpressions();       // skip annotations.
       helper_.ReadUInt();                    // read source uri index.
       helper_.ReadPosition();                // read file offset.
       helper_.SkipTypeParametersList();      // skip type parameter list.
diff --git a/tools/VERSION b/tools/VERSION
index ec78be6..aa81756 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 151
+PRERELEASE 152
 PRERELEASE_PATCH 0
\ No newline at end of file