Default parameters, more metadata, import dart:core.

R=brianwilkerson@google.com, paulberry@google.com

Change-Id: Ibf31dcc7e0fbea3935f75c7472a23eac4c2999eb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96522
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 7323e95..5cf726d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2810,6 +2810,10 @@
   DefaultParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
 
+  DefaultParameterElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created parameter element to have the given [name].
   DefaultParameterElementImpl.forNode(Identifier name) : super.forNode(name);
 
@@ -4370,14 +4374,26 @@
         var formalParameters = context.getFormalParameters(linkedNode);
         if (formalParameters != null) {
           _parameters = formalParameters.map((node) {
-            var name = context.getFormalParameterName(node);
-            var reference = containerRef.getChild(name);
-            reference.node = node;
-            return ParameterElementImpl.forLinkedNodeFactory(
-              this,
-              reference,
-              node,
-            );
+            if (node.kind == LinkedNodeKind.defaultFormalParameter) {
+              var parameterNode = node.defaultFormalParameter_parameter;
+              var name = context.getFormalParameterName(parameterNode);
+              var reference = containerRef.getChild(name);
+              reference.node = node;
+              return DefaultParameterElementImpl.forLinkedNode(
+                this,
+                reference,
+                node,
+              );
+            } else {
+              var name = context.getFormalParameterName(node);
+              var reference = containerRef.getChild(name);
+              reference.node = node;
+              return ParameterElementImpl.forLinkedNodeFactory(
+                this,
+                reference,
+                node,
+              );
+            }
           }).toList();
         } else {
           _parameters = const [];
@@ -7796,6 +7812,10 @@
   @override
   bool get isCovariant {
     if (linkedNode != null) {
+      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
+        var parameter = linkedNode.defaultFormalParameter_parameter;
+        return parameter.normalFormalParameter_isCovariant;
+      }
       return linkedNode.normalFormalParameter_isCovariant;
     }
     if (isExplicitlyCovariant || inheritsCovariant) {
@@ -7822,6 +7842,10 @@
   @override
   bool get isFinal {
     if (linkedNode != null) {
+      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
+        var parameter = linkedNode.defaultFormalParameter_parameter;
+        return parameter.simpleFormalParameter_keyword != 0;
+      }
       if (linkedNode.kind == LinkedNodeKind.fieldFormalParameter) {
         return false;
       }
@@ -7899,8 +7923,14 @@
     if (_parameterKind != null) return _parameterKind;
 
     if (linkedNode != null) {
-      // TODO(scheglov) implement
-      _parameterKind = ParameterKind.REQUIRED;
+      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
+        if (linkedNode.defaultFormalParameter_isNamed) {
+          return _parameterKind = ParameterKind.NAMED;
+        } else {
+          return _parameterKind = ParameterKind.POSITIONAL;
+        }
+      }
+      return _parameterKind = ParameterKind.REQUIRED;
     }
     if (unlinkedParam != null) {
       switch (unlinkedParam.kind) {
@@ -7932,7 +7962,13 @@
   DartType get type {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      return _type ??= enclosingUnit.linkedContext.getType(
+      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
+        var parameter = linkedNode.defaultFormalParameter_parameter;
+        return _type = enclosingUnit.linkedContext.getType(
+          parameter.simpleFormalParameter_type2,
+        );
+      }
+      return _type = enclosingUnit.linkedContext.getType(
         linkedNode.simpleFormalParameter_type2,
       );
     }
@@ -8819,7 +8855,7 @@
         var context = enclosingUnit.linkedContext;
         return _bound = context.getTypeAnnotationType(bound);
       } else {
-        return _bound = context.typeProvider.objectType;
+        return null;
       }
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 5feed77..33f51e3 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -263,17 +263,12 @@
 
   T _getElement<T extends Element>(int index) {
     var bundleContext = _unitContext.bundleContext;
-    var reference = bundleContext.referenceOfIndex(index);
-    return bundleContext.elementFactory.elementOfReference(reference);
+    return bundleContext.elementOfIndex(index);
   }
 
   List<T> _getElements<T extends Element>(List<int> indexList) {
-    var result = List<T>(indexList.length);
-    for (var i = 0; i < indexList.length; ++i) {
-      var index = indexList[i];
-      result[i] = _getElement(index);
-    }
-    return result;
+    var bundleContext = _unitContext.bundleContext;
+    return bundleContext.elementsOfIndexes(indexList);
   }
 
   Token _getToken(int index) {
@@ -1162,7 +1157,7 @@
       leftBracket: _getToken(data.setOrMapLiteral_leftBracket),
       typeArguments: readNode(data.typedLiteral_typeArguments),
       rightBracket: _getToken(data.setOrMapLiteral_leftBracket),
-    );
+    )..staticType = _readType(data.expression_type);
     if (data.setOrMapLiteral_isMap) {
       node.becomeMap();
     } else if (data.setOrMapLiteral_isSet) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index b437a4e..1859e5e 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/linking_bundle_context.dart';
@@ -1265,6 +1266,10 @@
   int _getReferenceIndex(Element element) {
     if (element == null) return 0;
 
+    if (element is Member) {
+      element = (element as Member).baseElement;
+    }
+
     var reference = (element as ElementImpl).reference;
     if (identical(element, DynamicElementImpl.instance)) {
       reference = _linkingBundleContext.dynamicReference;
diff --git a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
index f4436fd..f029ec9 100644
--- a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
@@ -68,6 +68,13 @@
       }
     }
     if (!hasDartCore) {
+      var importDartCore = LinkedNodeBuilder.importDirective(
+        uriBasedDirective_uri: LinkedNodeBuilder.simpleStringLiteral(
+          simpleStringLiteral_value: 'dart:core',
+        ),
+      )..isSynthetic = true;
+      units[0].node.compilationUnit_directives.add(importDartCore);
+
       // TODO(scheglov) This works only when dart:core is linked
       var references = linker.elementFactory.exportsOfLibrary('dart:core');
       _importExportedReferences(references);
diff --git a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
index d814b26a..fbaf454 100644
--- a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
@@ -19,6 +20,20 @@
       : _references = List<Reference>.filled(referencesData.name.length, null,
             growable: true);
 
+  T elementOfIndex<T extends Element>(int index) {
+    var reference = referenceOfIndex(index);
+    return elementFactory.elementOfReference(reference);
+  }
+
+  List<T> elementsOfIndexes<T extends Element>(List<int> indexList) {
+    var result = List<T>(indexList.length);
+    for (var i = 0; i < indexList.length; ++i) {
+      var index = indexList[i];
+      result[i] = elementOfIndex(index);
+    }
+    return result;
+  }
+
   InterfaceType getInterfaceType(LinkedNodeType linkedType) {
     var type = getType(linkedType);
     if (type is InterfaceType && !type.element.isEnum) {
@@ -31,6 +46,20 @@
     var kind = linkedType.kind;
     if (kind == LinkedNodeTypeKind.dynamic_) {
       return DynamicTypeImpl.instance;
+    } else if (kind == LinkedNodeTypeKind.function) {
+      var returnType = getType(linkedType.functionReturnType);
+      var typeParameters = linkedType.functionTypeParameters
+          .map(referenceOfIndex)
+          .map(elementFactory.elementOfReference)
+          .cast<TypeParameterElement>()
+          .toList();
+      var formalParameters = linkedType.functionFormalParameters
+          .map(referenceOfIndex)
+          .map(elementFactory.elementOfReference)
+          .cast<ParameterElement>()
+          .toList();
+      // TODO(scheglov) Rework this to purely synthetic types.
+      return FunctionElementImpl.synthetic(formalParameters, returnType).type;
     } else if (kind == LinkedNodeTypeKind.interface) {
       var reference = referenceOfIndex(linkedType.interfaceClass);
       Element element = elementFactory.elementOfReference(reference);
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index aa95877..7653ed6 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -87,9 +87,7 @@
 
     if (parentName == '@function') {
       CompilationUnitElementImpl enclosing = elementOfReference(parent2);
-      enclosing.functions;
-      assert(reference.element != null);
-      return reference.element;
+      return _function(enclosing, reference);
     }
 
     if (parentName == '@getter') {
@@ -97,11 +95,14 @@
       return _getter(enclosing, reference);
     }
 
+    if (parentName == '@method') {
+      var enclosing = elementOfReference(parent2);
+      return _method(enclosing, reference);
+    }
+
     if (parentName == '@parameter') {
       ExecutableElementImpl enclosing = elementOfReference(parent2);
-      enclosing.parameters;
-      assert(reference.element != null);
-      return reference.element;
+      return _parameter(enclosing, reference);
     }
 
     if (parentName == '@typeAlias') {
@@ -111,10 +112,7 @@
 
     if (parentName == '@typeParameter') {
       var enclosing = elementOfReference(parent2) as TypeParameterizedElement;
-      enclosing.typeParameters;
-      // Requesting type parameters sets elements for all their references.
-      assert(reference.element != null);
-      return reference.element;
+      return _typeParameter(enclosing, reference);
     }
 
     if (parentName == '@unit') {
@@ -199,6 +197,12 @@
     return reference.element = libraryElement;
   }
 
+  Element _function(CompilationUnitElementImpl enclosing, Reference reference) {
+    enclosing.functions;
+    assert(reference.element != null);
+    return reference.element;
+  }
+
   PropertyAccessorElementImpl _getter(
       ElementImpl enclosing, Reference reference) {
     if (enclosing is ClassElementImpl) {
@@ -252,6 +256,19 @@
     }
   }
 
+  MethodElementImpl _method(ClassElementImpl enclosing, Reference reference) {
+    enclosing.methods;
+    // Requesting methods sets elements for all of them.
+    assert(reference.element != null);
+    return reference.element;
+  }
+
+  Element _parameter(ExecutableElementImpl enclosing, Reference reference) {
+    enclosing.parameters;
+    assert(reference.element != null);
+    return reference.element;
+  }
+
   GenericTypeAliasElementImpl _typeAlias(
       CompilationUnitElementImpl unit, Reference reference) {
     if (reference.node == null) {
@@ -264,6 +281,14 @@
       reference.node,
     );
   }
+
+  Element _typeParameter(
+      TypeParameterizedElement enclosing, Reference reference) {
+    enclosing.typeParameters;
+    // Requesting type parameters sets elements for all their references.
+    assert(reference.element != null);
+    return reference.element;
+  }
 }
 
 class _Library {
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index fcaac18..b1bb1f4 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -93,6 +93,11 @@
         kind == LinkedNodeKind.variableDeclaration) {
       return node.annotatedNode_metadata;
     }
+    if (kind == LinkedNodeKind.fieldFormalParameter ||
+        kind == LinkedNodeKind.functionTypedFormalParameter ||
+        kind == LinkedNodeKind.simpleFormalParameter) {
+      return node.normalFormalParameter_metadata;
+    }
     return const <LinkedNode>[];
   }
 
@@ -148,6 +153,8 @@
     } else if (kind == LinkedNodeKind.classDeclaration ||
         kind == LinkedNodeKind.mixinDeclaration) {
       typeParameterList = node.classOrMixinDeclaration_typeParameters;
+    } else if (kind == LinkedNodeKind.constructorDeclaration) {
+      return const [];
     } else if (kind == LinkedNodeKind.functionDeclaration) {
       return getTypeParameters(node.functionDeclaration_functionExpression);
     } else if (kind == LinkedNodeKind.functionExpression) {
@@ -331,6 +338,9 @@
   }
 
   Expression readInitializer(LinkedNode linkedNode) {
+    if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
+      return readNode(linkedNode.defaultFormalParameter_defaultValue);
+    }
     return readNode(linkedNode.variableDeclaration_initializer);
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index 8c36981..2030086 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -34,6 +34,12 @@
         _class(unit, unitDeclaration);
       } else if (kind == LinkedNodeKind.enumDeclaration) {
         _enumDeclaration(unit, unitDeclaration);
+      } else if (kind == LinkedNodeKind.functionDeclaration) {
+        var function = unitDeclaration.functionDeclaration_functionExpression;
+        _formalParameterList(
+          unit,
+          function.functionExpression_formalParameters,
+        );
       } else if (kind == LinkedNodeKind.topLevelVariableDeclaration) {
         _variables(
           unit,
@@ -63,6 +69,11 @@
           classMember,
           classMember.fieldDeclaration_fields,
         );
+      } else if (kind == LinkedNodeKind.methodDeclaration) {
+        _formalParameterList(
+          unit,
+          classMember.methodDeclaration_formalParameters,
+        );
       }
     }
   }
@@ -76,6 +87,23 @@
     }
   }
 
+  void _formalParameterList(UnitBuilder unit, LinkedNodeBuilder node) {
+    if (node == null) return;
+
+    for (var parameter in node.formalParameterList_parameters) {
+      if (parameter.kind == LinkedNodeKind.defaultFormalParameter) {
+        var actual = parameter.defaultFormalParameter_parameter;
+        var unresolved = actual.normalFormalParameter_metadata;
+        var resolved = _list(unit, unresolved);
+        actual.normalFormalParameter_metadata = resolved;
+      } else {
+        var unresolved = parameter.normalFormalParameter_metadata;
+        var resolved = _list(unit, unresolved);
+        parameter.normalFormalParameter_metadata = resolved;
+      }
+    }
+  }
+
   List<LinkedNodeBuilder> _list(UnitBuilder unit, List<LinkedNode> unresolved) {
     var resolved = List<LinkedNodeBuilder>(unresolved.length);
     for (var i = 0; i < unresolved.length; ++i) {
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 75c798f..f044c1b 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -143,6 +143,9 @@
   }
 
   void _functionDeclaration(LinkedNodeBuilder node) {
+    var name = unit.context.getUnitMemberName(node);
+    reference = reference.getChild('@function').getChild(name);
+
     var function = node.functionDeclaration_functionExpression;
     var typeParameters = function.functionExpression_typeParameters;
     _withTypeParameters(typeParameters, () {
@@ -157,6 +160,8 @@
 
       _node(function.functionExpression_formalParameters);
     });
+
+    reference = reference.parent.parent;
   }
 
   void _functionExpression(LinkedNodeBuilder node) {
@@ -265,6 +270,8 @@
       _compilationUnit(node);
     } else if (node.kind == LinkedNodeKind.constructorDeclaration) {
       _constructorDeclaration(node);
+    } else if (node.kind == LinkedNodeKind.defaultFormalParameter) {
+      _node(node.defaultFormalParameter_parameter);
     } else if (node.kind == LinkedNodeKind.enumDeclaration) {
       _enumDeclaration(node);
     } else if (node.kind == LinkedNodeKind.enumConstantDeclaration) {
diff --git a/pkg/analyzer/lib/src/summary2/tokens_context.dart b/pkg/analyzer/lib/src/summary2/tokens_context.dart
index ba5ea17..36b9d5a 100644
--- a/pkg/analyzer/lib/src/summary2/tokens_context.dart
+++ b/pkg/analyzer/lib/src/summary2/tokens_context.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/tokens_writer.dart';
 
@@ -24,6 +25,23 @@
   TokensContext.fromResult(
       this._tokens, this._indexToToken, this._tokenToIndex);
 
+  /// TODO(scheglov) Not used yet, maybe remove.
+  int addSyntheticToken(
+      UnlinkedTokenKind kind, UnlinkedTokenType type, String lexeme) {
+    var index = _tokens.kind.length;
+    UnlinkedTokensBuilder tokens = _tokens;
+    tokens.kind.add(kind);
+    tokens.lexeme.add(lexeme);
+    tokens.offset.add(0);
+    tokens.length.add(0);
+    tokens.type.add(type);
+    tokens.next.add(0);
+    tokens.endGroup.add(0);
+    tokens.precedingComment.add(0);
+    tokens.isSynthetic.add(true);
+    return index;
+  }
+
   int indexOfToken(Token token) {
     if (token == null) return 0;
 
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index d714997..ca02fea 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -57,13 +57,15 @@
     bool withConstElements: true,
     bool withOffsets: false,
     bool withSyntheticAccessors: false,
-    bool withSyntheticFields: false}) {
+    bool withSyntheticFields: false,
+    bool withTypes: false}) {
   var writer = new _ElementWriter(
       withCodeRanges: withCodeRanges,
       withConstElements: withConstElements,
       withOffsets: withOffsets,
       withSyntheticAccessors: withSyntheticAccessors,
-      withSyntheticFields: withSyntheticFields);
+      withSyntheticFields: withSyntheticFields,
+      withTypes: withTypes);
   writer.writeLibraryElement(library);
 
   String actualText = writer.buffer.toString();
@@ -129,6 +131,7 @@
   final bool withConstElements;
   final bool withSyntheticAccessors;
   final bool withSyntheticFields;
+  final bool withTypes;
   final StringBuffer buffer = new StringBuffer();
 
   _ElementWriter(
@@ -136,7 +139,8 @@
       this.withConstElements: true,
       this.withOffsets: false,
       this.withSyntheticAccessors: false,
-      this.withSyntheticFields: false});
+      this.withSyntheticFields: false,
+      this.withTypes: false});
 
   bool isDynamicType(DartType type) => type is DynamicTypeImpl;
 
@@ -387,6 +391,8 @@
       }
       if (e.typeArguments != null) {
         writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
+      } else if (withTypes) {
+        writeInterfaceTypeArgsComment(e);
       }
       writeList('[', ']', e.elements2, ', ', writeExpression,
           includeEmpty: true);
@@ -399,6 +405,8 @@
       }
       if (e.typeArguments != null) {
         writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
+      } else if (withTypes) {
+        writeInterfaceTypeArgsComment(e);
       }
       writeList('{', '}', e.elements2, ', ', writeExpression,
           includeEmpty: true);
@@ -479,6 +487,9 @@
           (Token token) => buffer.write(token.lexeme));
     } else if (e is ThisExpression) {
       buffer.write('this');
+    } else if (e is ThrowExpression) {
+      buffer.write('throw ');
+      writeExpression(e.expression);
     } else if (e is TypeName) {
       writeExpression(e.name);
       if (e.typeArguments != null) {
@@ -569,6 +580,11 @@
     }
   }
 
+  void writeInterfaceTypeArgsComment(Expression e) {
+    var typeArguments = (e.staticType as InterfaceType).typeArguments;
+    writeList('/*typeArgs=', '*/', typeArguments, ',', writeType);
+  }
+
   void writeLibraryElement(LibraryElement e) {
     if (e.documentationComment != null) {
       buffer.writeln(e.documentationComment);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index f3b69e9..1d051a9 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -27,6 +27,9 @@
 class ResynthesizeAst2Test extends ResynthesizeTestStrategyTwoPhase
     with ResynthesizeTestCases {
   @override
+  bool get isAstBasedSummary => true;
+
+  @override
   Future<LibraryElementImpl> checkLibrary(String text,
       {bool allowErrors = false, bool dumpSummaries = false}) async {
     var dartCoreSource = sourceFactory.forUri('dart:core');
@@ -54,6 +57,7 @@
 
 abstract class String {
   int get length;
+  String operator +(String other);
 }
 
 abstract class Symbol {}
@@ -64,9 +68,46 @@
 
 abstract class double extends num {}
 
-abstract class int extends num {}
+abstract class int extends num {
+  bool get isEven => false;
+  bool get isNegative;
+  
+  int operator &(int other);
+  int operator -();
+  int operator <<(int shiftAmount);
+  int operator >>(int shiftAmount);
+  int operator ^(int other);
+  int operator |(int other);
+  int operator ~();
+}
 
-abstract class num implements Comparable<num> {}
+abstract class num implements Comparable<num> {
+  bool operator <(num other);
+  bool operator <=(num other);
+  bool operator ==(Object other);
+  bool operator >(num other);
+  bool operator >=(num other);
+  
+  double operator /(num other);
+  double toDouble();
+  
+  int operator <<(int other);
+  int operator >>(int other);
+  int operator ^(int other);
+  int operator |(int other);
+  int operator ~();
+  int operator ~/(num other);
+  
+  int round();
+  int toInt();
+  num abs();
+  
+  num operator %(num other);
+  num operator *(num other);
+  num operator +(num other);
+  num operator -();
+  num operator -(num other);
+}
 ''';
 
     var dartCoreResult = _link(dartCoreSource, dartCoreCode);
@@ -180,18 +221,6 @@
 
   @override
   @failingTest
-  test_class_setter_invalid_named_parameter() async {
-    await super.test_class_setter_invalid_named_parameter();
-  }
-
-  @override
-  @failingTest
-  test_class_setter_invalid_optional_parameter() async {
-    await super.test_class_setter_invalid_optional_parameter();
-  }
-
-  @override
-  @failingTest
   test_class_type_parameters_f_bound_complex() async {
     await super.test_class_type_parameters_f_bound_complex();
   }
@@ -312,18 +341,6 @@
 
   @override
   @failingTest
-  test_const_invokeConstructor_generic_named() async {
-    await super.test_const_invokeConstructor_generic_named();
-  }
-
-  @override
-  @failingTest
-  test_const_invokeConstructor_generic_named_imported() async {
-    await super.test_const_invokeConstructor_generic_named_imported();
-  }
-
-  @override
-  @failingTest
   test_const_invokeConstructor_generic_named_imported_withPrefix() async {
     await super
         .test_const_invokeConstructor_generic_named_imported_withPrefix();
@@ -331,24 +348,6 @@
 
   @override
   @failingTest
-  test_const_invokeConstructor_generic_noTypeArguments() async {
-    await super.test_const_invokeConstructor_generic_noTypeArguments();
-  }
-
-  @override
-  @failingTest
-  test_const_invokeConstructor_generic_unnamed() async {
-    await super.test_const_invokeConstructor_generic_unnamed();
-  }
-
-  @override
-  @failingTest
-  test_const_invokeConstructor_generic_unnamed_imported() async {
-    await super.test_const_invokeConstructor_generic_unnamed_imported();
-  }
-
-  @override
-  @failingTest
   test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
     await super
         .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
@@ -416,24 +415,6 @@
 
   @override
   @failingTest
-  test_const_length_staticMethod() async {
-    await super.test_const_length_staticMethod();
-  }
-
-  @override
-  @failingTest
-  test_const_list_inferredType() async {
-    await super.test_const_list_inferredType();
-  }
-
-  @override
-  @failingTest
-  test_const_map_inferredType() async {
-    await super.test_const_map_inferredType();
-  }
-
-  @override
-  @failingTest
   test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
     await super
         .test_const_parameterDefaultValue_initializingFormal_functionTyped();
@@ -454,24 +435,12 @@
 
   @override
   @failingTest
-  test_const_parameterDefaultValue_normal() async {
-    await super.test_const_parameterDefaultValue_normal();
-  }
-
-  @override
-  @failingTest
   test_const_reference_staticField_imported_withPrefix() async {
     await super.test_const_reference_staticField_imported_withPrefix();
   }
 
   @override
   @failingTest
-  test_const_reference_staticMethod() async {
-    await super.test_const_reference_staticMethod();
-  }
-
-  @override
-  @failingTest
   test_const_reference_staticMethod_imported() async {
     await super.test_const_reference_staticMethod_imported();
   }
@@ -484,24 +453,12 @@
 
   @override
   @failingTest
-  test_const_reference_topLevelFunction() async {
-    await super.test_const_reference_topLevelFunction();
-  }
-
-  @override
-  @failingTest
   test_const_reference_topLevelFunction_generic() async {
     await super.test_const_reference_topLevelFunction_generic();
   }
 
   @override
   @failingTest
-  test_const_reference_topLevelFunction_imported() async {
-    await super.test_const_reference_topLevelFunction_imported();
-  }
-
-  @override
-  @failingTest
   test_const_reference_topLevelFunction_imported_withPrefix() async {
     await super.test_const_reference_topLevelFunction_imported_withPrefix();
   }
@@ -520,12 +477,6 @@
 
   @override
   @failingTest
-  test_const_reference_type() async {
-    await super.test_const_reference_type();
-  }
-
-  @override
-  @failingTest
   test_const_reference_type_functionType() async {
     await super.test_const_reference_type_functionType();
   }
@@ -556,48 +507,6 @@
 
   @override
   @failingTest
-  test_const_topLevel_binary() async {
-    await super.test_const_topLevel_binary();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_conditional() async {
-    await super.test_const_topLevel_conditional();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_identical() async {
-    await super.test_const_topLevel_identical();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_parenthesis() async {
-    await super.test_const_topLevel_parenthesis();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_prefix() async {
-    await super.test_const_topLevel_prefix();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_throw() async {
-    await super.test_const_topLevel_throw();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_typedList() async {
-    await super.test_const_topLevel_typedList();
-  }
-
-  @override
-  @failingTest
   test_const_topLevel_typedList_importedWithPrefix() async {
     await super.test_const_topLevel_typedList_importedWithPrefix();
   }
@@ -610,12 +519,6 @@
 
   @override
   @failingTest
-  test_const_topLevel_typedMap() async {
-    await super.test_const_topLevel_typedMap();
-  }
-
-  @override
-  @failingTest
   test_constExpr_pushReference_field_simpleIdentifier() async {
     await super.test_constExpr_pushReference_field_simpleIdentifier();
   }
@@ -1061,18 +964,6 @@
 
   @override
   @failingTest
-  test_function_parameter_kind_named() async {
-    await super.test_function_parameter_kind_named();
-  }
-
-  @override
-  @failingTest
-  test_function_parameter_kind_positional() async {
-    await super.test_function_parameter_kind_positional();
-  }
-
-  @override
-  @failingTest
   test_function_parameter_parameters() async {
     await super.test_function_parameter_parameters();
   }
@@ -1091,12 +982,6 @@
 
   @override
   @failingTest
-  test_function_type_parameter() async {
-    await super.test_function_type_parameter();
-  }
-
-  @override
-  @failingTest
   test_function_type_parameter_with_function_typed_parameter() async {
     await super.test_function_type_parameter_with_function_typed_parameter();
   }
@@ -1237,12 +1122,6 @@
 
   @override
   @failingTest
-  test_infer_instanceCreation_fromArguments() async {
-    await super.test_infer_instanceCreation_fromArguments();
-  }
-
-  @override
-  @failingTest
   test_inference_issue_32394() async {
     await super.test_inference_issue_32394();
   }
@@ -1428,24 +1307,12 @@
 
   @override
   @failingTest
-  test_invalid_nameConflict_imported() async {
-    await super.test_invalid_nameConflict_imported();
-  }
-
-  @override
-  @failingTest
   test_invalid_nameConflict_imported_exported() async {
     await super.test_invalid_nameConflict_imported_exported();
   }
 
   @override
   @failingTest
-  test_invalid_nameConflict_local() async {
-    await super.test_invalid_nameConflict_local();
-  }
-
-  @override
-  @failingTest
   test_invalid_setterParameter_fieldFormalParameter() async {
     await super.test_invalid_setterParameter_fieldFormalParameter();
   }
@@ -1602,12 +1469,6 @@
 
   @override
   @failingTest
-  test_metadata_simpleFormalParameter() async {
-    await super.test_metadata_simpleFormalParameter();
-  }
-
-  @override
-  @failingTest
   test_metadata_simpleFormalParameter_withDefault() async {
     await super.test_metadata_simpleFormalParameter_withDefault();
   }
@@ -1700,30 +1561,12 @@
 
   @override
   @failingTest
-  test_parameterTypeNotInferred_constructor() async {
-    await super.test_parameterTypeNotInferred_constructor();
-  }
-
-  @override
-  @failingTest
   test_parameterTypeNotInferred_initializingFormal() async {
     await super.test_parameterTypeNotInferred_initializingFormal();
   }
 
   @override
   @failingTest
-  test_parameterTypeNotInferred_staticMethod() async {
-    await super.test_parameterTypeNotInferred_staticMethod();
-  }
-
-  @override
-  @failingTest
-  test_parameterTypeNotInferred_topLevelFunction() async {
-    await super.test_parameterTypeNotInferred_topLevelFunction();
-  }
-
-  @override
-  @failingTest
   test_parts() async {
     await super.test_parts();
   }
@@ -2018,12 +1861,6 @@
 
   @override
   @failingTest
-  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
-    await super.test_unresolved_annotation_namedConstructorCall_noConstructor();
-  }
-
-  @override
-  @failingTest
   test_unresolved_annotation_prefixedIdentifier_noDeclaration() async {
     await super.test_unresolved_annotation_prefixedIdentifier_noDeclaration();
   }
@@ -2069,12 +1906,6 @@
 
   @override
   @failingTest
-  test_unused_type_parameter() async {
-    await super.test_unused_type_parameter();
-  }
-
-  @override
-  @failingTest
   test_variable_getterInLib_setterInPart() async {
     await super.test_variable_getterInLib_setterInPart();
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 7c2c962..eba2037 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -2564,10 +2564,19 @@
     var library = await checkLibrary('''
 const Object x = const [1];
 ''');
-    checkElementText(library, '''
+    if (isAstBasedSummary) {
+      checkElementText(
+          library,
+          '''
+const Object x = const /*typeArgs=int*/[1];
+''',
+          withTypes: true);
+    } else {
+      checkElementText(library, '''
 const Object x = const <
         int/*location: dart:core;int*/>[1];
 ''');
+    }
   }
 
   test_const_map_inferredType() async {
@@ -2577,11 +2586,20 @@
     var library = await checkLibrary('''
 const Object x = const {1: 1.0};
 ''');
-    checkElementText(library, '''
+    if (isAstBasedSummary) {
+      checkElementText(
+          library,
+          '''
+const Object x = const /*typeArgs=int,double*/{1: 1.0};
+''',
+          withTypes: true);
+    } else {
+      checkElementText(library, '''
 const Object x = const <
         int/*location: dart:core;int*/,
         double/*location: dart:core;double*/>{1: 1.0};
 ''');
+    }
   }
 
   test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
@@ -3071,18 +3089,30 @@
     var library = await checkLibrary(r'''
 const vConditional = (1 == 2) ? 11 : 22;
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+const int vConditional = (1 == 2) ? 11 : 22;
+''');
+    } else {
+      checkElementText(library, r'''
 const int vConditional = 1 == 2 ? 11 : 22;
 ''');
+    }
   }
 
   test_const_topLevel_identical() async {
     var library = await checkLibrary(r'''
 const vIdentical = (1 == 2) ? 11 : 22;
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+const int vIdentical = (1 == 2) ? 11 : 22;
+''');
+    } else {
+      checkElementText(library, r'''
 const int vIdentical = 1 == 2 ? 11 : 22;
 ''');
+    }
   }
 
   test_const_topLevel_ifNull() async {
@@ -3174,10 +3204,16 @@
     var library = await checkLibrary(r'''
 const c = throw 42;
 ''');
-    // This is a bug.
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+const dynamic c = throw 42;
+''');
+    } else {
+      // This is a bug.
+      checkElementText(library, r'''
 const dynamic c;
 ''');
+    }
   }
 
   test_const_topLevel_typedList() async {
@@ -6807,6 +6843,23 @@
 ''');
   }
 
+  test_metadata_simpleFormalParameter_method() async {
+    var library = await checkLibrary('''
+const a = null;
+
+class C {
+  m(@a x) {}
+}
+''');
+    checkElementText(library, r'''
+class C {
+  dynamic m(@
+        a/*location: test.dart;a?*/ dynamic x) {}
+}
+const dynamic a = null;
+''');
+  }
+
   test_metadata_simpleFormalParameter_withDefault() async {
     var library = await checkLibrary('const a = null; f([@a x = null]) {}');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 0ceebdf..5094b40 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -98,6 +98,8 @@
 
   set declaredVariables(DeclaredVariables declaredVariables);
 
+  bool get isAstBasedSummary => false;
+
   MemoryResourceProvider get resourceProvider;
 
   void set testFile(String value);
@@ -132,6 +134,9 @@
 
   PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
 
+  @override
+  bool get isAstBasedSummary => false;
+
   TestSummaryResynthesizer encodeLibrary(Source source) {
     _serializeLibrary(source);