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