diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 1ed2a48..7f6e898 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -1864,14 +1864,18 @@
       NotificationManager notificationManager =
           analysisServer.notificationManager;
       String path = result.path;
-      if (notificationManager != null) {
-        notificationManager.recordAnalysisErrors(
-            NotificationManager.serverId,
-            path,
-            server.doAnalysisError_listFromEngine(
-                result.driver.analysisOptions, result.lineInfo, result.errors));
-      } else {
-        new_sendErrorNotification(analysisServer, result);
+      if (analysisServer.shouldSendErrorsNotificationFor(path)) {
+        if (notificationManager != null) {
+          notificationManager.recordAnalysisErrors(
+              NotificationManager.serverId,
+              path,
+              server.doAnalysisError_listFromEngine(
+                  result.driver.analysisOptions,
+                  result.lineInfo,
+                  result.errors));
+        } else {
+          new_sendErrorNotification(analysisServer, result);
+        }
       }
       CompilationUnit unit = result.unit;
       if (unit != null) {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 0a364cf..398fa65 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5831,8 +5831,9 @@
     ..add(_typeParameters)
     ..add(equals)
     ..add(_functionType);
+
   @override
-  Element get element => null;
+  Element get element => name.staticElement;
 
   @override
   GenericFunctionType get functionType => _functionType;
@@ -5855,7 +5856,6 @@
     return visitor.visitGenericTypeAlias(this);
   }
 
-  // TODO: implement element
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
@@ -9239,6 +9239,9 @@
    */
   TypeAnnotation _type;
 
+  @override
+  ParameterElement element;
+
   /**
    * Initialize a newly created formal parameter. Either or both of the
    * [comment] and [metadata] can be `null` if the parameter does not have the
@@ -9276,7 +9279,7 @@
       super._childEntities..add(keyword)..add(_type)..add(identifier);
 
   @override
-  Token get endToken => identifier.endToken;
+  Token get endToken => identifier?.endToken ?? type?.endToken;
 
   @override
   bool get isConst => keyword?.keyword == Keyword.CONST;
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 920e585..8090044 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -6428,12 +6428,16 @@
   @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
-    return _and(
+    if (_and(
         _isEqualNodes(node.documentationComment, toNode.documentationComment),
         _isEqualNodeLists(node.metadata, toNode.metadata),
         _isEqualTokens(node.keyword, toNode.keyword),
         _isEqualNodes(node.type, toNode.type),
-        _isEqualNodes(node.identifier, toNode.identifier));
+        _isEqualNodes(node.identifier, toNode.identifier))) {
+      (toNode as SimpleFormalParameterImpl).element = node.element;
+      return true;
+    }
+    return false;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 3524404..cea4664 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -1405,6 +1406,9 @@
       parameter.hasImplicitType = true;
     }
     _currentHolder.addParameter(parameter);
+    if (normalParameter is SimpleFormalParameterImpl) {
+      normalParameter.element = parameter;
+    }
     parameterName.staticElement = parameter;
     normalParameter.accept(this);
     return null;
@@ -1441,10 +1445,10 @@
 
   @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    ParameterElementImpl parameter;
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElementImpl parameter =
-          new ParameterElementImpl.forNode(parameterName);
+      parameter = new ParameterElementImpl.forNode(parameterName);
       _setCodeRange(parameter, node);
       parameter.isConst = node.isConst;
       parameter.isExplicitlyCovariant = node.covariantKeyword != null;
@@ -1455,11 +1459,12 @@
         parameter.hasImplicitType = true;
       }
       _currentHolder.addParameter(parameter);
-      parameterName.staticElement = parameter;
+      (node as SimpleFormalParameterImpl).element = parameter;
+      parameterName?.staticElement = parameter;
     }
     super.visitSimpleFormalParameter(node);
-    (node.element as ElementImpl).metadata =
-        _createElementAnnotations(node.metadata);
+    parameter ??= node.element;
+    parameter?.metadata = _createElementAnnotations(node.metadata);
     return null;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index f87f5f6..333fdef 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -122,8 +123,12 @@
 
   @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    NormalFormalParameter normalParameter = node.parameter;
     ParameterElement element =
-        _match(node.parameter.identifier, _walker.getParameter());
+        _match(normalParameter.identifier, _walker.getParameter());
+    if (normalParameter is SimpleFormalParameterImpl) {
+      normalParameter.element = node.identifier.staticElement;
+    }
     Expression defaultValue = node.defaultValue;
     if (defaultValue != null) {
       _walk(
@@ -133,7 +138,7 @@
       });
     }
     _walk(new ElementWalker.forParameter(element), () {
-      node.parameter.accept(this);
+      normalParameter.accept(this);
     });
     _resolveMetadata(node, node.metadata, element);
     return null;
@@ -365,6 +370,8 @@
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
+      (node as SimpleFormalParameterImpl).element =
+          node.identifier.staticElement;
       _walk(new ElementWalker.forParameter(element), () {
         super.visitSimpleFormalParameter(node);
       });
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 291f075..95c01cb 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -10076,7 +10076,7 @@
     } else {
       declaredType = _typeNameResolver._getType(typeName);
     }
-    Element element = node.identifier.staticElement;
+    Element element = node.element;
     if (element is ParameterElementImpl) {
       element.declaredType = declaredType;
     } else {
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 8d21db67..5ce754c 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -3202,9 +3203,9 @@
     InterfaceType intType = _typeProvider.intType;
     TypeName intTypeName = AstTestFactory.typeName4("int");
     String innerParameterName = "a";
-    SimpleFormalParameter parameter =
+    SimpleFormalParameterImpl parameter =
         AstTestFactory.simpleFormalParameter3(innerParameterName);
-    parameter.identifier.staticElement =
+    parameter.element = parameter.identifier.staticElement =
         ElementFactory.requiredParameter(innerParameterName);
     String outerParameterName = "p";
     FormalParameter node = AstTestFactory.fieldFormalParameter(
@@ -3415,8 +3416,8 @@
 
   test_visitSimpleFormalParameter_noType() async {
     // p
-    FormalParameter node = AstTestFactory.simpleFormalParameter3("p");
-    node.identifier.staticElement =
+    SimpleFormalParameterImpl node = AstTestFactory.simpleFormalParameter3("p");
+    node.element = node.identifier.staticElement =
         new ParameterElementImpl.forNode(AstTestFactory.identifier3("p"));
     expect(_resolveFormalParameter(node), same(_typeProvider.dynamicType));
     _listener.assertNoErrors();
@@ -3426,11 +3427,11 @@
     // int p
     InterfaceType intType = _typeProvider.intType;
     ClassElement intElement = intType.element;
-    FormalParameter node = AstTestFactory.simpleFormalParameter4(
+    SimpleFormalParameterImpl node = AstTestFactory.simpleFormalParameter4(
         AstTestFactory.typeName(intElement), "p");
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.forNode(identifier);
-    identifier.staticElement = element;
+    node.element = identifier.staticElement = element;
     expect(_resolveFormalParameter(node, [intElement]), same(intType));
     _listener.assertNoErrors();
   }
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
new file mode 100644
index 0000000..f995195
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -0,0 +1,749 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+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/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:test/test.dart';
+
+/**
+ * Set this path to automatically replace expectations in invocations of
+ * [checkElementText] with the new actual texts.
+ */
+const String _testPath = null;
+
+/**
+ * The list of replacements that update expectations.
+ */
+final List<_Replacement> _replacements = [];
+
+/**
+ * The cached content of the file with the [_testPath].
+ */
+String _testCode;
+
+/**
+ * The cache line information for the [_testPath] file.
+ */
+LineInfo _testCodeLines;
+
+void applyCheckElementTextReplacements() {
+  if (_testPath != null && _replacements.isNotEmpty) {
+    _replacements.sort((a, b) => b.offset - a.offset);
+    String newCode = _testCode;
+    _replacements.forEach((r) {
+      newCode =
+          newCode.substring(0, r.offset) + r.text + newCode.substring(r.end);
+    });
+    new File(_testPath).writeAsStringSync(newCode);
+  }
+}
+
+/**
+ * Write the given [library] elements into the canonical text presentation
+ * taking into account the specified 'withX' options. Then compare the
+ * actual text with the given [expected] one.
+ */
+void checkElementText(LibraryElement library, String expected,
+    {bool withOffsets: false}) {
+  var writer = new _ElementWriter(withOffsets: withOffsets);
+  writer.writeLibraryElement(library);
+  String actualText = writer.buffer.toString();
+  if (_testPath != null && actualText != expected) {
+    if (_testCode == null) {
+      _testCode = new File(_testPath).readAsStringSync();
+      _testCodeLines = new LineInfo.fromContent(_testCode);
+    }
+
+    try {
+      throw 42;
+    } catch (e, trace) {
+      String traceString = trace.toString();
+
+      // Assuming traceString contains "$_testPath:$invocationLine:$column",
+      // figure out the value of invocationLine.
+
+      int testFilePathOffset = traceString.indexOf(_testPath);
+      expect(testFilePathOffset, isNonNegative);
+
+      // Sanity check: there must be ':' after the path.
+      expect(traceString[testFilePathOffset + _testPath.length], ':');
+
+      int lineOffset = testFilePathOffset + _testPath.length + ':'.length;
+      int invocationLine = int.parse(traceString.substring(
+          lineOffset, traceString.indexOf(':', lineOffset)));
+      int invocationOffset = _testCodeLines.getOffsetOfLine(invocationLine - 1);
+
+      const String rawStringPrefix = "r'''";
+      int expectationOffset =
+          _testCode.indexOf(rawStringPrefix, invocationOffset);
+
+      // Sanity check: there must be no other strings or blocks.
+      expect(_testCode.substring(invocationOffset, expectationOffset),
+          isNot(anyOf(contains("'"), contains('"'), contains('}'))));
+
+      expectationOffset += rawStringPrefix.length;
+      int expectationEnd = _testCode.indexOf("'''", expectationOffset);
+
+      _replacements.add(new _Replacement(
+          expectationOffset, expectationEnd, '\n' + actualText));
+    }
+  }
+
+  // Print the actual text to simplify copy/paste into the expectation.
+  if (actualText != expected) {
+    print('-------- Actual --------');
+    print(actualText + '------------------------');
+  }
+
+  expect(actualText, expected);
+}
+
+/**
+ * Writes the canonical text presentation of elements.
+ */
+class _ElementWriter {
+  final bool withOffsets;
+  final StringBuffer buffer = new StringBuffer();
+
+  _ElementWriter({this.withOffsets: false});
+
+  bool isDynamicType(DartType type) => type is DynamicTypeImpl;
+
+  bool isEnumElement(Element e) {
+    return e is ClassElement && e.isEnum;
+  }
+
+  void newLineIfNotEmpty() {
+    if (buffer.isNotEmpty) {
+      buffer.writeln();
+    }
+  }
+
+  void writeBodyModifiers(ExecutableElement e) {
+    if (e.isAsynchronous) {
+      expect(e.isSynchronous, isFalse);
+      buffer.write(' async');
+    }
+
+    if (e.isSynchronous && e.isGenerator) {
+      expect(e.isAsynchronous, isFalse);
+      buffer.write(' sync');
+    }
+
+    writeIf(e.isGenerator, '*');
+  }
+
+  void writeClassElement(ClassElement e) {
+    writeDocumentation(e);
+    writeMetadata(e, '', '\n');
+
+    writeIf(e.isAbstract, 'abstract ');
+
+    if (e.isEnum) {
+      buffer.write('enum ');
+    } else {
+      buffer.write('class ');
+    }
+
+    writeIf(e.isMixinApplication, 'alias ');
+
+    writeName(e);
+    writeTypeParameterElements(e.typeParameters);
+
+    if (e.supertype != null && e.supertype.displayName != 'Object' ||
+        e.mixins.isNotEmpty) {
+      buffer.write(' extends ');
+      writeType(e.supertype);
+    }
+
+    writeList(' with ', '', e.mixins, ', ', writeType);
+    writeList(' implements ', '', e.interfaces, ', ', writeType);
+
+    buffer.writeln(' {');
+
+    e.fields.forEach(writeFieldElement);
+    e.accessors.forEach(writePropertyAccessorElement);
+
+    if (e.isEnum) {
+      expect(e.constructors, isEmpty);
+    } else {
+      expect(e.constructors, isNotEmpty);
+    }
+
+    if (e.constructors.length == 1 &&
+        e.constructors[0].isSynthetic &&
+        e.mixins.isEmpty) {
+      expect(e.constructors[0].parameters, isEmpty);
+    } else {
+      e.constructors.forEach(writeConstructorElement);
+    }
+
+    e.methods.forEach(writeMethodElement);
+    buffer.writeln('}');
+  }
+
+  void writeConstructorElement(ConstructorElement e) {
+    writeDocumentation(e, '  ');
+    writeMetadata(e, '  ', '\n');
+
+    buffer.write('  ');
+
+    writeIf(e.isSynthetic, 'synthetic ');
+    writeIf(e.isExternal, 'external ');
+    writeIf(e.isConst, 'const ');
+    writeIf(e.isFactory, 'factory ');
+
+    buffer.write(e.enclosingElement.name);
+    if (e.name.isNotEmpty) {
+      buffer.write('.');
+      writeName(e);
+    }
+
+    writeParameterElements(e.parameters);
+
+    {
+      ConstructorElement redirected = e.redirectedConstructor;
+      if (redirected != null) {
+        buffer.write(' = ');
+        buffer.write(redirected.returnType);
+        if (redirected.name.isNotEmpty) {
+          buffer.write('.');
+          buffer.write(redirected.name);
+        }
+      }
+    }
+
+    if (e is ConstructorElementImpl) {
+      if (e.constantInitializers != null) {
+        writeList(' : ', '', e.constantInitializers, ', ', writeExpression);
+      }
+    }
+
+    expect(e.isAsynchronous, isFalse);
+    expect(e.isGenerator, isFalse);
+
+    buffer.writeln(';');
+  }
+
+  void writeDocumentation(Element e, [String prefix = '']) {
+    if (e.documentationComment != null) {
+      buffer.write(prefix);
+      buffer.writeln(e.documentationComment);
+    }
+  }
+
+  void writeExportElement(ExportElement e) {
+    writeMetadata(e, '', '\n');
+    buffer.write('export ');
+    writeUri(e, e.exportedLibrary.source);
+
+    e.combinators.forEach(writeNamespaceCombinator);
+
+    buffer.writeln(';');
+  }
+
+  void writeExpression(AstNode e) {
+    if (e is Annotation) {
+      buffer.write('@');
+      writeExpression(e.name);
+      if (e.constructorName != null) {
+        buffer.write('.');
+        writeExpression(e.constructorName);
+      }
+      if (e.arguments != null) {
+        writeList('(', ')', e.arguments.arguments, ', ', writeExpression,
+            includeEmpty: true);
+      }
+    } else if (e is AssertInitializer) {
+      buffer.write('assert(');
+      writeExpression(e.condition);
+      if (e.message != null) {
+        buffer.write(', ');
+        writeExpression(e.message);
+      }
+      buffer.write(')');
+    } else if (e is BinaryExpression) {
+      writeExpression(e.leftOperand);
+      buffer.write(' ');
+      buffer.write(e.operator.lexeme);
+      buffer.write(' ');
+      writeExpression(e.rightOperand);
+    } else if (e is BooleanLiteral) {
+      buffer.write(e.value);
+    } else if (e is ConditionalExpression) {
+      writeExpression(e.condition);
+      buffer.write(' ? ');
+      writeExpression(e.thenExpression);
+      buffer.write(' : ');
+      writeExpression(e.elseExpression);
+    } else if (e is ConstructorFieldInitializer) {
+      writeExpression(e.fieldName);
+      buffer.write(' = ');
+      writeExpression(e.expression);
+    } else if (e is ConstructorName) {
+      writeExpression(e.type);
+      if (e.name != null) {
+        buffer.write('.');
+        writeExpression(e.name);
+      }
+    } else if (e is DoubleLiteral) {
+      buffer.write(e.value);
+    } else if (e is InstanceCreationExpression) {
+      buffer.write(e.keyword.lexeme);
+      buffer.write(' ');
+      writeExpression(e.constructorName);
+      writeList('(', ')', e.argumentList.arguments, ', ', writeExpression,
+          includeEmpty: true);
+    } else if (e is IntegerLiteral) {
+      buffer.write(e.value);
+    } else if (e is InterpolationExpression) {
+      buffer.write(r'${');
+      writeExpression(e.expression);
+      buffer.write(r'}');
+    } else if (e is InterpolationString) {
+      buffer.write(e.value.replaceAll("'", r"\'"));
+    } else if (e is ListLiteral) {
+      if (e.constKeyword != null) {
+        buffer.write('const ');
+      }
+      if (e.typeArguments != null) {
+        writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
+      }
+      writeList('[', ']', e.elements, ', ', writeExpression,
+          includeEmpty: true);
+    } else if (e is Label) {
+      writeExpression(e.label);
+      buffer.write(': ');
+    } else if (e is MapLiteral) {
+      if (e.constKeyword != null) {
+        buffer.write('const ');
+      }
+      if (e.typeArguments != null) {
+        writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
+      }
+      writeList('{', '}', e.entries, ', ', writeExpression, includeEmpty: true);
+    } else if (e is MapLiteralEntry) {
+      writeExpression(e.key);
+      buffer.write(': ');
+      writeExpression(e.value);
+    } else if (e is NamedExpression) {
+      writeExpression(e.name);
+      buffer.write(e.expression);
+    } else if (e is NullLiteral) {
+      buffer.write('null');
+    } else if (e is PrefixExpression) {
+      buffer.write(e.operator.lexeme);
+      writeExpression(e.operand);
+    } else if (e is PrefixedIdentifier) {
+      writeExpression(e.prefix);
+      buffer.write('.');
+      writeExpression(e.identifier);
+    } else if (e is PropertyAccess) {
+      writeExpression(e.target);
+      buffer.write('.');
+      writeExpression(e.propertyName);
+    } else if (e is RedirectingConstructorInvocation) {
+      buffer.write('this');
+      if (e.constructorName != null) {
+        buffer.write('.');
+        writeExpression(e.constructorName);
+      }
+      writeList('(', ')', e.argumentList.arguments, ', ', writeExpression,
+          includeEmpty: true);
+    } else if (e is SimpleIdentifier) {
+      buffer.write(e.name);
+    } else if (e is SimpleStringLiteral) {
+      buffer.write("'");
+      buffer.write(e.value.replaceAll("'", r"\'"));
+      buffer.write("'");
+    } else if (e is StringInterpolation) {
+      buffer.write("'");
+      e.elements.forEach(writeExpression);
+      buffer.write("'");
+    } else if (e is SuperConstructorInvocation) {
+      buffer.write('super');
+      if (e.constructorName != null) {
+        buffer.write('.');
+        writeExpression(e.constructorName);
+      }
+      writeList('(', ')', e.argumentList.arguments, ', ', writeExpression,
+          includeEmpty: true);
+    } else if (e is SuperExpression) {
+      buffer.write('super');
+    } else if (e is SymbolLiteral) {
+      buffer.write('#');
+      writeList('', '', e.components, '.',
+          (Token token) => buffer.write(token.lexeme));
+    } else if (e is ThisExpression) {
+      buffer.write('this');
+    } else if (e is TypeName) {
+      writeExpression(e.name);
+      if (e.typeArguments != null) {
+        writeList('<', '>', e.typeArguments.arguments, ', ', writeExpression);
+      }
+    } else {
+      fail('Unsupported expression type: ${e.runtimeType}');
+    }
+  }
+
+  void writeFieldElement(FieldElement e) {
+    if (e.isSynthetic && !isEnumElement(e.enclosingElement)) {
+      return;
+    }
+
+    writeDocumentation(e, '  ');
+    writeMetadata(e, '  ', '\n');
+
+    buffer.write('  ');
+
+    writeIf(e.isStatic, 'static ');
+    writeIf(e is FieldElementImpl && e.isCovariant, 'covariant ');
+
+    writePropertyInducingElement(e);
+  }
+
+  void writeFunctionElement(FunctionElement e) {
+    writeIf(e.isExternal, 'external ');
+
+    writeType2(e.returnType);
+
+    writeName(e);
+
+    writeTypeParameterElements(e.typeParameters);
+    writeParameterElements(e.parameters);
+
+    writeBodyModifiers(e);
+
+    buffer.writeln(' {}');
+  }
+
+  void writeFunctionTypeAliasElement(FunctionTypeAliasElement e) {
+    writeDocumentation(e);
+    writeMetadata(e, '', '\n');
+
+    buffer.write('typedef ');
+    writeType2(e.returnType);
+
+    writeName(e);
+
+    writeTypeParameterElements(e.typeParameters);
+    writeParameterElements(e.parameters);
+
+    buffer.writeln(';');
+  }
+
+  void writeIf(bool flag, String str) {
+    if (flag) {
+      buffer.write(str);
+    }
+  }
+
+  void writeImportElement(ImportElement e) {
+    if (!e.isSynthetic) {
+      writeMetadata(e, '', '\n');
+      buffer.write('import ');
+      writeUri(e, e.importedLibrary.source);
+
+      writeIf(e.isDeferred, ' deferred');
+
+      if (e.prefix != null) {
+        buffer.write(' as ');
+        writeName(e.prefix);
+        if (withOffsets) {
+          buffer.write('(${e.prefixOffset})');
+        }
+      }
+
+      e.combinators.forEach(writeNamespaceCombinator);
+
+      buffer.writeln(';');
+    }
+  }
+
+  void writeLibraryElement(LibraryElement e) {
+    if (e.displayName != '') {
+      writeMetadata(e, '', '\n');
+      buffer.write('library ');
+      writeName(e);
+      buffer.writeln(';');
+    }
+
+    e.imports.forEach(writeImportElement);
+    e.exports.forEach(writeExportElement);
+    e.parts.forEach(writePartElement);
+
+    e.units.forEach(writeUnitElement);
+  }
+
+  void writeList<T>(String open, String close, List<T> items, String separator,
+      writeItem(T item),
+      {bool includeEmpty: false}) {
+    if (!includeEmpty && items.isEmpty) {
+      return;
+    }
+    buffer.write(open);
+    bool first = true;
+    for (T item in items) {
+      if (!first) {
+        buffer.write(separator);
+      }
+      writeItem(item);
+      first = false;
+    }
+    buffer.write(close);
+  }
+
+  void writeMetadata(Element e, String prefix, String separator) {
+    if (e.metadata.isNotEmpty) {
+      writeList(prefix, '', e.metadata, '$separator$prefix', (a) {
+        writeExpression((a as ElementAnnotationImpl).annotationAst);
+      });
+      buffer.write(separator);
+    }
+  }
+
+  void writeMethodElement(MethodElement e) {
+    writeDocumentation(e, '  ');
+    writeMetadata(e, '  ', '\n');
+
+    buffer.write('  ');
+
+    writeIf(e.isExternal, 'external ');
+    writeIf(e.isStatic, 'static ');
+
+    writeType2(e.returnType);
+
+    writeName(e);
+
+    writeTypeParameterElements(e.typeParameters);
+    writeParameterElements(e.parameters);
+
+    writeBodyModifiers(e);
+
+    if (e.isAbstract) {
+      buffer.writeln(';');
+    } else {
+      buffer.writeln(' {}');
+    }
+  }
+
+  void writeName(Element e) {
+    buffer.write(e.displayName);
+    if (withOffsets) {
+      buffer.write('@');
+      buffer.write(e.nameOffset);
+    }
+  }
+
+  void writeNamespaceCombinator(NamespaceCombinator e) {
+    if (e is ShowElementCombinator) {
+      buffer.write(' show ');
+      buffer.write(e.shownNames.join(', '));
+    } else if (e is HideElementCombinator) {
+      buffer.write(' hide ');
+      buffer.write(e.hiddenNames.join(', '));
+    }
+  }
+
+  void writeParameterElement(ParameterElement e) {
+    String defaultValueSeparator;
+    Expression defaultValue =
+        e is DefaultParameterElementImpl ? e.constantInitializer : null;
+    String closeString;
+    ParameterKind kind = e.parameterKind;
+    if (kind == ParameterKind.REQUIRED) {
+      closeString = '';
+    } else if (kind == ParameterKind.POSITIONAL) {
+      buffer.write('[');
+      defaultValueSeparator = ' = ';
+      closeString = ']';
+    } else if (kind == ParameterKind.NAMED) {
+      buffer.write('{');
+      defaultValueSeparator = ': ';
+      closeString = '}';
+    } else {
+      fail('Unknown parameter kind: $kind');
+    }
+
+    writeMetadata(e, '', ' ');
+
+    writeIf(e.isCovariant, 'covariant ');
+    writeIf(e.isFinal, 'final ');
+
+    writeType2(e.type);
+
+    if (e is FieldFormalParameterElement) {
+      buffer.write('this.');
+    }
+
+    writeName(e);
+
+    if (defaultValue != null) {
+      buffer.write(defaultValueSeparator);
+      writeExpression(defaultValue);
+    }
+
+    buffer.write(closeString);
+  }
+
+  void writeParameterElements(List<ParameterElement> elements) {
+    writeList('(', ')', elements, ', ', writeParameterElement,
+        includeEmpty: true);
+  }
+
+  void writePartElement(CompilationUnitElement e) {
+    writeMetadata(e, '', '\n');
+    buffer.write('part ');
+    writeUri(e, e.source);
+    buffer.writeln(';');
+  }
+
+  void writePropertyAccessorElement(PropertyAccessorElement e) {
+    if (e.isSynthetic) {
+      return;
+    }
+
+    if (e.enclosingElement is ClassElement) {
+      writeDocumentation(e, '  ');
+      writeMetadata(e, '  ', '\n');
+
+      buffer.write('  ');
+
+      writeIf(e.isStatic, 'static ');
+    } else {
+      writeDocumentation(e);
+      writeMetadata(e, '', '\n');
+    }
+
+    writeIf(e.isExternal, 'external ');
+
+    writeType2(e.returnType);
+
+    if (e.isGetter) {
+      buffer.write('get ');
+    } else {
+      buffer.write('set ');
+    }
+
+    writeName(e);
+
+    if (e.isSetter || e.parameters.isNotEmpty) {
+      writeParameterElements(e.parameters);
+    }
+
+    expect(e.typeParameters, isEmpty);
+
+    expect(e.isSynchronous, isTrue);
+    expect(e.isAsynchronous, isFalse);
+    expect(e.isGenerator, isFalse);
+
+    if (e.isAbstract) {
+      buffer.writeln(';');
+    } else {
+      buffer.writeln(' {}');
+    }
+  }
+
+  void writePropertyInducingElement(PropertyInducingElement e) {
+    DartType type = e.type;
+    expect(type, isNotNull);
+
+    writeIf(e.isFinal, 'final ');
+    writeIf(e.isConst, 'const ');
+    writeType2(type);
+
+    writeName(e);
+
+    if (e is ConstVariableElement) {
+      Expression initializer = (e as ConstVariableElement).constantInitializer;
+      if (initializer != null) {
+        buffer.write(' = ');
+        writeExpression(initializer);
+      }
+    }
+
+    // TODO(scheglov) Paul: One of the things that was hardest to get right
+    // when resynthesizing the element model was the synthetic function for the
+    // initializer.  Can we write that out (along with its return type)?
+
+    buffer.writeln(';');
+  }
+
+  void writeTopLevelVariableElement(TopLevelVariableElement e) {
+    if (e.isSynthetic) {
+      return;
+    }
+    writeDocumentation(e);
+    writeMetadata(e, '', '\n');
+    writePropertyInducingElement(e);
+  }
+
+  void writeType(DartType type) {
+    if (type is InterfaceType) {
+      buffer.write(type.element.name);
+      if (type.element.typeParameters.isNotEmpty) {
+        writeList('<', '>', type.typeArguments, ', ', writeType);
+      }
+    } else {
+      buffer.write(type.displayName);
+    }
+  }
+
+  void writeType2(DartType type) {
+    writeType(type);
+    buffer.write(' ');
+  }
+
+  void writeTypeParameterElement(TypeParameterElement e) {
+    writeName(e);
+    if (e.bound != null) {
+      buffer.write(' extends ');
+      writeType(e.bound);
+    }
+  }
+
+  void writeTypeParameterElements(List<TypeParameterElement> elements) {
+    writeList('<', '>', elements, ', ', writeTypeParameterElement);
+  }
+
+  void writeUnitElement(CompilationUnitElement e) {
+    if (e.library.definingCompilationUnit != e) {
+      buffer.writeln('-' * 20);
+      buffer.writeln('unit: ${e.source.shortName}');
+      buffer.writeln();
+    }
+    e.functionTypeAliases.forEach(writeFunctionTypeAliasElement);
+    e.enums.forEach(writeClassElement);
+    e.types.forEach(writeClassElement);
+    e.topLevelVariables.forEach(writeTopLevelVariableElement);
+    e.accessors.forEach(writePropertyAccessorElement);
+    e.functions.forEach(writeFunctionElement);
+  }
+
+  void writeUri(UriReferencedElement e, Source source) {
+    String uri = e.uri ?? source.uri.toString();
+    buffer.write('\'$uri\'');
+    if (withOffsets) {
+      buffer.write('(');
+      buffer.write('${e.uriOffset}, ');
+      buffer.write('${e.uriEnd})');
+      buffer.write(')');
+    }
+  }
+}
+
+class _Replacement {
+  final int offset;
+  final int end;
+  final String text;
+  _Replacement(this.offset, this.end, this.text);
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 5efc290..139a553 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -29,6 +29,7 @@
 
 import '../context/abstract_context.dart';
 import '../task/strong/inferred_type_test.dart';
+import 'element_text.dart';
 import 'resynthesize_common.dart';
 import 'summary_common.dart';
 
@@ -37,13 +38,24 @@
     defineReflectiveTests(ResynthesizeAstSpecTest);
     defineReflectiveTests(ResynthesizeAstStrongTest);
     defineReflectiveTests(AstInferredTypeTest);
+    defineReflectiveTests(ApplyCheckElementTextReplacements);
   });
 }
 
 @reflectiveTest
+class ApplyCheckElementTextReplacements {
+  test_applyReplacements() {
+    applyCheckElementTextReplacements();
+  }
+}
+
+@reflectiveTest
 class AstInferredTypeTest extends AbstractResynthesizeTest
     with _AstResynthesizeTestMixin, InferredTypeMixin {
   @override
+  bool get isStrongMode => true;
+
+  @override
   bool get mayCheckTypesOfLocals => false;
 
   @override
@@ -686,13 +698,15 @@
 @reflectiveTest
 class ResynthesizeAstSpecTest extends _ResynthesizeAstTest {
   @override
-  AnalysisOptionsImpl createOptions() =>
-      super.createOptions()..strongMode = false;
+  bool get isStrongMode => false;
 }
 
 @reflectiveTest
 class ResynthesizeAstStrongTest extends _ResynthesizeAstTest {
   @override
+  bool get isStrongMode => true;
+
+  @override
   AnalysisOptionsImpl createOptions() =>
       super.createOptions()..strongMode = true;
 
@@ -880,6 +894,8 @@
 
 abstract class _ResynthesizeAstTest extends ResynthesizeTest
     with _AstResynthesizeTestMixin {
+  bool get isStrongMode;
+
   @override
   LibraryElementImpl checkLibrary(String text,
       {bool allowErrors: false, bool dumpSummaries: false}) {
@@ -907,6 +923,10 @@
   DartSdk createDartSdk() => AbstractContextTest.SHARED_MOCK_SDK;
 
   @override
+  AnalysisOptionsImpl createOptions() =>
+      super.createOptions()..strongMode = isStrongMode;
+
+  @override
   TestSummaryResynthesizer encodeDecodeLibrarySource(Source source) {
     return _encodeLibrary(source);
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 51b77ed..c1d72d5 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -29,9 +29,12 @@
 import '../../generated/test_support.dart';
 import '../abstract_single_unit.dart';
 import '../context/abstract_context.dart';
+import 'element_text.dart';
 
 /**
  * Abstract base class for resynthesizing and comparing elements.
+ *
+ * The return type separator: →
  */
 abstract class AbstractResynthesizeTest extends AbstractSingleUnitTest {
   Set<Source> otherLibrarySources = new Set<Source>();
@@ -53,6 +56,11 @@
    */
   bool allowMissingFiles = false;
 
+  /**
+   * Return `true` if resynthesizing should be done is strong mode.
+   */
+  bool get isStrongMode;
+
   void addLibrary(String uri) {
     otherLibrarySources.add(context.sourceFactory.forUri(uri));
   }
@@ -1317,23 +1325,105 @@
   SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource);
 
   fail_library_hasExtUri() {
-    checkLibrary('import "dart-ext:doesNotExist.dart";');
+    var library = checkLibrary('import "dart-ext:doesNotExist.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_class_abstract() {
-    checkLibrary('abstract class C {}');
+    var library = checkLibrary('abstract class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+}
+''');
+    }
   }
 
   test_class_alias() {
-    checkLibrary('class C = D with E, F; class D {} class E {} class F {}');
+    var library =
+        checkLibrary('class C = D with E, F; class D {} class E {} class F {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class alias C extends D with E, F {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+class F {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class alias C extends D with E, F {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+class F {
+}
+''');
+    }
   }
 
   test_class_alias_abstract() {
-    checkLibrary('abstract class C = D with E; class D {} class E {}');
+    var library =
+        checkLibrary('abstract class C = D with E; class D {} class E {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+''');
+    }
   }
 
   test_class_alias_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
@@ -1342,6 +1432,37 @@
 
 class D {}
 class E {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+''');
+    }
   }
 
   test_class_alias_with_forwarding_constructors() {
@@ -1359,35 +1480,122 @@
   factory Base.fact2() = Base.noArgs;
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import "a.dart";
 class M {}
 class MixinApp = Base with M;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class M {
+}
+class alias MixinApp extends Base with M {
+  synthetic MixinApp._priv() = Base._priv;
+  synthetic MixinApp() = Base;
+  synthetic MixinApp.noArgs() = Base.noArgs;
+  synthetic MixinApp.requiredArg(dynamic x) = Base.requiredArg;
+  synthetic MixinApp.fact() = Base.fact;
+  synthetic MixinApp.fact2() = Base.fact2;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class M {
+}
+class alias MixinApp extends Base with M {
+  synthetic MixinApp._priv() = Base._priv;
+  synthetic MixinApp() = Base;
+  synthetic MixinApp.noArgs() = Base.noArgs;
+  synthetic MixinApp.requiredArg(dynamic x) = Base.requiredArg;
+  synthetic MixinApp.fact() = Base.fact;
+  synthetic MixinApp.fact2() = Base.fact2;
+}
+''');
+    }
   }
 
   test_class_alias_with_forwarding_constructors_type_substitution() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class Base<T> {
   Base.ctor(T t, List<T> l);
 }
 class M {}
 class MixinApp = Base with M;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {
+}
+class alias MixinApp extends Base<dynamic> with M {
+  synthetic MixinApp.ctor(dynamic t, List<dynamic> l) = Base<T>.ctor;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {
+}
+class alias MixinApp extends Base<dynamic> with M {
+  synthetic MixinApp.ctor(dynamic t, List<dynamic> l) = Base<T>.ctor;
+}
+''');
+    }
   }
 
   test_class_alias_with_forwarding_constructors_type_substitution_complex() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class Base<T> {
   Base.ctor(T t, List<T> l);
 }
 class M {}
 class MixinApp<U> = Base<List<U>> with M;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {
+}
+class alias MixinApp<U> extends Base<List<U>> with M {
+  synthetic MixinApp.ctor(List<U> t, List<List<U>> l) = Base<T>.ctor;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {
+}
+class alias MixinApp<U> extends Base<List<U>> with M {
+  synthetic MixinApp.ctor(List<U> t, List<List<U>> l) = Base<T>.ctor;
+}
+''');
+    }
   }
 
   test_class_alias_with_mixin_members() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C = D with E;
 class D {}
 class E {
@@ -1396,133 +1604,680 @@
   void f() {}
   int x;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+  int x;
+  int get a {}
+  void set b(int i) {}
+  void f() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+  int x;
+  int get a {}
+  void set b(int i) {}
+  void f() {}
+}
+''');
+    }
   }
 
   test_class_constructor_const() {
-    checkLibrary('class C { const C(); }');
+    var library = checkLibrary('class C { const C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C();
+}
+''');
+    }
   }
 
   test_class_constructor_const_external() {
-    checkLibrary('class C { external const C(); }');
+    var library = checkLibrary('class C { external const C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external const C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external const C();
+}
+''');
+    }
   }
 
   test_class_constructor_explicit_named() {
-    checkLibrary('class C { C.foo(); }');
+    var library = checkLibrary('class C { C.foo(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.foo();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.foo();
+}
+''');
+    }
   }
 
   test_class_constructor_explicit_type_params() {
-    checkLibrary('class C<T, U> { C(); }');
+    var library = checkLibrary('class C<T, U> { C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  C();
+}
+''');
+    }
   }
 
   test_class_constructor_explicit_unnamed() {
-    checkLibrary('class C { C(); }');
+    var library = checkLibrary('class C { C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    }
   }
 
   test_class_constructor_external() {
-    checkLibrary('class C { external C(); }');
+    var library = checkLibrary('class C { external C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external C();
+}
+''');
+    }
   }
 
   test_class_constructor_factory() {
-    checkLibrary('class C { factory C() => null; }');
+    var library = checkLibrary('class C { factory C() => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C();
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_dynamic_dynamic() {
-    checkLibrary('class C { dynamic x; C(dynamic this.x); }');
+    var library = checkLibrary('class C { dynamic x; C(dynamic this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_dynamic_typed() {
-    checkLibrary('class C { dynamic x; C(int this.x); }');
+    var library = checkLibrary('class C { dynamic x; C(int this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(int this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(int this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_dynamic_untyped() {
-    checkLibrary('class C { dynamic x; C(this.x); }');
+    var library = checkLibrary('class C { dynamic x; C(this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_multiple_matching_fields() {
     // This is a compile-time error but it should still analyze consistently.
-    checkLibrary('class C { C(this.x); int x; String x; }', allowErrors: true);
+    var library = checkLibrary('class C { C(this.x); int x; String x; }',
+        allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  String x;
+  C(int this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  String x;
+  C(int this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_no_matching_field() {
     // This is a compile-time error but it should still analyze consistently.
-    checkLibrary('class C { C(this.x); }', allowErrors: true);
+    var library = checkLibrary('class C { C(this.x); }', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_typed_dynamic() {
-    checkLibrary('class C { num x; C(dynamic this.x); }', allowErrors: true);
+    var library = checkLibrary('class C { num x; C(dynamic this.x); }',
+        allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_typed_typed() {
-    checkLibrary('class C { num x; C(int this.x); }');
+    var library = checkLibrary('class C { num x; C(int this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(int this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(int this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_typed_untyped() {
-    checkLibrary('class C { num x; C(this.x); }');
+    var library = checkLibrary('class C { num x; C(this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(num this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num x;
+  C(num this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_untyped_dynamic() {
-    checkLibrary('class C { var x; C(dynamic this.x); }');
+    var library = checkLibrary('class C { var x; C(dynamic this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_untyped_typed() {
-    checkLibrary('class C { var x; C(int this.x); }');
+    var library = checkLibrary('class C { var x; C(int this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(int this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(int this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_field_formal_untyped_untyped() {
-    checkLibrary('class C { var x; C(this.x); }');
+    var library = checkLibrary('class C { var x; C(this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
+    }
   }
 
   test_class_constructor_fieldFormal_named_noDefault() {
-    checkLibrary('class C { int x; C({this.x}); }');
+    var library = checkLibrary('class C { int x; C({this.x}); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C({int this.x});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C({int this.x});
+}
+''');
+    }
   }
 
   test_class_constructor_fieldFormal_named_withDefault() {
-    checkLibrary('class C { int x; C({this.x: 42}); }');
+    var library = checkLibrary('class C { int x; C({this.x: 42}); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C({int this.x});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C({int this.x});
+}
+''');
+    }
   }
 
   test_class_constructor_fieldFormal_optional_noDefault() {
-    checkLibrary('class C { int x; C([this.x]); }');
+    var library = checkLibrary('class C { int x; C([this.x]); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C([int this.x]);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C([int this.x]);
+}
+''');
+    }
   }
 
   test_class_constructor_fieldFormal_optional_withDefault() {
-    checkLibrary('class C { int x; C([this.x = 42]); }');
+    var library = checkLibrary('class C { int x; C([this.x = 42]); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C([int this.x]);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+  C([int this.x]);
+}
+''');
+    }
   }
 
   test_class_constructor_implicit() {
-    checkLibrary('class C {}');
+    var library = checkLibrary('class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+''');
+    }
   }
 
   test_class_constructor_implicit_type_params() {
-    checkLibrary('class C<T, U> {}');
+    var library = checkLibrary('class C<T, U> {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+''');
+    }
   }
 
   test_class_constructor_params() {
-    checkLibrary('class C { C(x, y); }');
+    var library = checkLibrary('class C { C(x, int y); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C(dynamic x, int y);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C(dynamic x, int y);
+}
+''');
+    }
   }
 
   test_class_constructors() {
-    checkLibrary('class C { C.foo(); C.bar(); }');
+    var library = checkLibrary('class C { C.foo(); C.bar(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.foo();
+  C.bar();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.foo();
+  C.bar();
+}
+''');
+    }
   }
 
   test_class_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 class C {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class C {
+}
+''');
+    }
   }
 
   test_class_documented_tripleSlash() {
-    checkLibrary('''
+    var library = checkLibrary('''
 /// aaa
 /// bbbb
 /// cc
 class C {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/// aaa
+/// bbbb
+/// cc
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/// aaa
+/// bbbb
+/// cc
+class C {
+}
+''');
+    }
   }
 
   test_class_documented_with_references() {
-    checkLibrary('''
+    var library = checkLibrary('''
 /**
  * Docs referring to [D] and [E]
  */
@@ -1530,174 +2285,897 @@
 
 class D {}
 class E {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs referring to [D] and [E]
+ */
+class C {
+}
+class D {
+}
+class E {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs referring to [D] and [E]
+ */
+class C {
+}
+class D {
+}
+class E {
+}
+''');
+    }
   }
 
   test_class_documented_with_windows_line_endings() {
-    checkLibrary('/**\r\n * Docs\r\n */\r\nclass C {}');
+    var library = checkLibrary('/**\r\n * Docs\r\n */\r\nclass C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+class C {
+}
+''');
+    }
   }
 
   test_class_field_const() {
-    checkLibrary('class C { static const int i = 0; }');
+    var library = checkLibrary('class C { static const int i = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int i = 0;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int i = 0;
+}
+''');
+    }
   }
 
   test_class_field_implicit_type() {
-    checkLibrary('class C { var x; }');
+    var library = checkLibrary('class C { var x; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+}
+''');
+    }
   }
 
   test_class_field_static() {
-    checkLibrary('class C { static int i; }');
+    var library = checkLibrary('class C { static int i; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int i;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int i;
+}
+''');
+    }
   }
 
   test_class_fields() {
-    checkLibrary('class C { int i; int j; }');
+    var library = checkLibrary('class C { int i; int j; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int i;
+  int j;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int i;
+  int j;
+}
+''');
+    }
   }
 
   test_class_getter_abstract() {
-    checkLibrary('abstract class C { int get x; }');
+    var library = checkLibrary('abstract class C { int get x; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  int get x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  int get x;
+}
+''');
+    }
   }
 
   test_class_getter_external() {
-    checkLibrary('class C { external int get x; }');
+    var library = checkLibrary('class C { external int get x; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external int get x {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external int get x {}
+}
+''');
+    }
   }
 
   test_class_getter_implicit_return_type() {
-    checkLibrary('class C { get x => null; }');
+    var library = checkLibrary('class C { get x => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic get x {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic get x {}
+}
+''');
+    }
   }
 
   test_class_getter_static() {
-    checkLibrary('class C { static int get x => null; }');
+    var library = checkLibrary('class C { static int get x => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int get x {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int get x {}
+}
+''');
+    }
   }
 
   test_class_getters() {
-    checkLibrary('class C { int get x => null; get y => null; }');
+    var library = checkLibrary('class C { int get x => null; get y => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int get x {}
+  dynamic get y {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int get x {}
+  dynamic get y {}
+}
+''');
+    }
   }
 
   test_class_implicitField_getterFirst() {
-    checkLibrary('class C { int get x => 0; void set x(int value) {} }');
+    var library =
+        checkLibrary('class C { int get x => 0; void set x(int value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int get x {}
+  void set x(int value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int get x {}
+  void set x(int value) {}
+}
+''');
+    }
   }
 
   test_class_implicitField_setterFirst() {
-    checkLibrary('class C { void set x(int value) {} int get x => 0; }');
+    var library =
+        checkLibrary('class C { void set x(int value) {} int get x => 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(int value) {}
+  int get x {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(int value) {}
+  int get x {}
+}
+''');
+    }
   }
 
   test_class_interfaces() {
-    checkLibrary('class C implements D, E {} class D {} class E {}');
+    var library =
+        checkLibrary('class C implements D, E {} class D {} class E {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C implements D, E {
+}
+class D {
+}
+class E {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C implements D, E {
+}
+class D {
+}
+class E {
+}
+''');
+    }
   }
 
   test_class_interfaces_unresolved() {
-    checkLibrary('class C implements X, Y, Z {} class X {} class Z {}',
+    var library = checkLibrary(
+        'class C implements X, Y, Z {} class X {} class Z {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C implements X, Z {
+}
+class X {
+}
+class Z {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C implements X, Z {
+}
+class X {
+}
+class Z {
+}
+''');
+    }
   }
 
   test_class_method_abstract() {
-    checkLibrary('abstract class C { f(); }');
+    var library = checkLibrary('abstract class C { f(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  dynamic f();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  dynamic f();
+}
+''');
+    }
   }
 
   test_class_method_external() {
-    checkLibrary('class C { external f(); }');
+    var library = checkLibrary('class C { external f(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external dynamic f() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external dynamic f() {}
+}
+''');
+    }
   }
 
   test_class_method_params() {
-    checkLibrary('class C { f(x, y) {} }');
+    var library = checkLibrary('class C { f(x, y) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(dynamic x, dynamic y) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(dynamic x, dynamic y) {}
+}
+''');
+    }
   }
 
   test_class_method_static() {
-    checkLibrary('class C { static f() {} }');
+    var library = checkLibrary('class C { static f() {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static dynamic f() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static dynamic f() {}
+}
+''');
+    }
   }
 
   test_class_methods() {
-    checkLibrary('class C { f() {} g() {} }');
+    var library = checkLibrary('class C { f() {} g() {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f() {}
+  dynamic g() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f() {}
+  dynamic g() {}
+}
+''');
+    }
   }
 
   test_class_mixins() {
-    checkLibrary('class C extends Object with D, E {} class D {} class E {}');
+    var library = checkLibrary(
+        'class C extends Object with D, E {} class D {} class E {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends Object with D, E {
+  synthetic C();
+}
+class D {
+}
+class E {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends Object with D, E {
+  synthetic C();
+}
+class D {
+}
+class E {
+}
+''');
+    }
   }
 
   test_class_mixins_unresolved() {
-    checkLibrary('class C extends Object with X, Y, Z; class X {} class Z {}',
+    var library = checkLibrary(
+        'class C extends Object with X, Y, Z; class X {} class Z {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends Object with X, Z {
+  synthetic C();
+}
+class X {
+}
+class Z {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends Object with X, Z {
+  synthetic C();
+}
+class X {
+}
+class Z {
+}
+''');
+    }
   }
 
   test_class_setter_abstract() {
-    checkLibrary('abstract class C { void set x(int value); }');
+    var library = checkLibrary('abstract class C { void set x(int value); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  void set x(int value);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class C {
+  void set x(int value);
+}
+''');
+    }
   }
 
   test_class_setter_external() {
-    checkLibrary('class C { external void set x(int value); }');
+    var library = checkLibrary('class C { external void set x(int value); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external void set x(int value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external void set x(int value) {}
+}
+''');
+    }
   }
 
   test_class_setter_implicit_param_type() {
-    checkLibrary('class C { void set x(value) {} }');
+    var library = checkLibrary('class C { void set x(value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(dynamic value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(dynamic value) {}
+}
+''');
+    }
   }
 
   test_class_setter_implicit_return_type() {
-    checkLibrary('class C { set x(int value) {} }');
+    var library = checkLibrary('class C { set x(int value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(int value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic set x(int value) {}
+}
+''');
+    }
   }
 
   test_class_setter_invalid_no_parameter() {
-    checkLibrary('class C { void set x() {} }');
+    var library = checkLibrary('class C { void set x() {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x() {}
+}
+''');
+    }
   }
 
   test_class_setter_static() {
-    checkLibrary('class C { static void set x(int value) {} }');
+    var library = checkLibrary('class C { static void set x(int value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static void set x(int value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static void set x(int value) {}
+}
+''');
+    }
   }
 
   test_class_setters() {
-    checkLibrary('class C { void set x(int value) {} set y(value) {} }');
+    var library =
+        checkLibrary('class C { void set x(int value) {} set y(value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(int value) {}
+  void set y(dynamic value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(int value) {}
+  dynamic set y(dynamic value) {}
+}
+''');
+    }
   }
 
   test_class_supertype() {
-    checkLibrary('class C extends D {} class D {}');
+    var library = checkLibrary('class C extends D {} class D {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+}
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+}
+class D {
+}
+''');
+    }
   }
 
   test_class_supertype_unresolved() {
-    checkLibrary('class C extends D {}', allowErrors: true);
+    var library = checkLibrary('class C extends D {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+''');
+    }
   }
 
   test_class_type_parameters() {
-    checkLibrary('class C<T, U> {}');
+    var library = checkLibrary('class C<T, U> {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+''');
+    }
   }
 
   test_class_type_parameters_bound() {
-    checkLibrary('class C<T extends Object, U extends D> {} class D {}');
+    var library =
+        checkLibrary('class C<T extends Object, U extends D> {} class D {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends Object, U extends D> {
+}
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends Object, U extends D> {
+}
+class D {
+}
+''');
+    }
   }
 
   test_class_type_parameters_f_bound_complex() {
-    checkLibrary('class C<T extends List<U>, U> {}');
+    var library = checkLibrary('class C<T extends List<U>, U> {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends List<U>, U> {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends List<U>, U> {
+}
+''');
+    }
   }
 
   test_class_type_parameters_f_bound_simple() {
-    checkLibrary('class C<T extends U, U> {}');
+    var library = checkLibrary('class C<T extends U, U> {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends U, U> {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends U, U> {
+}
+''');
+    }
   }
 
   test_classes() {
-    checkLibrary('class C {} class D {}');
+    var library = checkLibrary('class C {} class D {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+class D {
+}
+''');
+    }
   }
 
   test_closure_executable_with_return_type_from_closure() {
-    checkLibrary('''
+    var library = checkLibrary('''
 f() {
   print(() {});
   print(() => () => 0);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    }
   }
 
   test_closure_generic() {
-    checkLibrary('final f = <U, V>(U x, V y) => y;');
+    var library = checkLibrary('final f = <U, V>(U x, V y) => y;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+final <U,V>(U, V) → V f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final dynamic f;
+''');
+    }
   }
 
   test_closure_in_variable_declaration_in_part() {
     addSource('/a.dart', 'part of lib; final f = (int i) => i.toDouble();');
-    checkLibrary('''
+    var library = checkLibrary('''
 library lib;
 part "a.dart";
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+final (int) → double f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+final dynamic f;
+''');
+    }
   }
 
   test_const_invalid_field_const() {
     variablesWithNotConstInitializers.add('f');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {
   static const f = 1 + foo();
@@ -1705,11 +3183,30 @@
 int foo() => 42;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int f = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const dynamic f = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    }
   }
 
   test_const_invalid_field_final() {
     variablesWithNotConstInitializers.add('f');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {
   final f = 1 + foo();
@@ -1717,25 +3214,78 @@
 int foo() => 42;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final int f = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic f = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    }
   }
 
   test_const_invalid_topLevel() {
     variablesWithNotConstInitializers.add('v');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const v = 1 + foo();
 int foo() => 42;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int v = $$invalidConstExpr$$;
+int foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic v = $$invalidConstExpr$$;
+int foo() {}
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_named() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C<K, V> {
   const C.named(K k, V v);
 }
 const V = const C<int, String>.named(1, '222');
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C.named(K k, V v);
+}
+const C<int, String> V = const C<int, String>.named(1, '222');
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C.named(K k, V v);
+}
+const dynamic V = const C<int, String>.named(1, '222');
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_named_imported() {
@@ -1746,10 +3296,25 @@
   const C.named(K k, V v);
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = const C<int, String>.named(1, '222');
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const C<int, String> V = const C<int, String>.named(1, '222');
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = const C<int, String>.named(1, '222');
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_named_imported_withPrefix() {
@@ -1760,28 +3325,81 @@
   const C.named(K k, V v);
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = const p.C<int, String>.named(1, '222');
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const C<int, String> V = const C<int, String>.named(1, '222');
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const C<int, String>.named(1, '222');
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_noTypeArguments() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C<K, V> {
   const C();
 }
 const V = const C();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C();
+}
+const C<dynamic, dynamic> V = const C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C();
+}
+const dynamic V = const C();
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_unnamed() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C<K, V> {
   const C();
 }
 const V = const C<int, String>();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C();
+}
+const C<int, String> V = const C<int, String>();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<K, V> {
+  const C();
+}
+const dynamic V = const C<int, String>();
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_unnamed_imported() {
@@ -1792,10 +3410,25 @@
   const C();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = const C<int, String>();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const C<int, String> V = const C<int, String>();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = const C<int, String>();
+''');
+    }
   }
 
   test_const_invokeConstructor_generic_unnamed_imported_withPrefix() {
@@ -1806,19 +3439,53 @@
   const C();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = const p.C<int, String>();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const C<int, String> V = const C<int, String>();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const C<int, String>();
+''');
+    }
   }
 
   test_const_invokeConstructor_named() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   const C.named(bool a, int b, int c, {String d, double e});
 }
 const V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.named(bool a, int b, int c, {String d}, {double e});
+}
+const C V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.named(bool a, int b, int c, {String d}, {double e});
+}
+const dynamic V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
+''');
+    }
   }
 
   test_const_invokeConstructor_named_imported() {
@@ -1829,10 +3496,25 @@
   const C.named();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = const C.named();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const C V = const C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = const C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_imported_withPrefix() {
@@ -1843,27 +3525,72 @@
   const C.named();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = const p.C.named();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const C V = const C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_unresolved() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {}
 const V = const C.named();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+const C V = const C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+const dynamic V = const C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_unresolved2() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const V = const C.named();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_unresolved3() {
@@ -1873,39 +3600,101 @@
 class C {
 }
 ''');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 import 'a.dart' as p;
 const V = const p.C.named();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const C V = const p.C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const p.C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_unresolved4() {
     addLibrarySource('/a.dart', '');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 import 'a.dart' as p;
 const V = const p.C.named();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const p.C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const p.C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_named_unresolved5() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const V = const p.C.named();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const p.C.named();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const p.C.named();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   const C();
 }
 const V = const C();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C();
+}
+const C V = const C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C();
+}
+const dynamic V = const C();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed_imported() {
@@ -1916,10 +3705,25 @@
   const C();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = const C();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const C V = const C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = const C();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed_imported_withPrefix() {
@@ -1930,45 +3734,120 @@
   const C();
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = const p.C();
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const C V = const C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const C();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed_unresolved() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const V = const C();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const C();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed_unresolved2() {
     addLibrarySource('/a.dart', '');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 import 'a.dart' as p;
 const V = const p.C();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const p.C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = const p.C();
+''');
+    }
   }
 
   test_const_invokeConstructor_unnamed_unresolved3() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const V = const p.C();
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const p.C();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = const p.C();
+''');
+    }
   }
 
   test_const_length_ofClassConstField() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   static const String F = '';
 }
 const int v = C.F.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const String F = '';
+}
+const int v = C.F.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const String F = '';
+}
+const int v = C.F.length;
+''');
+    }
   }
 
   test_const_length_ofClassConstField_imported() {
@@ -1979,10 +3858,25 @@
   static const String F = '';
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const int v = C.F.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const int v = C.F.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const int v = C.F.length;
+''');
+    }
   }
 
   test_const_length_ofClassConstField_imported_withPrefix() {
@@ -1993,23 +3887,66 @@
   static const String F = '';
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const int v = p.C.F.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const int v = p.C.F.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const int v = p.C.F.length;
+''');
+    }
   }
 
   test_const_length_ofStringLiteral() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const v = 'abc'.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int v = 'abc'.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic v = 'abc'.length;
+''');
+    }
   }
 
   test_const_length_ofTopLevelVariable() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const String S = 'abc';
 const v = S.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const String S = 'abc';
+const int v = S.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const String S = 'abc';
+const dynamic v = S.length;
+''');
+    }
   }
 
   test_const_length_ofTopLevelVariable_imported() {
@@ -2018,10 +3955,25 @@
         r'''
 const String S = 'abc';
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const v = S.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const int v = S.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic v = S.length;
+''');
+    }
   }
 
   test_const_length_ofTopLevelVariable_imported_withPrefix() {
@@ -2030,51 +3982,144 @@
         r'''
 const String S = 'abc';
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const v = p.S.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const int v = p.S.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic v = p.S.length;
+''');
+    }
   }
 
   test_const_length_staticMethod() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   static int length() => 42;
 }
 const v = C.length;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int length() {}
+}
+const () → int v = C.length;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int length() {}
+}
+const dynamic v = C.length;
+''');
+    }
   }
 
   test_const_parameterDefaultValue_initializingFormal_functionTyped() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   final x;
   const C({this.x: foo});
 }
 int foo() => 42;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C({dynamic this.x});
+}
+int foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C({dynamic this.x});
+}
+int foo() {}
+''');
+    }
   }
 
   test_const_parameterDefaultValue_initializingFormal_named() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   final x;
   const C({this.x: 1 + 2});
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C({dynamic this.x});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C({dynamic this.x});
+}
+''');
+    }
   }
 
   test_const_parameterDefaultValue_initializingFormal_positional() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   final x;
   const C([this.x = 1 + 2]);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C([dynamic this.x]);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C([dynamic this.x]);
+}
+''');
+    }
   }
 
   test_const_parameterDefaultValue_normal() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   const C.positional([p = 1 + 2]);
   const C.named({p: 1 + 2});
@@ -2084,15 +4129,61 @@
   void methodNamedWithoutDefault({p}) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.positional([dynamic p = 1 + 2]);
+  const C.named({dynamic p: 1 + 2});
+  void methodPositional([dynamic p = 1 + 2]) {}
+  void methodPositionalWithoutDefault([dynamic p]) {}
+  void methodNamed({dynamic p: 1 + 2}) {}
+  void methodNamedWithoutDefault({dynamic p}) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.positional([dynamic p = 1 + 2]);
+  const C.named({dynamic p: 1 + 2});
+  void methodPositional([dynamic p = 1 + 2]) {}
+  void methodPositionalWithoutDefault([dynamic p]) {}
+  void methodNamed({dynamic p: 1 + 2}) {}
+  void methodNamedWithoutDefault({dynamic p}) {}
+}
+''');
+    }
   }
 
   test_const_reference_staticField() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   static const int F = 42;
 }
 const V = C.F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int F = 42;
+}
+const int V = C.F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int F = 42;
+}
+const dynamic V = C.F;
+''');
+    }
   }
 
   test_const_reference_staticField_imported() {
@@ -2103,10 +4194,25 @@
   static const int F = 42;
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = C.F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const int V = C.F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = C.F;
+''');
+    }
   }
 
   test_const_reference_staticField_imported_withPrefix() {
@@ -2117,19 +4223,53 @@
   static const int F = 42;
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = p.C.F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const int V = p.C.F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = p.C.F;
+''');
+    }
   }
 
   test_const_reference_staticMethod() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   static int m(int a, String b) => 42;
 }
 const V = C.m;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int m(int a, String b) {}
+}
+const (int, String) → int V = C.m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int m(int a, String b) {}
+}
+const dynamic V = C.m;
+''');
+    }
   }
 
   test_const_reference_staticMethod_imported() {
@@ -2140,10 +4280,25 @@
   static int m(int a, String b) => 42;
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = C.m;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const (int, String) → int V = C.m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = C.m;
+''');
+    }
   }
 
   test_const_reference_staticMethod_imported_withPrefix() {
@@ -2154,17 +4309,47 @@
   static int m(int a, String b) => 42;
 }
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = p.C.m;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const (int, String) → int V = p.C.m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = p.C.m;
+''');
+    }
   }
 
   test_const_reference_topLevelFunction() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 foo() {}
 const V = foo;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const () → dynamic V = foo;
+dynamic foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = foo;
+dynamic foo() {}
+''');
+    }
   }
 
   test_const_reference_topLevelFunction_imported() {
@@ -2173,10 +4358,25 @@
         r'''
 foo() {}
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const V = foo;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const () → dynamic V = foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic V = foo;
+''');
+    }
   }
 
   test_const_reference_topLevelFunction_imported_withPrefix() {
@@ -2185,17 +4385,47 @@
         r'''
 foo() {}
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const V = p.foo;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const () → dynamic V = p.foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic V = p.foo;
+''');
+    }
   }
 
   test_const_reference_topLevelVariable() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const A = 1;
 const B = A + 2;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int A = 1;
+const int B = A + 2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic A = 1;
+const dynamic B = A + 2;
+''');
+    }
   }
 
   test_const_reference_topLevelVariable_imported() {
@@ -2204,10 +4434,25 @@
         r'''
 const A = 1;
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const B = A + 2;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const int B = A + 2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic B = A + 2;
+''');
+    }
   }
 
   test_const_reference_topLevelVariable_imported_withPrefix() {
@@ -2216,14 +4461,29 @@
         r'''
 const A = 1;
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const B = p.A + 2;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const int B = p.A + 2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic B = p.A + 2;
+''');
+    }
   }
 
   test_const_reference_type() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {}
 class D<T> {}
 enum E {a, b, c}
@@ -2236,15 +4496,83 @@
 const vEnum = E;
 const vFunctionTypeAlias = F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int a, String b);
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+  static const E b;
+  static const E c;
+}
+class C {
+}
+class D<T> {
+}
+const Type vDynamic = dynamic;
+const Type vNull = Null;
+const Type vObject = Object;
+const Type vClass = C;
+const Type vGenericClass = D;
+const Type vEnum = E;
+const Type vFunctionTypeAlias = F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int a, String b);
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+  static const E b;
+  static const E c;
+}
+class C {
+}
+class D<T> {
+}
+const dynamic vDynamic = dynamic;
+const dynamic vNull = Null;
+const dynamic vObject = Object;
+const dynamic vClass = C;
+const dynamic vGenericClass = D;
+const dynamic vEnum = E;
+const dynamic vFunctionTypeAlias = F;
+''');
+    }
   }
 
   test_const_reference_type_functionType() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 typedef F();
 class C {
   final f = <F>[];
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+class C {
+  final List<F> f = const <F>[];
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+class C {
+  final dynamic f = const <F>[];
+}
+''');
+    }
   }
 
   test_const_reference_type_imported() {
@@ -2255,12 +4583,31 @@
 enum E {a, b, c}
 typedef F(int a, String b);
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const vClass = C;
 const vEnum = E;
 const vFunctionTypeAlias = F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const Type vClass = C;
+const Type vEnum = E;
+const Type vFunctionTypeAlias = F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic vClass = C;
+const dynamic vEnum = E;
+const dynamic vFunctionTypeAlias = F;
+''');
+    }
   }
 
   test_const_reference_type_imported_withPrefix() {
@@ -2271,37 +4618,103 @@
 enum E {a, b, c}
 typedef F(int a, String b);
 ''');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const vClass = p.C;
 const vEnum = p.E;
 const vFunctionTypeAlias = p.F;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const Type vClass = p.C;
+const Type vEnum = p.E;
+const Type vFunctionTypeAlias = p.F;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic vClass = p.C;
+const dynamic vEnum = p.E;
+const dynamic vFunctionTypeAlias = p.F;
+''');
+    }
   }
 
   test_const_reference_type_typeParameter() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C<T> {
   final f = <T>[];
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  final List<T> f = const <T>[];
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  final dynamic f = const <T>[];
+}
+''');
+    }
   }
 
   test_const_reference_unresolved_prefix0() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 const V = foo;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic V = foo;
+''');
+    }
   }
 
   test_const_reference_unresolved_prefix1() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {}
 const v = C.foo;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+const dynamic v = C.foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+const dynamic v = C.foo;
+''');
+    }
   }
 
   test_const_reference_unresolved_prefix2() {
@@ -2310,16 +4723,31 @@
         '''
 class C {}
 ''');
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 import 'foo.dart' as p;
 const v = p.C.foo;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as p;
+const dynamic v = p.C.foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as p;
+const dynamic v = p.C.foo;
+''');
+    }
   }
 
   test_const_topLevel_binary() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vEqual = 1 == 2;
 const vAnd = true && false;
 const vOr = false || true;
@@ -2339,28 +4767,114 @@
 const vLess = 1 < 2;
 const vLessEqual = 1 <= 2;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const bool vEqual = 1 == 2;
+const bool vAnd = true && false;
+const bool vOr = false || true;
+const int vBitXor = 1 ^ 2;
+const int vBitAnd = 1 & 2;
+const int vBitOr = 1 | 2;
+const int vBitShiftLeft = 1 << 2;
+const int vBitShiftRight = 1 >> 2;
+const int vAdd = 1 + 2;
+const int vSubtract = 1 - 2;
+const int vMiltiply = 1 * 2;
+const num vDivide = 1 / 2;
+const int vFloorDivide = 1 ~/ 2;
+const int vModulo = 1 % 2;
+const bool vGreater = 1 > 2;
+const bool vGreaterEqual = 1 >= 2;
+const bool vLess = 1 < 2;
+const bool vLessEqual = 1 <= 2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vEqual = 1 == 2;
+const dynamic vAnd = true && false;
+const dynamic vOr = false || true;
+const dynamic vBitXor = 1 ^ 2;
+const dynamic vBitAnd = 1 & 2;
+const dynamic vBitOr = 1 | 2;
+const dynamic vBitShiftLeft = 1 << 2;
+const dynamic vBitShiftRight = 1 >> 2;
+const dynamic vAdd = 1 + 2;
+const dynamic vSubtract = 1 - 2;
+const dynamic vMiltiply = 1 * 2;
+const dynamic vDivide = 1 / 2;
+const dynamic vFloorDivide = 1 ~/ 2;
+const dynamic vModulo = 1 % 2;
+const dynamic vGreater = 1 > 2;
+const dynamic vGreaterEqual = 1 >= 2;
+const dynamic vLess = 1 < 2;
+const dynamic vLessEqual = 1 <= 2;
+''');
+    }
   }
 
   test_const_topLevel_conditional() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vConditional = (1 == 2) ? 11 : 22;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int vConditional = 1 == 2 ? 11 : 22;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vConditional = 1 == 2 ? 11 : 22;
+''');
+    }
   }
 
   test_const_topLevel_identical() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vIdentical = (1 == 2) ? 11 : 22;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int vIdentical = 1 == 2 ? 11 : 22;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vIdentical = 1 == 2 ? 11 : 22;
+''');
+    }
   }
 
   test_const_topLevel_ifNull() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vIfNull = 1 ?? 2.0;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const num vIfNull = 1 ?? 2.0;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vIfNull = 1 ?? 2.0;
+''');
+    }
   }
 
   test_const_topLevel_literal() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vNull = null;
 const vBoolFalse = false;
 const vBoolTrue = true;
@@ -2372,31 +4886,107 @@
 const vStringInterpolation = 'aaa ${true} ${42} bbb';
 const vSymbol = #aaa.bbb.ccc;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic vNull = null;
+const bool vBoolFalse = false;
+const bool vBoolTrue = true;
+const int vInt = 1;
+const int vIntLong = 44998905507923676709665;
+const double vDouble = 2.3;
+const String vString = 'abc';
+const String vStringConcat = 'aaabbb';
+const String vStringInterpolation = 'aaa ${true} ${42} bbb';
+const Symbol vSymbol = #aaa.bbb.ccc;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vNull = null;
+const dynamic vBoolFalse = false;
+const dynamic vBoolTrue = true;
+const dynamic vInt = 1;
+const dynamic vIntLong = 44998905507923676709665;
+const dynamic vDouble = 2.3;
+const dynamic vString = 'abc';
+const dynamic vStringConcat = 'aaabbb';
+const dynamic vStringInterpolation = 'aaa ${true} ${42} bbb';
+const dynamic vSymbol = #aaa.bbb.ccc;
+''');
+    }
   }
 
   test_const_topLevel_prefix() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vNotEqual = 1 != 2;
 const vNot = !true;
 const vNegate = -1;
 const vComplement = ~1;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const bool vNotEqual = 1 != 2;
+const bool vNot = !true;
+const int vNegate = -1;
+const int vComplement = ~1;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vNotEqual = 1 != 2;
+const dynamic vNot = !true;
+const dynamic vNegate = -1;
+const dynamic vComplement = ~1;
+''');
+    }
   }
 
   test_const_topLevel_super() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vSuper = super;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic vSuper = super;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vSuper = super;
+''');
+    }
   }
 
   test_const_topLevel_this() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vThis = this;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic vThis = this;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vThis = this;
+''');
+    }
   }
 
   test_const_topLevel_typedList() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vNull = const <Null>[];
 const vDynamic = const <dynamic>[1, 2, 3];
 const vInterfaceNoTypeParameters = const <int>[1, 2, 3];
@@ -2404,101 +4994,313 @@
 const vInterfaceWithTypeArguments = const <List<String>>[];
 const vInterfaceWithTypeArguments2 = const <Map<int, List<String>>>[];
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const List<Null> vNull = const <Null>[];
+const List<dynamic> vDynamic = const <dynamic>[1, 2, 3];
+const List<int> vInterfaceNoTypeParameters = const <int>[1, 2, 3];
+const List<List<dynamic>> vInterfaceNoTypeArguments = const <List>[];
+const List<List<String>> vInterfaceWithTypeArguments = const <List<String>>[];
+const List<Map<int, List<String>>> vInterfaceWithTypeArguments2 = const <Map<int, List<String>>>[];
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vNull = const <Null>[];
+const dynamic vDynamic = const <dynamic>[1, 2, 3];
+const dynamic vInterfaceNoTypeParameters = const <int>[1, 2, 3];
+const dynamic vInterfaceNoTypeArguments = const <List>[];
+const dynamic vInterfaceWithTypeArguments = const <List<String>>[];
+const dynamic vInterfaceWithTypeArguments2 = const <Map<int, List<String>>>[];
+''');
+    }
   }
 
   test_const_topLevel_typedList_imported() {
     addLibrarySource('/a.dart', 'class C {}');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart';
 const v = const <C>[];
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const List<C> v = const <C>[];
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+const dynamic v = const <C>[];
+''');
+    }
   }
 
   test_const_topLevel_typedList_importedWithPrefix() {
     addLibrarySource('/a.dart', 'class C {}');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'a.dart' as p;
 const v = const <p.C>[];
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const List<C> v = const <C>[];
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as p;
+const dynamic v = const <C>[];
+''');
+    }
   }
 
   test_const_topLevel_typedMap() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const vDynamic1 = const <dynamic, int>{};
 const vDynamic2 = const <int, dynamic>{};
 const vInterface = const <int, String>{};
 const vInterfaceWithTypeArguments = const <int, List<String>>{};
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const Map<dynamic, int> vDynamic1 = const <dynamic, int>{};
+const Map<int, dynamic> vDynamic2 = const <int, dynamic>{};
+const Map<int, String> vInterface = const <int, String>{};
+const Map<int, List<String>> vInterfaceWithTypeArguments = const <int, List<String>>{};
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic vDynamic1 = const <dynamic, int>{};
+const dynamic vDynamic2 = const <int, dynamic>{};
+const dynamic vInterface = const <int, String>{};
+const dynamic vInterfaceWithTypeArguments = const <int, List<String>>{};
+''');
+    }
   }
 
   test_const_topLevel_untypedList() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const v = const [1, 2, 3];
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const List<int> v = const [1, 2, 3];
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic v = const [1, 2, 3];
+''');
+    }
   }
 
   test_const_topLevel_untypedMap() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 const v = const {0: 'aaa', 1: 'bbb', 2: 'ccc'};
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const Map<int, String> v = const {0: 'aaa', 1: 'bbb', 2: 'ccc'};
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic v = const {0: 'aaa', 1: 'bbb', 2: 'ccc'};
+''');
+    }
   }
 
   test_constExpr_pushReference_field_simpleIdentifier() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   static const a = b;
   static const b = null;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const dynamic a = C.b;
+  static const dynamic b = null;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const dynamic a = C.b;
+  static const dynamic b = null;
+}
+''');
+    }
   }
 
   test_constExpr_pushReference_staticMethod_simpleIdentifier() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   static const a = m;
   static m() {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const () → dynamic a = C.m;
+  static dynamic m() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const dynamic a = C.m;
+  static dynamic m() {}
+}
+''');
+    }
   }
 
   test_constructor_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   /**
    * Docs
    */
   C();
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  C();
+}
+''');
+    }
   }
 
   test_constructor_initializers_assertInvocation() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   const C(int x) : assert(x >= 42);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C(int x) : assert(x >= 42);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C(int x) : assert(x >= 42);
+}
+''');
+    }
   }
 
   test_constructor_initializers_assertInvocation_message() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   const C(int x) : assert(x >= 42, 'foo');
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C(int x) : assert(x >= 42, 'foo');
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C(int x) : assert(x >= 42, 'foo');
+}
+''');
+    }
   }
 
   test_constructor_initializers_field() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   final x;
   const C() : x = 42;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = 42;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = 42;
+}
+''');
+    }
   }
 
   test_constructor_initializers_field_notConst() {
     variablesWithNotConstInitializers.add('x');
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class C {
   final x;
@@ -2507,19 +5309,59 @@
 int foo() => 42;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = $$invalidConstExpr$$;
+}
+int foo() {}
+''');
+    }
   }
 
   test_constructor_initializers_field_withParameter() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   final x;
   const C(int p) : x = 1 + p;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C(int p) : x = 1 + p;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C(int p) : x = 1 + p;
+}
+''');
+    }
   }
 
   test_constructor_initializers_superInvocation_named() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class A {
   const A.aaa(int p);
 }
@@ -2527,10 +5369,33 @@
   const C() : super.aaa(42);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.aaa(int p);
+}
+class C extends A {
+  const C() : super.aaa(42);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.aaa(int p);
+}
+class C extends A {
+  const C() : super.aaa(42);
+}
+''');
+    }
   }
 
   test_constructor_initializers_superInvocation_namedExpression() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class A {
   const A.aaa(a, {int b});
 }
@@ -2538,10 +5403,33 @@
   const C() : super.aaa(1, b: 2);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.aaa(dynamic a, {int b});
+}
+class C extends A {
+  const C() : super.aaa(1, b: 2);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.aaa(dynamic a, {int b});
+}
+class C extends A {
+  const C() : super.aaa(1, b: 2);
+}
+''');
+    }
   }
 
   test_constructor_initializers_superInvocation_unnamed() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class A {
   const A(int p);
 }
@@ -2549,37 +5437,117 @@
   const C.ccc() : super(42);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(int p);
+}
+class C extends A {
+  const C.ccc() : super(42);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(int p);
+}
+class C extends A {
+  const C.ccc() : super(42);
+}
+''');
+    }
   }
 
   test_constructor_initializers_thisInvocation_named() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   const C() : this.named(1, 'bbb');
   const C.named(int a, String b);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C() = C.named : this.named(1, 'bbb');
+  const C.named(int a, String b);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C() = C.named : this.named(1, 'bbb');
+  const C.named(int a, String b);
+}
+''');
+    }
   }
 
   test_constructor_initializers_thisInvocation_namedExpression() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   const C() : this.named(1, b: 2);
   const C.named(a, {int b});
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C() = C.named : this.named(1, b: 2);
+  const C.named(dynamic a, {int b});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C() = C.named : this.named(1, b: 2);
+  const C.named(dynamic a, {int b});
+}
+''');
+    }
   }
 
   test_constructor_initializers_thisInvocation_unnamed() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   const C.named() : this(1, 'bbb');
   const C(int a, String b);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.named() = C : this(1, 'bbb');
+  const C(int a, String b);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  const C.named() = C : this(1, 'bbb');
+  const C(int a, String b);
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   factory C() = D.named;
   C._();
@@ -2588,10 +5556,35 @@
   D.named() : super._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C() = D.named;
+  C._();
+}
+class D extends C {
+  D.named();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C() = D.named;
+  C._();
+}
+class D extends C {
+  D.named();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_generic() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   factory C() = D<U, T>.named;
   C._();
@@ -2600,6 +5593,31 @@
   D.named() : super._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D.named();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D.named();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_imported() {
@@ -2611,13 +5629,34 @@
   D.named() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart';
 class C {
   factory C() = D.named;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_imported_generic() {
@@ -2629,13 +5668,34 @@
   D.named() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart';
 class C<T, U> {
   factory C() = D<U, T>.named;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_prefixed() {
@@ -2647,13 +5707,34 @@
   D.named() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart' as foo;
 class C {
   factory C() = foo.D.named;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_prefixed_generic() {
@@ -2665,27 +5746,65 @@
   D.named() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart' as foo;
 class C<T, U> {
   factory C() = foo.D<U, T>.named;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_unresolved_class() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class C<E> {
   factory C() = D.named<E>;
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<E> {
+  factory C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<E> {
+  factory C();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_named_unresolved_constructor() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class D {}
 class C<E> {
@@ -2693,10 +5812,31 @@
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class D {
+}
+class C<E> {
+  factory C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class D {
+}
+class C<E> {
+  factory C();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   factory C() = D;
   C._();
@@ -2705,10 +5845,35 @@
   D() : super._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C() = D;
+  C._();
+}
+class D extends C {
+  D();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  factory C() = D;
+  C._();
+}
+class D extends C {
+  D();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_generic() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   factory C() = D<U, T>;
   C._();
@@ -2717,6 +5882,31 @@
   D() : super._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_imported() {
@@ -2728,13 +5918,34 @@
   D() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart';
 class C {
   factory C() = D;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_imported_generic() {
@@ -2746,13 +5957,34 @@
   D() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart';
 class C<T, U> {
   factory C() = D<U, T>;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_prefixed() {
@@ -2764,13 +5996,34 @@
   D() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart' as foo;
 class C {
   factory C() = foo.D;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_prefixed_generic() {
@@ -2782,63 +6035,177 @@
   D() : super._();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'foo.dart' as foo;
 class C<T, U> {
   factory C() = foo.D<U, T>;
   C._();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    }
   }
 
   test_constructor_redirected_factory_unnamed_unresolved() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class C<E> {
   factory C() = D<E>;
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<E> {
+  factory C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<E> {
+  factory C();
+}
+''');
+    }
   }
 
   test_constructor_redirected_thisInvocation_named() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   C.named();
   C() : this.named();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.named();
+  C() = C.named;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.named();
+  C() = C.named;
+}
+''');
+    }
   }
 
   test_constructor_redirected_thisInvocation_named_generic() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T> {
   C.named();
   C() : this.named();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  C.named();
+  C() = C<T>.named;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  C.named();
+  C() = C<T>.named;
+}
+''');
+    }
   }
 
   test_constructor_redirected_thisInvocation_unnamed() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   C();
   C.named() : this();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+  C.named() = C;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+  C.named() = C;
+}
+''');
+    }
   }
 
   test_constructor_redirected_thisInvocation_unnamed_generic() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T> {
   C();
   C.named() : this();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  C();
+  C.named() = C<T>;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  C();
+  C.named() = C<T>;
+}
+''');
+    }
   }
 
   test_constructor_withCycles_const() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   final x;
   const C() : x = const D();
@@ -2848,10 +6215,37 @@
   const D() : x = const C();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = const D();
+}
+class D {
+  final dynamic x;
+  const D() : x = const C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  const C() : x = const D();
+}
+class D {
+  final dynamic x;
+  const D() : x = const C();
+}
+''');
+    }
   }
 
   test_constructor_withCycles_nonConst() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   final x;
   C() : x = new D();
@@ -2861,10 +6255,37 @@
   D() : x = new C();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  C();
+}
+class D {
+  final dynamic x;
+  D();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x;
+  C();
+}
+class D {
+  final dynamic x;
+  D();
+}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_constructor() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class B<T> {
   const B();
 }
@@ -2872,10 +6293,33 @@
   const C([B<T> b = const B()]);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C<T> {
+  const C([B<T> b = const B()]);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C<T> {
+  const C([B<T> b = const B()]);
+}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_constructor2() {
-    checkLibrary('''
+    var library = checkLibrary('''
 abstract class A<T> {}
 class B<T> implements A<T> {
   const B();
@@ -2884,19 +6328,65 @@
   const C([A<T> a = const B()]);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class A<T> {
+}
+class B<T> implements A<T> {
+  const B();
+}
+class C<T> implements A<Iterable<T>> {
+  const C([A<T> a = const B()]);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class A<T> {
+}
+class B<T> implements A<T> {
+  const B();
+}
+class C<T> implements A<Iterable<T>> {
+  const C([A<T> a = const B()]);
+}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_functionG() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class B<T> {
   const B();
 }
 void foo<T>([B<T> b = const B()]) {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+void foo<T>([B<T> b = const B()]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+void foo<T>([B<T> b = const B()]) {}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_methodG() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class B<T> {
   const B();
 }
@@ -2904,10 +6394,33 @@
   void foo<T>([B<T> b = const B()]) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C {
+  void foo<T>([B<T> b = const B()]) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C {
+  void foo<T>([B<T> b = const B()]) {}
+}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_methodG_classG() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class B<T1, T2> {
   const B();
 }
@@ -2915,10 +6428,33 @@
   void foo<E2>([B<E1, E2> b = const B()]) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class B<T1, T2> {
+  const B();
+}
+class C<E1> {
+  void foo<E2>([B<E1, E2> b = const B()]) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class B<T1, T2> {
+  const B();
+}
+class C<E1> {
+  void foo<E2>([B<E1, E2> b = const B()]) {}
+}
+''');
+    }
   }
 
   test_defaultValue_refersToGenericClass_methodNG() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class B<T> {
   const B();
 }
@@ -2926,37 +6462,168 @@
   void foo([B<T> b = const B()]) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C<T> {
+  void foo([B<T> b = const B()]) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class B<T> {
+  const B();
+}
+class C<T> {
+  void foo([B<T> b = const B()]) {}
+}
+''');
+    }
   }
 
   test_enum_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 enum E { v }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+''');
+    }
   }
 
   test_enum_value_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 enum E {
   /**
    * Docs
    */
   v
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  /**
+   * Docs
+   */
+  static const E v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  /**
+   * Docs
+   */
+  static const E v;
+}
+''');
+    }
   }
 
   test_enum_values() {
-    checkLibrary('enum E { v1, v2 }');
+    var library = checkLibrary('enum E { v1, v2 }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v1;
+  static const E v2;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v1;
+  static const E v2;
+}
+''');
+    }
   }
 
   test_enums() {
-    checkLibrary('enum E1 { v1 } enum E2 { v2 }');
+    var library = checkLibrary('enum E1 { v1 } enum E2 { v2 }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E1 {
+  final int index;
+  static const List<E1> values;
+  static const E1 v1;
+}
+enum E2 {
+  final int index;
+  static const List<E2> values;
+  static const E2 v2;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E1 {
+  final int index;
+  static const List<E1> values;
+  static const E1 v1;
+}
+enum E2 {
+  final int index;
+  static const List<E2> values;
+  static const E2 v2;
+}
+''');
+    }
   }
 
   test_error_extendsEnum() {
-    checkLibrary('''
+    var library = checkLibrary('''
 enum E {a, b, c}
 
 class M {}
@@ -2975,24 +6642,120 @@
 
 class D = Object with M, E;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+  static const E b;
+  static const E c;
+}
+class M {
+}
+class A {
+  dynamic foo() {}
+}
+class B implements M {
+  dynamic foo() {}
+}
+class C extends Object with M {
+  synthetic C();
+  dynamic foo() {}
+}
+class alias D extends Object with M {
+  synthetic D() = Object;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E a;
+  static const E b;
+  static const E c;
+}
+class M {
+}
+class A {
+  dynamic foo() {}
+}
+class B implements M {
+  dynamic foo() {}
+}
+class C extends Object with M {
+  synthetic C();
+  dynamic foo() {}
+}
+class alias D extends Object with M {
+  synthetic D() = Object;
+}
+''');
+    }
   }
 
   test_executable_parameter_type_typedef() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 typedef F(int p);
 main(F f) {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int p);
+dynamic main(F f) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int p);
+dynamic main(F f) {}
+''');
+    }
   }
 
   test_export_class() {
     addLibrarySource('/a.dart', 'class C {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_class_type_alias() {
     addLibrarySource(
         '/a.dart', 'class C {} exends _D with _E; class _D {} class _E {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_configurations_useDefault() {
@@ -3005,6 +6768,19 @@
   if (dart.library.io) 'foo_io.dart'
   if (dart.library.html) 'foo_html.dart';
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'foo.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'foo.dart';
+''');
+    }
     expect(library.exports[0].uri, 'foo.dart');
     expect(library.exports[0].exportedLibrary.source.shortName, 'foo.dart');
   }
@@ -3020,6 +6796,19 @@
   if (dart.library.io) 'foo_io.dart'
   if (dart.library.html) 'foo_html.dart';
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'foo_io.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'foo_io.dart';
+''');
+    }
     expect(library.exports[0].uri, 'foo_io.dart');
     expect(library.exports[0].exportedLibrary.source.shortName, 'foo_io.dart');
   }
@@ -3035,6 +6824,19 @@
   if (dart.library.io) 'foo_io.dart'
   if (dart.library.html) 'foo_html.dart';
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'foo_html.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'foo_html.dart';
+''');
+    }
     ExportElement export = library.exports[0];
     expect(export.uri, 'foo_html.dart');
     expect(export.exportedLibrary.source.shortName, 'foo_html.dart');
@@ -3042,52 +6844,182 @@
 
   test_export_function() {
     addLibrarySource('/a.dart', 'f() {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_getter() {
     addLibrarySource('/a.dart', 'get f() => null;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_hide() {
     addLibrary('dart:async');
-    checkLibrary('export "dart:async" hide Stream, Future;');
+    var library = checkLibrary('export "dart:async" hide Stream, Future;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' hide Stream, Future;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' hide Stream, Future;
+''');
+    }
   }
 
   test_export_multiple_combinators() {
     addLibrary('dart:async');
-    checkLibrary('export "dart:async" hide Stream show Future;');
+    var library = checkLibrary('export "dart:async" hide Stream show Future;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' hide Stream show Future;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' hide Stream show Future;
+''');
+    }
   }
 
   test_export_setter() {
     addLibrarySource('/a.dart', 'void set f(value) {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_show() {
     addLibrary('dart:async');
-    checkLibrary('export "dart:async" show Future, Stream;');
+    var library = checkLibrary('export "dart:async" show Future, Stream;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' show Future, Stream;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'dart:async' show Future, Stream;
+''');
+    }
   }
 
   test_export_typedef() {
     addLibrarySource('/a.dart', 'typedef F();');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_variable() {
     addLibrarySource('/a.dart', 'var x;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_variable_const() {
     addLibrarySource('/a.dart', 'const x = 0;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_export_variable_final() {
     addLibrarySource('/a.dart', 'final x = 0;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_exportImport_configurations_useDefault() {
@@ -3106,6 +7038,23 @@
 import 'bar.dart';
 class B extends A {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'bar.dart';
+class B extends A {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'bar.dart';
+class B extends A {
+}
+''');
+    }
     var typeA = library.definingCompilationUnit.getType('B').supertype;
     expect(typeA.element.source.shortName, 'foo.dart');
   }
@@ -3127,6 +7076,23 @@
 import 'bar.dart';
 class B extends A {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'bar.dart';
+class B extends A {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'bar.dart';
+class B extends A {
+}
+''');
+    }
     var typeA = library.definingCompilationUnit.getType('B').supertype;
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
@@ -3134,215 +7100,849 @@
   test_exports() {
     addLibrarySource('/a.dart', 'library a;');
     addLibrarySource('/b.dart', 'library b;');
-    checkLibrary('export "a.dart"; export "b.dart";');
+    var library = checkLibrary('export "a.dart"; export "b.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+export 'b.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+export 'b.dart';
+''');
+    }
   }
 
   test_expr_invalid_typeParameter_asPrefix() {
     variablesWithNotConstInitializers.add('f');
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T> {
   final f = T.k;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  final dynamic f = $$invalidConstExpr$$;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  final dynamic f = $$invalidConstExpr$$;
+}
+''');
+    }
   }
 
   test_field_covariant() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   covariant int x;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  covariant int x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  covariant int x;
+}
+''');
+    }
   }
 
   test_field_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   /**
    * Docs
    */
   var x;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  dynamic x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  dynamic x;
+}
+''');
+    }
   }
 
   test_field_formal_param_inferred_type_implicit() {
-    checkLibrary('class C extends D { var v; C(this.v); }'
+    var library = checkLibrary('class C extends D { var v; C(this.v); }'
         ' abstract class D { int get v; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  int v;
+  C(int this.v);
+}
+abstract class D {
+  int get v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  dynamic v;
+  C(dynamic this.v);
+}
+abstract class D {
+  int get v;
+}
+''');
+    }
   }
 
   test_field_inferred_type_nonStatic_explicit_initialized() {
-    checkLibrary('class C { num v = 0; }');
+    var library = checkLibrary('class C { num v = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  num v;
+}
+''');
+    }
   }
 
   test_field_inferred_type_nonStatic_implicit_initialized() {
-    checkLibrary('class C { var v = 0; }');
+    var library = checkLibrary('class C { var v = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic v;
+}
+''');
+    }
   }
 
   test_field_inferred_type_nonStatic_implicit_uninitialized() {
-    checkLibrary(
+    var library = checkLibrary(
         'class C extends D { var v; } abstract class D { int get v; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  int v;
+}
+abstract class D {
+  int get v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  dynamic v;
+}
+abstract class D {
+  int get v;
+}
+''');
+    }
   }
 
   test_field_inferred_type_static_implicit_initialized() {
-    checkLibrary('class C { static var v = 0; }');
+    var library = checkLibrary('class C { static var v = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static int v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static dynamic v;
+}
+''');
+    }
   }
 
   test_field_propagatedType_const_noDep() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   static const x = 0;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const int x = 0;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static const dynamic x = 0;
+}
+''');
+    }
   }
 
   test_field_propagatedType_final_dep_inLib() {
     addLibrarySource('/a.dart', 'final a = 1;');
-    checkLibrary('''
+    var library = checkLibrary('''
 import "a.dart";
 class C {
   final b = a / 2;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class C {
+  final num b = a / 2;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class C {
+  final dynamic b = a / 2;
+}
+''');
+    }
   }
 
   test_field_propagatedType_final_dep_inPart() {
     addSource('/a.dart', 'part of lib; final a = 1;');
-    checkLibrary('''
+    var library = checkLibrary('''
 library lib;
 part "a.dart";
 class C {
   final b = a / 2;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+class C {
+  final num b = a / 2;
+}
+--------------------
+unit: a.dart
+
+final int a;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+class C {
+  final dynamic b = a / 2;
+}
+--------------------
+unit: a.dart
+
+final dynamic a;
+''');
+    }
   }
 
   test_field_propagatedType_final_noDep_instance() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   final x = 0;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final int x = 0;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  final dynamic x = 0;
+}
+''');
+    }
   }
 
   test_field_propagatedType_final_noDep_static() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   static final x = 0;
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static final int x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static final dynamic x;
+}
+''');
+    }
   }
 
   test_field_static_final_untyped() {
-    checkLibrary('class C { static final x = 0; }');
+    var library = checkLibrary('class C { static final x = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static final int x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static final dynamic x;
+}
+''');
+    }
   }
 
   test_field_untyped() {
-    checkLibrary('class C { var x = 0; }');
+    var library = checkLibrary('class C { var x = 0; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int x;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+}
+''');
+    }
   }
 
   test_function_async() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 Future f() async {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+Future<dynamic> f() async {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+Future<dynamic> f() async {}
+''');
+    }
   }
 
   test_function_asyncStar() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 Stream f() async* {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+Stream<dynamic> f() async* {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+Stream<dynamic> f() async* {}
+''');
+    }
   }
 
   test_function_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 f() {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    }
   }
 
   test_function_entry_point() {
-    checkLibrary('main() {}');
+    var library = checkLibrary('main() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    }
   }
 
   test_function_entry_point_in_export() {
     addLibrarySource('/a.dart', 'library a; main() {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_function_entry_point_in_export_hidden() {
     addLibrarySource('/a.dart', 'library a; main() {}');
-    checkLibrary('export "a.dart" hide main;');
+    var library = checkLibrary('export "a.dart" hide main;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart' hide main;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart' hide main;
+''');
+    }
   }
 
   test_function_entry_point_in_part() {
     addSource('/a.dart', 'part of my.lib; main() {}');
-    checkLibrary('library my.lib; part "a.dart";');
+    var library = checkLibrary('library my.lib; part "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+dynamic main() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+dynamic main() {}
+''');
+    }
   }
 
   test_function_external() {
-    checkLibrary('external f();');
+    var library = checkLibrary('external f();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+external dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+external dynamic f() {}
+''');
+    }
   }
 
   test_function_parameter_final() {
-    checkLibrary('f(final x) {}');
+    var library = checkLibrary('f(final x) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(final dynamic x) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(final dynamic x) {}
+''');
+    }
   }
 
   test_function_parameter_kind_named() {
-    checkLibrary('f({x}) {}');
+    var library = checkLibrary('f({x}) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f({dynamic x}) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f({dynamic x}) {}
+''');
+    }
   }
 
   test_function_parameter_kind_positional() {
-    checkLibrary('f([x]) {}');
+    var library = checkLibrary('f([x]) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f([dynamic x]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f([dynamic x]) {}
+''');
+    }
   }
 
   test_function_parameter_kind_required() {
-    checkLibrary('f(x) {}');
+    var library = checkLibrary('f(x) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(dynamic x) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(dynamic x) {}
+''');
+    }
   }
 
   test_function_parameter_parameters() {
-    checkLibrary('f(g(x, y)) {}');
+    var library = checkLibrary('f(g(x, y)) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f((dynamic, dynamic) → dynamic g) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f((dynamic, dynamic) → dynamic g) {}
+''');
+    }
   }
 
   test_function_parameter_return_type() {
-    checkLibrary('f(int g()) {}');
+    var library = checkLibrary('f(int g()) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(() → int g) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(() → int g) {}
+''');
+    }
   }
 
   test_function_parameter_return_type_void() {
-    checkLibrary('f(void g()) {}');
+    var library = checkLibrary('f(void g()) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(() → void g) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(() → void g) {}
+''');
+    }
   }
 
   test_function_parameter_type() {
-    checkLibrary('f(int i) {}');
+    var library = checkLibrary('f(int i) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(int i) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(int i) {}
+''');
+    }
   }
 
   test_function_parameters() {
-    checkLibrary('f(x, y) {}');
+    var library = checkLibrary('f(x, y) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f(dynamic x, dynamic y) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f(dynamic x, dynamic y) {}
+''');
+    }
   }
 
   test_function_return_type() {
-    checkLibrary('int f() => null;');
+    var library = checkLibrary('int f() => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+int f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+int f() {}
+''');
+    }
   }
 
   test_function_return_type_implicit() {
-    checkLibrary('f() => null;');
+    var library = checkLibrary('f() => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    }
   }
 
   test_function_return_type_void() {
-    checkLibrary('void f() {}');
+    var library = checkLibrary('void f() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    }
   }
 
   test_function_type_parameter() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('T f<T, U>(U u) => null;');
+    var library = checkLibrary('T f<T, U>(U u) => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+T f<T, U>(U u) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+T f<T, U>(U u) {}
+''');
+    }
   }
 
   test_function_type_parameter_with_function_typed_parameter() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('void f<T, U>(T x(U u)) {}');
+    var library = checkLibrary('void f<T, U>(T x(U u)) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>((U) → T x) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>((U) → T x) {}
+''');
+    }
   }
 
   test_functions() {
-    checkLibrary('f() {} g() {}');
+    var library = checkLibrary('f() {} g() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+dynamic g() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+dynamic g() {}
+''');
+    }
   }
 
   test_futureOr() {
     var library = checkLibrary('import "dart:async"; FutureOr<int> x;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+FutureOr<int> x;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+dynamic x;
+''');
+    }
     var variables = library.definingCompilationUnit.topLevelVariables;
     expect(variables, hasLength(1));
     if (createOptions().strongMode) {
@@ -3354,6 +7954,21 @@
 
   test_futureOr_const() {
     var library = checkLibrary('import "dart:async"; const x = FutureOr;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+const Type x = FutureOr;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+const dynamic x = FutureOr;
+''');
+    }
     var variables = library.definingCompilationUnit.topLevelVariables;
     expect(variables, hasLength(1));
     var x = variables[0] as ConstTopLevelVariableElementImpl;
@@ -3372,6 +7987,25 @@
 var x = f();
 var y = x.then((z) => z.asDouble());
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+FutureOr<int> x;
+dynamic y;
+FutureOr<int> f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+dynamic x;
+dynamic y;
+dynamic f() {}
+''');
+    }
     var variables = library.definingCompilationUnit.topLevelVariables;
     expect(variables, hasLength(2));
     var x = variables[0];
@@ -3389,7 +8023,7 @@
 
   test_generic_gClass_gMethodStatic() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   static void m<V, W>(V v, W w) {
     void f<X, Y>(V v, W w, X x, Y y) {
@@ -3397,6 +8031,23 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  static void m<V, W>(V v, W w) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  static void m<V, W>(V v, W w) {}
+}
+''');
+    }
   }
 
   test_getElement_constructor_named() {
@@ -3482,33 +8133,133 @@
   }
 
   test_getter_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 get x => null;''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+dynamic get x {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+dynamic get x {}
+''');
+    }
   }
 
   test_getter_external() {
-    checkLibrary('external int get x;');
+    var library = checkLibrary('external int get x;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+external int get x {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+external int get x {}
+''');
+    }
   }
 
   test_getter_inferred_type_nonStatic_implicit_return() {
-    checkLibrary(
+    var library = checkLibrary(
         'class C extends D { get f => null; } abstract class D { int get f; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  int get f {}
+}
+abstract class D {
+  int get f;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  dynamic get f {}
+}
+abstract class D {
+  int get f;
+}
+''');
+    }
   }
 
   test_getters() {
-    checkLibrary('int get x => null; get y => null;');
+    var library = checkLibrary('int get x => null; get y => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+int get x {}
+dynamic get y {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+int get x {}
+dynamic get y {}
+''');
+    }
   }
 
   test_implicitTopLevelVariable_getterFirst() {
-    checkLibrary('int get x => 0; void set x(int value) {}');
+    var library = checkLibrary('int get x => 0; void set x(int value) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+int get x {}
+void set x(int value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+int get x {}
+void set x(int value) {}
+''');
+    }
   }
 
   test_implicitTopLevelVariable_setterFirst() {
-    checkLibrary('void set x(int value) {} int get x => 0;');
+    var library = checkLibrary('void set x(int value) {} int get x => 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void set x(int value) {}
+int get x {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void set x(int value) {}
+int get x {}
+''');
+    }
   }
 
   test_import_configurations_useDefault() {
@@ -3523,6 +8274,23 @@
 
 class B extends A {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class B extends A {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+class B extends A {
+}
+''');
+    }
     var typeA = library.definingCompilationUnit.getType('B').supertype;
     expect(typeA.element.source.shortName, 'foo.dart');
   }
@@ -3540,28 +8308,108 @@
 
 class B extends A {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo_io.dart';
+class B extends A {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo_io.dart';
+class B extends A {
+}
+''');
+    }
     var typeA = library.definingCompilationUnit.getType('B').supertype;
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
   test_import_deferred() {
     addLibrarySource('/a.dart', 'f() {}');
-    checkLibrary('import "a.dart" deferred as p; main() { p.f(); }');
+    var library =
+        checkLibrary('import "a.dart" deferred as p; main() { p.f(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' deferred as p;
+dynamic main() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' deferred as p;
+dynamic main() {}
+''');
+    }
   }
 
   test_import_hide() {
     addLibrary('dart:async');
-    checkLibrary('import "dart:async" hide Stream, Completer; Future f;');
+    var library =
+        checkLibrary('import "dart:async" hide Stream, Completer; Future f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' hide Stream, Completer;
+Future<dynamic> f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' hide Stream, Completer;
+Future<dynamic> f;
+''');
+    }
   }
 
   test_import_multiple_combinators() {
     addLibrary('dart:async');
-    checkLibrary('import "dart:async" hide Stream show Future; Future f;');
+    var library =
+        checkLibrary('import "dart:async" hide Stream show Future; Future f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' hide Stream show Future;
+Future<dynamic> f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' hide Stream show Future;
+Future<dynamic> f;
+''');
+    }
   }
 
   test_import_prefixed() {
     addLibrarySource('/a.dart', 'library a; class C {}');
-    checkLibrary('import "a.dart" as a; a.C c;');
+    var library = checkLibrary('import "a.dart" as a; a.C c;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+C c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+C c;
+''');
+    }
   }
 
   test_import_self() {
@@ -3574,6 +8422,27 @@
     expect(resynthesized.imports[0].importedLibrary.location,
         resynthesized.location);
     expect(resynthesized.imports[1].importedLibrary.isDartCore, true);
+    if (isStrongMode) {
+      checkElementText(
+          resynthesized,
+          r'''
+import 'test.dart' as p;
+class C {
+}
+class D extends C {
+}
+''');
+    } else {
+      checkElementText(
+          resynthesized,
+          r'''
+import 'test.dart' as p;
+class C {
+}
+class D extends C {
+}
+''');
+    }
   }
 
   test_import_short_absolute() {
@@ -3582,78 +8451,212 @@
     var destinationPath =
         resourceProvider.pathContext.fromUri(Uri.parse('/a.dart'));
     addLibrarySource(destinationPath, 'class C {}');
-    checkLibrary('import "/a.dart"; C c;');
+    var library = checkLibrary('import "/a.dart"; C c;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import '/a.dart';
+C c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import '/a.dart';
+C c;
+''');
+    }
   }
 
   test_import_show() {
     addLibrary('dart:async');
-    checkLibrary('''
+    var library = checkLibrary('''
 import "dart:async" show Future, Stream;
 Future f;
 Stream s;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' show Future, Stream;
+Future<dynamic> f;
+Stream<dynamic> s;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' show Future, Stream;
+Future<dynamic> f;
+Stream<dynamic> s;
+''');
+    }
   }
 
   test_imports() {
     addLibrarySource('/a.dart', 'library a; class C {}');
     addLibrarySource('/b.dart', 'library b; class D {}');
-    checkLibrary('import "a.dart"; import "b.dart"; C c; D d;');
+    var library = checkLibrary('import "a.dart"; import "b.dart"; C c; D d;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+C c;
+D d;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+C c;
+D d;
+''');
+    }
   }
 
   test_inferred_function_type_for_variable_in_generic_function() {
     // In the code below, `x` has an inferred type of `() => int`, with 2
     // (unused) type parameters from the enclosing top level function.
-    checkLibrary('''
+    var library = checkLibrary('''
 f<U, V>() {
   var x = () => 0;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f<U, V>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f<U, V>() {}
+''');
+    }
   }
 
   test_inferred_function_type_in_generic_class_constructor() {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<U, V> {
   final x;
   C() : x = (() => () => 0);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  final dynamic x;
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  final dynamic x;
+  C();
+}
+''');
+    }
   }
 
   test_inferred_function_type_in_generic_class_getter() {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<U, V> {
   get x => () => () => 0;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  dynamic get x {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  dynamic get x {}
+}
+''');
+    }
   }
 
   test_inferred_function_type_in_generic_class_in_generic_method() {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 3 (unused) type parameters from the enclosing class
     // and method.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T> {
   f<U, V>() {
     print(() => () => 0);
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  dynamic f<U, V>() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  dynamic f<U, V>() {}
+}
+''');
+    }
   }
 
   test_inferred_function_type_in_generic_class_setter() {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<U, V> {
   void set x(value) {
     print(() => () => 0);
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  void set x(dynamic value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<U, V> {
+  void set x(dynamic value) {}
+}
+''');
+    }
   }
 
   test_inferred_function_type_in_generic_closure() {
@@ -3668,11 +8671,23 @@
     }
     // In the code below, `<U, V>() => () => 0` has an inferred return type of
     // `() => int`, with 3 (unused) type parameters.
-    checkLibrary('''
+    var library = checkLibrary('''
 f<T>() {
   print(/*<U, V>*/() => () => 0);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f<T>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_inferred_generic_function_type_in_generic_closure() {
@@ -3687,35 +8702,136 @@
     }
     // In the code below, `<U, V>() => <W, X, Y, Z>() => 0` has an inferred
     // return type of `() => int`, with 7 (unused) type parameters.
-    checkLibrary('''
+    var library = checkLibrary('''
 f<T>() {
   print(/*<U, V>*/() => /*<W, X, Y, Z>*/() => 0);
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f<T>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_inferred_type_is_typedef() {
-    checkLibrary('typedef int F(String s);'
+    var library = checkLibrary('typedef int F(String s);'
         ' class C extends D { var v; }'
         ' abstract class D { F get v; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef int F(String s);
+class C extends D {
+  F v;
+}
+abstract class D {
+  F get v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef int F(String s);
+class C extends D {
+  dynamic v;
+}
+abstract class D {
+  F get v;
+}
+''');
+    }
   }
 
   test_inferred_type_refers_to_bound_type_param() {
-    checkLibrary('class C<T> extends D<int, T> { var v; }'
+    var library = checkLibrary('class C<T> extends D<int, T> { var v; }'
         ' abstract class D<U, V> { Map<V, U> get v; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> extends D<int, T> {
+  Map<T, int> v;
+}
+abstract class D<U, V> {
+  Map<V, U> get v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> extends D<int, T> {
+  dynamic v;
+}
+abstract class D<U, V> {
+  Map<V, U> get v;
+}
+''');
+    }
   }
 
   void test_inferred_type_refers_to_function_typed_param_of_typedef() {
-    checkLibrary('''
+    var library = checkLibrary('''
 typedef void F(int g(String s));
 h(F f) => null;
 var v = h(/*info:INFERRED_TYPE_CLOSURE*/(y) {});
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef void F((String) → int g);
+dynamic v;
+dynamic h(F f) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef void F((String) → int g);
+dynamic v;
+dynamic h(F f) {}
+''');
+    }
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_generic_class() {
-    checkLibrary('class C<T, U> extends D<U, int> { void f(int x, g) {} }'
-        ' abstract class D<V, W> { void f(int x, W g(V s)); }');
+    var library =
+        checkLibrary('class C<T, U> extends D<U, int> { void f(int x, g) {} }'
+            ' abstract class D<V, W> { void f(int x, W g(V s)); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> extends D<U, int> {
+  void f(int x, (U) → int g) {}
+}
+abstract class D<V, W> {
+  void f(int x, (V) → W g);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> extends D<U, int> {
+  void f(int x, dynamic g) {}
+}
+abstract class D<V, W> {
+  void f(int x, (V) → W g);
+}
+''');
+    }
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_other_lib() {
@@ -3723,31 +8839,127 @@
         '/a.dart', 'import "b.dart"; abstract class D extends E {}');
     addLibrarySource(
         '/b.dart', 'abstract class E { void f(int x, int g(String s)); }');
-    checkLibrary('import "a.dart"; class C extends D { void f(int x, g) {} }');
+    var library = checkLibrary(
+        'import "a.dart"; class C extends D { void f(int x, g) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class C extends D {
+  void f(int x, (String) → int g) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class C extends D {
+  void f(int x, dynamic g) {}
+}
+''');
+    }
   }
 
   test_inferred_type_refers_to_method_function_typed_parameter_type() {
-    checkLibrary('class C extends D { void f(int x, g) {} }'
+    var library = checkLibrary('class C extends D { void f(int x, g) {} }'
         ' abstract class D { void f(int x, int g(String s)); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void f(int x, (String) → int g) {}
+}
+abstract class D {
+  void f(int x, (String) → int g);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void f(int x, dynamic g) {}
+}
+abstract class D {
+  void f(int x, (String) → int g);
+}
+''');
+    }
   }
 
   test_inferred_type_refers_to_nested_function_typed_param() {
-    checkLibrary('''
+    var library = checkLibrary('''
 f(void g(int x, void h())) => null;
 var v = f((x, y) {});
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+dynamic f((int, () → void) → void g) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+dynamic f((int, () → void) → void g) {}
+''');
+    }
   }
 
   test_inferred_type_refers_to_nested_function_typed_param_named() {
-    checkLibrary('''
+    var library = checkLibrary('''
 f({void g(int x, void h())}) => null;
 var v = f(g: (x, y) {});
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+dynamic f({(int, () → void) → void g}) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+dynamic f({(int, () → void) → void g}) {}
+''');
+    }
   }
 
   test_inferred_type_refers_to_setter_function_typed_parameter_type() {
-    checkLibrary('class C extends D { void set f(g) {} }'
+    var library = checkLibrary('class C extends D { void set f(g) {} }'
         ' abstract class D { void set f(int g(String s)); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void set f((String) → int g) {}
+}
+abstract class D {
+  void set f((String) → int g);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void set f(dynamic g) {}
+}
+abstract class D {
+  void set f((String) → int g);
+}
+''');
+    }
   }
 
   void test_inferredType_definedInSdkLibraryPart() {
@@ -3765,6 +8977,25 @@
   m(p) {}
 }
   ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class B extends A {
+  dynamic m(Stream<dynamic> p) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+class B extends A {
+  dynamic m(dynamic p) {}
+}
+''');
+    }
     ClassElement b = library.definingCompilationUnit.types[0];
     ParameterElement p = b.methods[0].parameters[0];
     // This test should verify that we correctly record inferred types,
@@ -3777,15 +9008,32 @@
   }
 
   void test_inferredType_usesSyntheticFunctionType_functionTypedParam() {
-    checkLibrary('''
+    var library = checkLibrary('''
 int f(int x(String y)) => null;
 String g(int x(String y)) => null;
 var v = [f, g];
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+List<((String) → int) → Object> v;
+int f((String) → int x) {}
+String g((String) → int x) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+int f((String) → int x) {}
+String g((String) → int x) {}
+''');
+    }
   }
 
   test_inheritance_errors() {
-    checkLibrary('''
+    var library = checkLibrary('''
 abstract class A {
   int m();
 }
@@ -3800,63 +9048,214 @@
   var f;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+abstract class A {
+  int m();
+}
+abstract class B {
+  String m();
+}
+abstract class C implements A, B {
+}
+abstract class D extends C {
+  dynamic f;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+abstract class A {
+  int m();
+}
+abstract class B {
+  String m();
+}
+abstract class C implements A, B {
+}
+abstract class D extends C {
+  dynamic f;
+}
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure() {
-    checkLibrary('var v = () => 0;');
+    var library = checkLibrary('var v = () => 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+() → int v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_await_dynamic() {
-    checkLibrary('var v = (f) async => await f;');
+    var library = checkLibrary('var v = (f) async => await f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+(dynamic) → Future<dynamic> v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_await_future3_int() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 var v = (Future<Future<Future<int>>> f) async => await f;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+(Future<Future<Future<int>>>) → Future<int> v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+dynamic v;
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_await_future_int() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 var v = (Future<int> f) async => await f;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+(Future<int>) → Future<int> v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+dynamic v;
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_await_future_noArg() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 var v = (Future f) async => await f;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+(Future<dynamic>) → Future<dynamic> v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+dynamic v;
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_field() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   var v = () => 0;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  () → int v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic v;
+}
+''');
+    }
   }
 
   test_initializer_executable_with_return_type_from_closure_local() {
-    checkLibrary('''
+    var library = checkLibrary('''
 void f() {
   int u = 0;
   var v = () => 0;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    }
   }
 
   test_instantiateToBounds_boundRefersToEarlierTypeArgument() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<S extends num, T extends C<S, T>> {}
 C c;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<S extends num, T extends C<S, T>> {
+}
+C<num, C<num, dynamic>> c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<S extends num, T extends C<S, T>> {
+}
+C<dynamic, dynamic> c;
+''');
+    }
   }
 
   test_instantiateToBounds_boundRefersToItself() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T extends C<T>> {}
 C c;
 var c2 = new C();
@@ -3864,27 +9263,101 @@
   var c3 = new C();
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends C<T>> {
+}
+class B {
+  C<C<dynamic>> c3;
+}
+C<C<dynamic>> c;
+C<C<dynamic>> c2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends C<T>> {
+}
+class B {
+  dynamic c3;
+}
+C<dynamic> c;
+dynamic c2;
+''');
+    }
   }
 
   test_instantiateToBounds_boundRefersToLaterTypeArgument() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T extends C<T, U>, U extends num> {}
 C c;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends C<T, U>, U extends num> {
+}
+C<C<dynamic, num>, num> c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends C<T, U>, U extends num> {
+}
+C<dynamic, dynamic> c;
+''');
+    }
   }
 
   test_instantiateToBounds_functionTypeAlias_simple() {
-    checkLibrary('''
+    var library = checkLibrary('''
 typedef F<T extends num>(T p);
 F f;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T extends num>(T p);
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T extends num>(T p);
+F f;
+''');
+    }
   }
 
   test_instantiateToBounds_simple() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T extends num> {}
 C c;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T extends num> {
+}
+C<num> c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T extends num> {
+}
+C<dynamic> c;
+''');
+    }
   }
 
   test_invalid_annotation_prefixed_constructor() {
@@ -3895,11 +9368,30 @@
   const C.named();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import "a.dart" as a;
 @a.C.named
 class D {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+@a.C.named
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+@a.C.named
+class D {
+}
+''');
+    }
   }
 
   test_invalid_annotation_unprefixed_constructor() {
@@ -3910,31 +9402,86 @@
   const C.named();
 }
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import "a.dart";
 @C.named
 class D {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+@C.named
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+@C.named
+class D {
+}
+''');
+    }
   }
 
   test_invalid_importPrefix_asTypeArgument() {
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'dart:async' as ppp;
 class C {
   List<ppp> v;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as ppp;
+class C {
+  List<dynamic> v;
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as ppp;
+class C {
+  List<dynamic> v;
+}
+''');
+    }
   }
 
   test_invalid_nameConflict_imported() {
     namesThatCannotBeResolved.add('V');
     addLibrarySource('/a.dart', 'V() {}');
     addLibrarySource('/b.dart', 'V() {}');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'a.dart';
 import 'b.dart';
 foo([p = V]) {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+dynamic foo([dynamic p = V]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+dynamic foo([dynamic p = V]) {}
+''');
+    }
   }
 
   test_invalid_nameConflict_imported_exported() {
@@ -3947,41 +9494,109 @@
 export 'a.dart';
 export 'b.dart';
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'c.dart';
 foo([p = V]) {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+dynamic foo([dynamic p = V]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+dynamic foo([dynamic p = V]) {}
+''');
+    }
   }
 
   test_invalid_nameConflict_local() {
     namesThatCannotBeResolved.add('V');
-    checkLibrary('''
+    var library = checkLibrary('''
 foo([p = V]) {}
 V() {}
 var V;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic V;
+dynamic foo([dynamic p = V]) {}
+dynamic V() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic V;
+dynamic foo([dynamic p = V]) {}
+dynamic V() {}
+''');
+    }
   }
 
   test_invalid_setterParameter_fieldFormalParameter() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   int foo;
   void set bar(this.foo) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int foo;
+  void set bar(dynamic this.foo) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  int foo;
+  void set bar(dynamic this.foo) {}
+}
+''');
+    }
   }
 
   test_invalid_setterParameter_fieldFormalParameter_self() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   set x(this.x) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(dynamic this.x) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic set x(dynamic this.x) {}
+}
+''');
+    }
   }
 
   test_invalidUris() {
     allowMissingFiles = true;
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import '[invalid uri]';
 import '[invalid uri]:foo.dart';
 import 'a1.dart';
@@ -3998,31 +9613,104 @@
 part 'a3.dart';
 part '[invalid uri]';
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a1.dart';
+export 'a2.dart';
+part 'a3.dart';
+--------------------
+unit: a3.dart
+
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a1.dart';
+export 'a2.dart';
+part 'a3.dart';
+--------------------
+unit: a3.dart
+
+''');
+    }
   }
 
   test_library() {
-    checkLibrary('');
+    var library = checkLibrary('');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_library_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 library foo;''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library foo;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library foo;
+''');
+    }
   }
 
   test_library_name_with_spaces() {
-    checkLibrary('library foo . bar ;');
+    var library = checkLibrary('library foo . bar ;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library foo.bar;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library foo.bar;
+''');
+    }
   }
 
   test_library_named() {
-    checkLibrary('library foo.bar;');
+    var library = checkLibrary('library foo.bar;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library foo.bar;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library foo.bar;
+''');
+    }
   }
 
   test_localFunctions() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 f() {
   f1() {}
   {
@@ -4030,38 +9718,98 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    }
   }
 
   test_localFunctions_inConstructor() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   C() {
     f() {}
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    }
   }
 
   test_localFunctions_inMethod() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   m() {
     f() {}
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    }
   }
 
   test_localFunctions_inTopLevelGetter() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 get g {
   f() {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic get g {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic get g {}
+''');
+    }
   }
 
   test_localLabels_inConstructor() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {
   C() {
@@ -4074,10 +9822,27 @@
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    }
   }
 
   test_localLabels_inMethod() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 class C {
   m() {
@@ -4090,10 +9855,27 @@
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    }
   }
 
   test_localLabels_inTopLevelFunction() {
-    checkLibrary(
+    var library = checkLibrary(
         r'''
 main() {
   aaa: while (true) {}
@@ -4104,10 +9886,23 @@
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    }
   }
 
   test_localVariables_inConstructor() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   C() {
     int v;
@@ -4115,10 +9910,27 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C();
+}
+''');
+    }
   }
 
   test_localVariables_inLocalFunction() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 f() {
   f1() {
     int v1 = 1;
@@ -4131,20 +9943,50 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+''');
+    }
   }
 
   test_localVariables_inMethod() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class C {
   m() {
     int v;
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic m() {}
+}
+''');
+    }
   }
 
   test_localVariables_inTopLevelFunction() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 main() {
   int v1 = 1;
   {
@@ -4153,260 +9995,1295 @@
   Map<int, List<double>> v3;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic main() {}
+''');
+    }
   }
 
   test_localVariables_inTopLevelGetter() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 get g {
   int v;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic get g {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic get g {}
+''');
+    }
   }
 
   test_main_class() {
-    checkLibrary('class main {}');
+    var library = checkLibrary('class main {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class main {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class main {
+}
+''');
+    }
   }
 
   test_main_class_alias() {
-    checkLibrary('class main = C with D; class C {} class D {}');
+    var library = checkLibrary('class main = C with D; class C {} class D {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class alias main extends C with D {
+  synthetic main() = C;
+}
+class C {
+}
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class alias main extends C with D {
+  synthetic main() = C;
+}
+class C {
+}
+class D {
+}
+''');
+    }
   }
 
   test_main_class_alias_via_export() {
     addLibrarySource('/a.dart', 'class main = C with D; class C {} class D {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_main_class_via_export() {
     addLibrarySource('/a.dart', 'class main {}');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_main_getter() {
-    checkLibrary('get main => null;');
+    var library = checkLibrary('get main => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic get main {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic get main {}
+''');
+    }
   }
 
   test_main_getter_via_export() {
     addLibrarySource('/a.dart', 'get main => null;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_main_typedef() {
-    checkLibrary('typedef main();');
+    var library = checkLibrary('typedef main();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic main();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic main();
+''');
+    }
   }
 
   test_main_typedef_via_export() {
     addLibrarySource('/a.dart', 'typedef main();');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_main_variable() {
-    checkLibrary('var main;');
+    var library = checkLibrary('var main;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic main;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic main;
+''');
+    }
   }
 
   test_main_variable_via_export() {
     addLibrarySource('/a.dart', 'var main;');
-    checkLibrary('export "a.dart";');
+    var library = checkLibrary('export "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'a.dart';
+''');
+    }
   }
 
   test_member_function_async() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 class C {
   Future f() async {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+class C {
+  Future<dynamic> f() async {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+class C {
+  Future<dynamic> f() async {}
+}
+''');
+    }
   }
 
   test_member_function_asyncStar() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 import 'dart:async';
 class C {
   Stream f() async* {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+class C {
+  Stream<dynamic> f() async* {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async';
+class C {
+  Stream<dynamic> f() async* {}
+}
+''');
+    }
   }
 
   test_metadata_classDeclaration() {
-    checkLibrary('const a = null; @a class C {}');
+    var library = checkLibrary(r'''
+const a = null;
+const b = null;
+@a
+@b
+class C {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+@b
+class C {
+}
+const dynamic a = null;
+const dynamic b = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+@b
+class C {
+}
+const dynamic a = null;
+const dynamic b = null;
+''');
+    }
   }
 
   test_metadata_classTypeAlias() {
-    checkLibrary(
+    var library = checkLibrary(
         'const a = null; @a class C = D with E; class D {} class E {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+class alias C extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_constructor_call_named() {
-    checkLibrary('class A { const A.named(); } @A.named() class C {}');
+    var library =
+        checkLibrary('class A { const A.named(); } @A.named() class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.named();
+}
+@A.named()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A.named();
+}
+@A.named()
+class C {
+}
+''');
+    }
   }
 
   test_metadata_constructor_call_named_prefixed() {
     addLibrarySource('/foo.dart', 'class A { const A.named(); }');
-    checkLibrary('import "foo.dart" as foo; @foo.A.named() class C {}');
+    var library =
+        checkLibrary('import "foo.dart" as foo; @foo.A.named() class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+@A.named()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+@A.named()
+class C {
+}
+''');
+    }
   }
 
   test_metadata_constructor_call_unnamed() {
-    checkLibrary('class A { const A(); } @A() class C {}');
+    var library = checkLibrary('class A { const A(); } @A() class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A();
+}
+@A()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A();
+}
+@A()
+class C {
+}
+''');
+    }
   }
 
   test_metadata_constructor_call_unnamed_prefixed() {
     addLibrarySource('/foo.dart', 'class A { const A(); }');
-    checkLibrary('import "foo.dart" as foo; @foo.A() class C {}');
+    var library = checkLibrary('import "foo.dart" as foo; @foo.A() class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+@A()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart' as foo;
+@A()
+class C {
+}
+''');
+    }
   }
 
   test_metadata_constructor_call_with_args() {
-    checkLibrary('class A { const A(x); } @A(null) class C {}');
+    var library = checkLibrary('class A { const A(x); } @A(null) class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(dynamic x);
+}
+@A(null)
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(dynamic x);
+}
+@A(null)
+class C {
+}
+''');
+    }
   }
 
   test_metadata_constructorDeclaration_named() {
-    checkLibrary('const a = null; class C { @a C.named(); }');
+    var library = checkLibrary('const a = null; class C { @a C.named(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  C.named();
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  C.named();
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_constructorDeclaration_unnamed() {
-    checkLibrary('const a = null; class C { @a C(); }');
+    var library = checkLibrary('const a = null; class C { @a C(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  C();
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  C();
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_enumDeclaration() {
-    checkLibrary('const a = null; @a enum E { v }');
+    var library = checkLibrary('const a = null; @a enum E { v }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_exportDirective() {
     addLibrarySource('/foo.dart', '');
-    checkLibrary('@a export "foo.dart"; const a = null;');
+    var library = checkLibrary('@a export "foo.dart"; const a = null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+export 'foo.dart';
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+export 'foo.dart';
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_fieldDeclaration() {
-    checkLibrary('const a = null; class C { @a int x; }');
+    var library = checkLibrary('const a = null; class C { @a int x; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  int x;
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  int x;
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_fieldFormalParameter() {
-    checkLibrary('const a = null; class C { var x; C(@a this.x); }');
+    var library =
+        checkLibrary('const a = null; class C { var x; C(@a this.x); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(@a dynamic this.x);
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C(@a dynamic this.x);
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_fieldFormalParameter_withDefault() {
-    checkLibrary('const a = null; class C { var x; C([@a this.x = null]); }');
+    var library = checkLibrary(
+        'const a = null; class C { var x; C([@a this.x = null]); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C([@a dynamic this.x]);
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C([@a dynamic this.x]);
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_functionDeclaration_function() {
-    checkLibrary('const a = null; @a f() {}');
+    var library = checkLibrary('const a = null; @a f() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f() {}
+''');
+    }
   }
 
   test_metadata_functionDeclaration_getter() {
-    checkLibrary('const a = null; @a get f => null;');
+    var library = checkLibrary('const a = null; @a get f => null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+dynamic get f {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+dynamic get f {}
+''');
+    }
   }
 
   test_metadata_functionDeclaration_setter() {
-    checkLibrary('const a = null; @a set f(value) {}');
+    var library = checkLibrary('const a = null; @a set f(value) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+void set f(dynamic value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+dynamic set f(dynamic value) {}
+''');
+    }
   }
 
   test_metadata_functionTypeAlias() {
-    checkLibrary('const a = null; @a typedef F();');
+    var library = checkLibrary('const a = null; @a typedef F();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+typedef dynamic F();
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+typedef dynamic F();
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_functionTypedFormalParameter() {
-    checkLibrary('const a = null; f(@a g()) {}');
+    var library = checkLibrary('const a = null; f(@a g()) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f(@a () → dynamic g) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f(@a () → dynamic g) {}
+''');
+    }
   }
 
   test_metadata_functionTypedFormalParameter_withDefault() {
-    checkLibrary('const a = null; f([@a g() = null]) {}');
+    var library = checkLibrary('const a = null; f([@a g() = null]) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f([@a () → dynamic g = null]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f([@a () → dynamic g = null]) {}
+''');
+    }
   }
 
   test_metadata_importDirective() {
     addLibrarySource('/foo.dart', 'const b = null;');
-    checkLibrary('@a import "foo.dart"; const a = b;');
+    var library = checkLibrary('@a import "foo.dart"; const a = b;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+import 'foo.dart';
+const dynamic a = b;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+import 'foo.dart';
+const dynamic a = b;
+''');
+    }
   }
 
   test_metadata_invalid_classDeclaration() {
-    checkLibrary('f(_) {} @f(42) class C {}');
+    var library = checkLibrary('f(_) {} @f(42) class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@f(42)
+class C {
+}
+dynamic f(dynamic _) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@f(42)
+class C {
+}
+dynamic f(dynamic _) {}
+''');
+    }
   }
 
   test_metadata_libraryDirective() {
-    checkLibrary('@a library L; const a = null;');
+    var library = checkLibrary('@a library L; const a = null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@a
+library L;
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@a
+library L;
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_methodDeclaration_getter() {
-    checkLibrary('const a = null; class C { @a get m => null; }');
+    var library = checkLibrary('const a = null; class C { @a get m => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  dynamic get m {}
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  dynamic get m {}
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_methodDeclaration_method() {
-    checkLibrary('const a = null; class C { @a m() {} }');
+    var library = checkLibrary(r'''
+const a = null;
+const b = null;
+class C {
+  @a
+  @b
+  m() {}
+}
+''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  @b
+  dynamic m() {}
+}
+const dynamic a = null;
+const dynamic b = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  @b
+  dynamic m() {}
+}
+const dynamic a = null;
+const dynamic b = null;
+''');
+    }
   }
 
   test_metadata_methodDeclaration_setter() {
-    checkLibrary('const a = null; class C { @a set m(value) {} }');
+    var library =
+        checkLibrary('const a = null; class C { @a set m(value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  void set m(dynamic value) {}
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  @a
+  dynamic set m(dynamic value) {}
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_partDirective() {
     addSource('/foo.dart', 'part of L;');
-    checkLibrary('library L; @a part "foo.dart"; const a = null;');
+    var library =
+        checkLibrary('library L; @a part "foo.dart"; const a = null;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library L;
+@a
+part 'foo.dart';
+const dynamic a = null;
+--------------------
+unit: foo.dart
+
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library L;
+@a
+part 'foo.dart';
+const dynamic a = null;
+--------------------
+unit: foo.dart
+
+''');
+    }
   }
 
   test_metadata_prefixed_variable() {
     addLibrarySource('/a.dart', 'const b = null;');
-    checkLibrary('import "a.dart" as a; @a.b class C {}');
+    var library = checkLibrary('import "a.dart" as a; @a.b class C {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+@a.b
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart' as a;
+@a.b
+class C {
+}
+''');
+    }
   }
 
   test_metadata_simpleFormalParameter() {
-    checkLibrary('const a = null; f(@a x) {}');
+    var library = checkLibrary('const a = null; f(@a x) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f(@a dynamic x) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f(@a dynamic x) {}
+''');
+    }
   }
 
   test_metadata_simpleFormalParameter_withDefault() {
-    checkLibrary('const a = null; f([@a x = null]) {}');
+    var library = checkLibrary('const a = null; f([@a x = null]) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f([@a dynamic x = null]) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f([@a dynamic x = null]) {}
+''');
+    }
   }
 
   test_metadata_topLevelVariableDeclaration() {
-    checkLibrary('const a = null; @a int v;');
+    var library = checkLibrary('const a = null; @a int v;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+int v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+@a
+int v;
+''');
+    }
   }
 
   test_metadata_typeParameter_ofClass() {
-    checkLibrary('const a = null; class C<@a T> {}');
+    var library = checkLibrary('const a = null; class C<@a T> {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_typeParameter_ofClassTypeAlias() {
-    checkLibrary(
+    var library = checkLibrary(
         'const a = null; class C<@a T> = D with E; class D {} class E {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class alias C<T> extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class alias C<T> extends D with E {
+  synthetic C() = D;
+}
+class D {
+}
+class E {
+}
+const dynamic a = null;
+''');
+    }
   }
 
   test_metadata_typeParameter_ofFunction() {
-    checkLibrary('const a = null; f<@a T>() {}');
+    var library = checkLibrary('const a = null; f<@a T>() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f<T>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic a = null;
+dynamic f<T>() {}
+''');
+    }
   }
 
   test_metadata_typeParameter_ofTypedef() {
-    checkLibrary('const a = null; typedef F<@a T>();');
+    var library = checkLibrary('const a = null; typedef F<@a T>();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T>();
+const dynamic a = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T>();
+const dynamic a = null;
+''');
+    }
   }
 
   test_method_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   /**
    * Docs
    */
   f() {}
 }''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  dynamic f() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  /**
+   * Docs
+   */
+  dynamic f() {}
+}
+''');
+    }
   }
 
   test_method_inferred_type_nonStatic_implicit_param() {
-    checkLibrary('class C extends D { void f(value) {} }'
+    var library = checkLibrary('class C extends D { void f(value) {} }'
         ' abstract class D { void f(int value); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void f(int value) {}
+}
+abstract class D {
+  void f(int value);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void f(dynamic value) {}
+}
+abstract class D {
+  void f(int value);
+}
+''');
+    }
   }
 
   test_method_inferred_type_nonStatic_implicit_return() {
-    checkLibrary(
+    var library = checkLibrary(
         'class C extends D { f() => null; } abstract class D { int f(); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  int f() {}
+}
+abstract class D {
+  int f();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  dynamic f() {}
+}
+abstract class D {
+  int f();
+}
+''');
+    }
   }
 
   test_method_type_parameter() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('class C { T f<T, U>(U u) => null; }');
+    var library = checkLibrary('class C { T f<T, U>(U u) => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  T f<T, U>(U u) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  T f<T, U>(U u) {}
+}
+''');
+    }
   }
 
   test_method_type_parameter_in_generic_class() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('class C<T, U> { V f<V, W>(T t, U u, W w) => null; }');
+    var library =
+        checkLibrary('class C<T, U> { V f<V, W>(T t, U u, W w) => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  V f<V, W>(T t, U u, W w) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  V f<V, W>(T t, U u, W w) {}
+}
+''');
+    }
   }
 
   test_method_type_parameter_with_function_typed_parameter() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('class C { void f<T, U>(T x(U u)) {} }');
+    var library = checkLibrary('class C { void f<T, U>(T x(U u)) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void f<T, U>((U) → T x) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void f<T, U>((U) → T x) {}
+}
+''');
+    }
   }
 
   test_nameConflict_exportedAndLocal() {
@@ -4418,10 +11295,25 @@
 export 'a.dart';
 class C {}
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'c.dart';
 C v = null;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+C v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+C v;
+''');
+    }
   }
 
   test_nameConflict_exportedAndLocal_exported() {
@@ -4434,10 +11326,25 @@
 class C {}
 ''');
     addLibrarySource('/d.dart', 'export "c.dart";');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'd.dart';
 C v = null;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'd.dart';
+C v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'd.dart';
+C v;
+''');
+    }
   }
 
   test_nameConflict_exportedAndParted() {
@@ -4456,10 +11363,25 @@
 export 'a.dart';
 part 'b.dart';
 ''');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'c.dart';
 C v = null;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+C v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'c.dart';
+C v;
+''');
+    }
   }
 
   test_nameConflict_importWithRelativeUri_exportWithAbsolute() {
@@ -4469,15 +11391,32 @@
 
     addLibrarySource('/a.dart', 'class A {}');
     addLibrarySource('/b.dart', 'export "/a.dart";');
-    checkLibrary('''
+    var library = checkLibrary('''
 import 'a.dart';
 import 'b.dart';
 A v = null;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+A v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+import 'b.dart';
+A v;
+''');
+    }
   }
 
   test_nested_generic_functions_in_generic_class_with_function_typed_params() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   void g<V, W>() {
     void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {
@@ -4485,10 +11424,27 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  void g<V, W>() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  void g<V, W>() {}
+}
+''');
+    }
   }
 
   test_nested_generic_functions_in_generic_class_with_local_variables() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   void g<V, W>() {
     void h<X, Y>() {
@@ -4502,10 +11458,27 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  void g<V, W>() {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  void g<V, W>() {}
+}
+''');
+    }
   }
 
   test_nested_generic_functions_with_function_typed_param() {
-    checkLibrary('''
+    var library = checkLibrary('''
 void f<T, U>() {
   void g<V, W>() {
     void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {
@@ -4513,10 +11486,23 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>() {}
+''');
+    }
   }
 
   test_nested_generic_functions_with_local_variables() {
-    checkLibrary('''
+    var library = checkLibrary('''
 void f<T, U>() {
   void g<V, W>() {
     void h<X, Y>() {
@@ -4530,54 +11516,211 @@
   }
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>() {}
+''');
+    }
   }
 
   test_operator() {
-    checkLibrary('class C { C operator+(C other) => null; }');
+    var library = checkLibrary('class C { C operator+(C other) => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C +(C other) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C +(C other) {}
+}
+''');
+    }
   }
 
   test_operator_equal() {
-    checkLibrary('class C { bool operator==(Object other) => false; }');
+    var library =
+        checkLibrary('class C { bool operator==(Object other) => false; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool ==(Object other) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool ==(Object other) {}
+}
+''');
+    }
   }
 
   test_operator_external() {
-    checkLibrary('class C { external C operator+(C other); }');
+    var library = checkLibrary('class C { external C operator+(C other); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external C +(C other) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  external C +(C other) {}
+}
+''');
+    }
   }
 
   test_operator_greater_equal() {
-    checkLibrary('class C { bool operator>=(C other) => false; }');
+    var library =
+        checkLibrary('class C { bool operator>=(C other) => false; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool >=(C other) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool >=(C other) {}
+}
+''');
+    }
   }
 
   test_operator_index() {
-    checkLibrary('class C { bool operator[](int i) => null; }');
+    var library = checkLibrary('class C { bool operator[](int i) => null; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool [](int i) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool [](int i) {}
+}
+''');
+    }
   }
 
   test_operator_index_set() {
-    checkLibrary('class C { void operator[]=(int i, bool v) {} }');
+    var library =
+        checkLibrary('class C { void operator[]=(int i, bool v) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void []=(int i, bool v) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void []=(int i, bool v) {}
+}
+''');
+    }
   }
 
   test_operator_less_equal() {
-    checkLibrary('class C { bool operator<=(C other) => false; }');
+    var library =
+        checkLibrary('class C { bool operator<=(C other) => false; }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool <=(C other) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  bool <=(C other) {}
+}
+''');
+    }
   }
 
   void test_parameter_checked() {
     // Note: due to dartbug.com/27393, the keyword "checked" is identified by
     // its presence in a library called "meta".  If that bug is fixed, this test
     // my need to be changed.
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 library meta;
 const checked = null;
 class A<T> {
   void f(@checked T t) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library meta;
+class A<T> {
+  void f(@checked covariant T t) {}
+}
+const dynamic checked = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library meta;
+class A<T> {
+  void f(@checked covariant T t) {}
+}
+const dynamic checked = null;
+''');
+    }
   }
 
   void test_parameter_checked_inherited() {
     // Note: due to dartbug.com/27393, the keyword "checked" is identified by
     // its presence in a library called "meta".  If that bug is fixed, this test
     // my need to be changed.
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 library meta;
 const checked = null;
 class A<T> {
@@ -4587,15 +11730,59 @@
   void f(T t) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library meta;
+class A<T> {
+  void f(@checked covariant T t) {}
+}
+class B<T> extends A<T> {
+  void f(covariant T t) {}
+}
+const dynamic checked = null;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library meta;
+class A<T> {
+  void f(@checked covariant T t) {}
+}
+class B<T> extends A<T> {
+  void f(T t) {}
+}
+const dynamic checked = null;
+''');
+    }
   }
 
   test_parameter_covariant() {
     prepareAnalysisContext(createOptions());
-    checkLibrary('class C { void m(covariant C c) {} }');
+    var library = checkLibrary('class C { void m(covariant C c) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void m(covariant C c) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void m(covariant C c) {}
+}
+''');
+    }
   }
 
   void test_parameter_covariant_inherited() {
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 class A<T> {
   void f(covariant T t) {}
 }
@@ -4603,130 +11790,480 @@
   void f(T t) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A<T> {
+  void f(covariant T t) {}
+}
+class B<T> extends A<T> {
+  void f(covariant T t) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A<T> {
+  void f(covariant T t) {}
+}
+class B<T> extends A<T> {
+  void f(T t) {}
+}
+''');
+    }
   }
 
   test_parameter_parameters() {
-    checkLibrary('class C { f(g(x, y)) {} }');
+    var library = checkLibrary('class C { f(g(x, y)) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f((dynamic, dynamic) → dynamic g) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f((dynamic, dynamic) → dynamic g) {}
+}
+''');
+    }
   }
 
   test_parameter_parameters_in_generic_class() {
-    checkLibrary('class C<A, B> { f(A g(B x)) {} }');
+    var library = checkLibrary('class C<A, B> { f(A g(B x)) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<A, B> {
+  dynamic f((B) → A g) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<A, B> {
+  dynamic f((B) → A g) {}
+}
+''');
+    }
   }
 
   test_parameter_return_type() {
-    checkLibrary('class C { f(int g()) {} }');
+    var library = checkLibrary('class C { f(int g()) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(() → int g) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(() → int g) {}
+}
+''');
+    }
   }
 
   test_parameter_return_type_void() {
-    checkLibrary('class C { f(void g()) {} }');
+    var library = checkLibrary('class C { f(void g()) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(() → void g) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic f(() → void g) {}
+}
+''');
+    }
   }
 
   test_parameterTypeNotInferred_constructor() {
     // Strong mode doesn't do type inference on constructor parameters, so it's
     // ok that we don't store inferred type info for them in summaries.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   C.positional([x = 1]);
   C.named({x: 1});
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.positional([dynamic x = 1]);
+  C.named({dynamic x: 1});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  C.positional([dynamic x = 1]);
+  C.named({dynamic x: 1});
+}
+''');
+    }
   }
 
   test_parameterTypeNotInferred_initializingFormal() {
     // Strong mode doesn't do type inference on initializing formals, so it's
     // ok that we don't store inferred type info for them in summaries.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   var x;
   C.positional([this.x = 1]);
   C.named({this.x: 1});
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C.positional([dynamic this.x]);
+  C.named({dynamic this.x});
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  dynamic x;
+  C.positional([dynamic this.x]);
+  C.named({dynamic this.x});
+}
+''');
+    }
   }
 
   test_parameterTypeNotInferred_staticMethod() {
     // Strong mode doesn't do type inference on parameters of static methods,
     // so it's ok that we don't store inferred type info for them in summaries.
-    checkLibrary('''
+    var library = checkLibrary('''
 class C {
   static void positional([x = 1]) {}
   static void named({x: 1}) {}
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static void positional([dynamic x = 1]) {}
+  static void named({dynamic x: 1}) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static void positional([dynamic x = 1]) {}
+  static void named({dynamic x: 1}) {}
+}
+''');
+    }
   }
 
   test_parameterTypeNotInferred_topLevelFunction() {
     // Strong mode doesn't do type inference on parameters of top level
     // functions, so it's ok that we don't store inferred type info for them in
     // summaries.
-    checkLibrary('''
+    var library = checkLibrary('''
 void positional([x = 1]) {}
 void named({x: 1}) {}
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void positional([dynamic x = 1]) {}
+void named({dynamic x: 1}) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void positional([dynamic x = 1]) {}
+void named({dynamic x: 1}) {}
+''');
+    }
   }
 
   test_parts() {
     addSource('/a.dart', 'part of my.lib;');
     addSource('/b.dart', 'part of my.lib;');
-    checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    var library = checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+--------------------
+unit: b.dart
+
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+--------------------
+unit: b.dart
+
+''');
+    }
   }
 
   test_parts_invalidUri() {
     allowMissingFiles = true;
     addSource('/foo/bar.dart', 'part of my.lib;');
-    checkLibrary('library my.lib; part "foo/";');
+    var library = checkLibrary('library my.lib; part "foo/";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+''');
+    }
   }
 
   test_parts_invalidUri_nullStringValue() {
     allowMissingFiles = true;
     addSource('/foo/bar.dart', 'part of my.lib;');
-    checkLibrary(r'''
+    var library = checkLibrary(r'''
 library my.lib;
 part "${foo}/bar.dart";
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+''');
+    }
   }
 
   test_propagated_type_refers_to_closure() {
-    checkLibrary('''
+    var library = checkLibrary('''
 void f() {
   var x = () => 0;
   var y = x;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f() {}
+''');
+    }
   }
 
   test_setter_covariant() {
-    checkLibrary('class C { void set x(covariant int value); }');
+    var library = checkLibrary('class C { void set x(covariant int value); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(covariant int value);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  void set x(covariant int value);
+}
+''');
+    }
   }
 
   test_setter_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 void set x(value) {}''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+void set x(dynamic value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+void set x(dynamic value) {}
+''');
+    }
   }
 
   test_setter_external() {
-    checkLibrary('external void set x(int value);');
+    var library = checkLibrary('external void set x(int value);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+external void set x(int value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+external void set x(int value) {}
+''');
+    }
   }
 
   test_setter_inferred_type_nonStatic_implicit_param() {
-    checkLibrary('class C extends D { void set f(value) {} }'
+    var library = checkLibrary('class C extends D { void set f(value) {} }'
         ' abstract class D { void set f(int value); }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void set f(int value) {}
+}
+abstract class D {
+  void set f(int value);
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C extends D {
+  void set f(dynamic value) {}
+}
+abstract class D {
+  void set f(int value);
+}
+''');
+    }
   }
 
   test_setter_inferred_type_static_implicit_return() {
-    checkLibrary('class C { static set f(int value) {} }');
+    var library = checkLibrary('class C { static set f(int value) {} }');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static void set f(int value) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+  static dynamic set f(int value) {}
+}
+''');
+    }
   }
 
   test_setter_inferred_type_top_level_implicit_return() {
-    checkLibrary('set f(int value) {}');
+    var library = checkLibrary('set f(int value) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void set f(int value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic set f(int value) {}
+''');
+    }
   }
 
   test_setters() {
-    checkLibrary('void set x(int value) {} set y(value) {}');
+    var library = checkLibrary('void set x(int value) {} set y(value) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void set x(int value) {}
+void set y(dynamic value) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void set x(int value) {}
+dynamic set y(dynamic value) {}
+''');
+    }
   }
 
   test_syntheticFunctionType_genericClosure() {
@@ -4739,10 +12276,21 @@
       // and remove this hack.  See dartbug.com/25819
       return;
     }
-    checkLibrary('''
+    var library = checkLibrary('''
 final v = f() ? /*<T>*/(T t) => 0 : /*<T>*/(T t) => 1;
 bool f() => true;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_syntheticFunctionType_genericClosure_inGenericFunction() {
@@ -4755,70 +12303,217 @@
       // and remove this hack.  See dartbug.com/25819
       return;
     }
-    checkLibrary('''
+    var library = checkLibrary('''
 void f<T, U>(bool b) {
   final v = b ? /*<V>*/(T t, U u, V v) => 0 : /*<V>*/(T t, U u, V v) => 1;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>(bool b) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+''');
+    }
   }
 
   test_syntheticFunctionType_inGenericClass() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T, U> {
   var v = f() ? (T t, U u) => 0 : (T t, U u) => 1;
 }
 bool f() => false;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+  synthetic C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+  dynamic v;
+}
+bool f() {}
+''');
+    }
   }
 
   test_syntheticFunctionType_inGenericFunction() {
-    checkLibrary('''
+    var library = checkLibrary('''
 void f<T, U>(bool b) {
   var v = b ? (T t, U u) => 0 : (T t, U u) => 1;
 }
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>(bool b) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+void f<T, U>(bool b) {}
+''');
+    }
   }
 
   test_syntheticFunctionType_noArguments() {
-    checkLibrary('''
+    var library = checkLibrary('''
 final v = f() ? () => 0 : () => 1;
 bool f() => true;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final dynamic v;
+bool f() {}
+''');
+    }
   }
 
   test_syntheticFunctionType_withArguments() {
-    checkLibrary('''
+    var library = checkLibrary('''
 final v = f() ? (int x, String y) => 0 : (int x, String y) => 1;
 bool f() => true;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final dynamic v;
+bool f() {}
+''');
+    }
   }
 
   test_type_arguments_explicit_dynamic_dynamic() {
-    checkLibrary('Map<dynamic, dynamic> m;');
+    var library = checkLibrary('Map<dynamic, dynamic> m;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, dynamic> m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, dynamic> m;
+''');
+    }
   }
 
   test_type_arguments_explicit_dynamic_int() {
-    checkLibrary('Map<dynamic, int> m;');
+    var library = checkLibrary('Map<dynamic, int> m;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, int> m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, int> m;
+''');
+    }
   }
 
   test_type_arguments_explicit_String_dynamic() {
-    checkLibrary('Map<String, dynamic> m;');
+    var library = checkLibrary('Map<String, dynamic> m;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+Map<String, dynamic> m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+Map<String, dynamic> m;
+''');
+    }
   }
 
   test_type_arguments_explicit_String_int() {
-    checkLibrary('Map<String, int> m;');
+    var library = checkLibrary('Map<String, int> m;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+Map<String, int> m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+Map<String, int> m;
+''');
+    }
   }
 
   test_type_arguments_implicit() {
-    checkLibrary('Map m;');
+    var library = checkLibrary('Map m;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, dynamic> m;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+Map<dynamic, dynamic> m;
+''');
+    }
   }
 
   test_type_dynamic() {
-    checkLibrary('dynamic d;');
+    var library = checkLibrary('dynamic d;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic d;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic d;
+''');
+    }
   }
 
   test_type_invalid_topLevelVariableElement_asType() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class C<T extends V> {}
 typedef V F(V p);
@@ -4827,218 +12522,1025 @@
 int V = 0;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(dynamic p);
+class C<T extends dynamic> {
+}
+dynamic V2;
+int V;
+dynamic f(dynamic p) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(dynamic p);
+class C<T extends dynamic> {
+}
+dynamic V2;
+int V;
+dynamic f(dynamic p) {}
+''');
+    }
   }
 
   test_type_invalid_topLevelVariableElement_asTypeArgument() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 var V;
 static List<V> V2;
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic V;
+List<dynamic> V2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic V;
+List<dynamic> V2;
+''');
+    }
   }
 
   test_type_invalid_typeParameter_asPrefix() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class C<T> {
   m(T.K p) {}
 }
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  dynamic m(dynamic p) {}
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  dynamic m(dynamic p) {}
+}
+''');
+    }
   }
 
   test_type_reference_lib_to_lib() {
-    checkLibrary('class C {} enum E { v } typedef F(); C c; E e; F f;');
+    var library =
+        checkLibrary('class C {} enum E { v } typedef F(); C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_lib_to_part() {
     addSource('/a.dart', 'part of l; class C {} enum E { v } typedef F();');
-    checkLibrary('library l; part "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('library l; part "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+C c;
+E e;
+F f;
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+C c;
+E e;
+F f;
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+''');
+    }
   }
 
   test_type_reference_part_to_lib() {
     addSource('/a.dart', 'part of l; C c; E e; F f;');
-    checkLibrary(
+    var library = checkLibrary(
         'library l; part "a.dart"; class C {} enum E { v } typedef F();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+--------------------
+unit: a.dart
+
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+--------------------
+unit: a.dart
+
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_part_to_other_part() {
     addSource('/a.dart', 'part of l; class C {} enum E { v } typedef F();');
     addSource('/b.dart', 'part of l; C c; E e; F f;');
-    checkLibrary('library l; part "a.dart"; part "b.dart";');
+    var library = checkLibrary('library l; part "a.dart"; part "b.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+--------------------
+unit: b.dart
+
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+--------------------
+unit: b.dart
+
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_part_to_part() {
     addSource('/a.dart',
         'part of l; class C {} enum E { v } typedef F(); C c; E e; F f;');
-    checkLibrary('library l; part "a.dart";');
+    var library = checkLibrary('library l; part "a.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library l;
+part 'a.dart';
+--------------------
+unit: a.dart
+
+typedef dynamic F();
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+class C {
+}
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_class() {
-    checkLibrary('class C {} C c;');
+    var library = checkLibrary('class C {} C c;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+C c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C {
+}
+C c;
+''');
+    }
   }
 
   test_type_reference_to_class_with_type_arguments() {
-    checkLibrary('class C<T, U> {} C<int, String> c;');
+    var library = checkLibrary('class C<T, U> {} C<int, String> c;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+C<int, String> c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+C<int, String> c;
+''');
+    }
   }
 
   test_type_reference_to_class_with_type_arguments_implicit() {
-    checkLibrary('class C<T, U> {} C c;');
+    var library = checkLibrary('class C<T, U> {} C c;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+C<dynamic, dynamic> c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T, U> {
+}
+C<dynamic, dynamic> c;
+''');
+    }
   }
 
   test_type_reference_to_enum() {
-    checkLibrary('enum E { v } E e;');
+    var library = checkLibrary('enum E { v } E e;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+E e;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+enum E {
+  final int index;
+  static const List<E> values;
+  static const E v;
+}
+E e;
+''');
+    }
   }
 
   test_type_reference_to_import() {
     addLibrarySource('/a.dart', 'class C {} enum E { v }; typedef F();');
-    checkLibrary('import "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_export() {
     addLibrarySource('/a.dart', 'export "b.dart";');
     addLibrarySource('/b.dart', 'class C {} enum E { v } typedef F();');
-    checkLibrary('import "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_export_export() {
     addLibrarySource('/a.dart', 'export "b.dart";');
     addLibrarySource('/b.dart', 'export "c.dart";');
     addLibrarySource('/c.dart', 'class C {} enum E { v } typedef F();');
-    checkLibrary('import "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_export_export_in_subdirs() {
     addLibrarySource('/a/a.dart', 'export "b/b.dart";');
     addLibrarySource('/a/b/b.dart', 'export "../c/c.dart";');
     addLibrarySource('/a/c/c.dart', 'class C {} enum E { v } typedef F();');
-    checkLibrary('import "a/a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a/a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a/a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a/a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_export_in_subdirs() {
     addLibrarySource('/a/a.dart', 'export "b/b.dart";');
     addLibrarySource('/a/b/b.dart', 'class C {} enum E { v } typedef F();');
-    checkLibrary('import "a/a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a/a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a/a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a/a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_part() {
     addLibrarySource('/a.dart', 'library l; part "b.dart";');
     addSource('/b.dart', 'part of l; class C {} enum E { v } typedef F();');
-    checkLibrary('import "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_part2() {
     addLibrarySource('/a.dart', 'library l; part "p1.dart"; part "p2.dart";');
     addSource('/p1.dart', 'part of l; class C1 {}');
     addSource('/p2.dart', 'part of l; class C2 {}');
-    checkLibrary('import "a.dart"; C1 c1; C2 c2;');
+    var library = checkLibrary('import "a.dart"; C1 c1; C2 c2;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C1 c1;
+C2 c2;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C1 c1;
+C2 c2;
+''');
+    }
   }
 
   test_type_reference_to_import_part_in_subdir() {
     addLibrarySource('/a/b.dart', 'library l; part "c.dart";');
     addSource('/a/c.dart', 'part of l; class C {} enum E { v } typedef F();');
-    checkLibrary('import "a/b.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a/b.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a/b.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a/b.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_import_relative() {
     addLibrarySource('/a.dart', 'class C {} enum E { v } typedef F();');
-    checkLibrary('import "a.dart"; C c; E e; F f;');
+    var library = checkLibrary('import "a.dart"; C c; E e; F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+C c;
+E e;
+F f;
+''');
+    }
   }
 
   test_type_reference_to_typedef() {
-    checkLibrary('typedef F(); F f;');
+    var library = checkLibrary('typedef F(); F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+F f;
+''');
+    }
   }
 
   test_type_reference_to_typedef_with_type_arguments() {
-    checkLibrary('typedef U F<T, U>(T t); F<int, String> f;');
+    var library = checkLibrary('typedef U F<T, U>(T t); F<int, String> f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+F f;
+''');
+    }
   }
 
   test_type_reference_to_typedef_with_type_arguments_implicit() {
-    checkLibrary('typedef U F<T, U>(T t); F f;');
+    var library = checkLibrary('typedef U F<T, U>(T t); F f;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+F f;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+F f;
+''');
+    }
   }
 
   test_type_unresolved() {
-    checkLibrary('C c;', allowErrors: true);
+    var library = checkLibrary('C c;', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic c;
+''');
+    }
   }
 
   test_type_unresolved_prefixed() {
-    checkLibrary('import "dart:core" as core; core.C c;', allowErrors: true);
+    var library = checkLibrary('import "dart:core" as core; core.C c;',
+        allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:core' as core;
+dynamic c;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:core' as core;
+dynamic c;
+''');
+    }
   }
 
   test_typedef_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 typedef F();''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+typedef dynamic F();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+typedef dynamic F();
+''');
+    }
   }
 
   test_typedef_parameter_parameters() {
-    checkLibrary('typedef F(g(x, y));');
+    var library = checkLibrary('typedef F(g(x, y));');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F((dynamic, dynamic) → dynamic g);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F((dynamic, dynamic) → dynamic g);
+''');
+    }
   }
 
   test_typedef_parameter_parameters_in_generic_class() {
-    checkLibrary('typedef F<A, B>(A g(B x));');
+    var library = checkLibrary('typedef F<A, B>(A g(B x));');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<A, B>((B) → A g);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<A, B>((B) → A g);
+''');
+    }
   }
 
   test_typedef_parameter_return_type() {
-    checkLibrary('typedef F(int g());');
+    var library = checkLibrary('typedef F(int g());');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(() → int g);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(() → int g);
+''');
+    }
   }
 
   test_typedef_parameter_type() {
-    checkLibrary('typedef F(int i);');
+    var library = checkLibrary('typedef F(int i);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int i);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(int i);
+''');
+    }
   }
 
   test_typedef_parameter_type_generic() {
-    checkLibrary('typedef F<T>(T t);');
+    var library = checkLibrary('typedef F<T>(T t);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T>(T t);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F<T>(T t);
+''');
+    }
   }
 
   test_typedef_parameters() {
-    checkLibrary('typedef F(x, y);');
+    var library = checkLibrary('typedef F(x, y);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(dynamic x, dynamic y);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F(dynamic x, dynamic y);
+''');
+    }
   }
 
   test_typedef_return_type() {
-    checkLibrary('typedef int F();');
+    var library = checkLibrary('typedef int F();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef int F();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef int F();
+''');
+    }
   }
 
   test_typedef_return_type_generic() {
-    checkLibrary('typedef T F<T>();');
+    var library = checkLibrary('typedef T F<T>();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef T F<T>();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef T F<T>();
+''');
+    }
   }
 
   test_typedef_return_type_implicit() {
-    checkLibrary('typedef F();');
+    var library = checkLibrary('typedef F();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef dynamic F();
+''');
+    }
   }
 
   test_typedef_return_type_void() {
-    checkLibrary('typedef void F();');
+    var library = checkLibrary('typedef void F();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef void F();
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef void F();
+''');
+    }
   }
 
   test_typedef_type_parameters() {
-    checkLibrary('typedef U F<T, U>(T t);');
+    var library = checkLibrary('typedef U F<T, U>(T t);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T, U>(T t);
+''');
+    }
   }
 
   test_typedef_type_parameters_bound() {
-    checkLibrary('typedef U F<T extends Object, U extends D>(T t); class D {}');
+    var library = checkLibrary(
+        'typedef U F<T extends Object, U extends D>(T t); class D {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends Object, U extends D>(T t);
+class D {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends Object, U extends D>(T t);
+class D {
+}
+''');
+    }
   }
 
   test_typedef_type_parameters_f_bound_complex() {
-    checkLibrary('typedef U F<T extends List<U>, U>(T t);');
+    var library = checkLibrary('typedef U F<T extends List<U>, U>(T t);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends List<U>, U>(T t);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends List<U>, U>(T t);
+''');
+    }
   }
 
   test_typedef_type_parameters_f_bound_simple() {
-    checkLibrary('typedef U F<T extends U, U>(T t);');
+    var library = checkLibrary('typedef U F<T extends U, U>(T t);');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends U, U>(T t);
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+typedef U F<T extends U, U>(T t);
+''');
+    }
   }
 
   test_typedefs() {
-    checkLibrary('f() {} g() {}');
+    var library = checkLibrary('f() {} g() {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+dynamic g() {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic f() {}
+dynamic g() {}
+''');
+    }
   }
 
   @failingTest
   test_unresolved_annotation_instanceCreation_argument_super() {
     // TODO(scheglov) fix https://github.com/dart-lang/sdk/issues/28553
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class A {
   const A(_);
@@ -5048,10 +13550,35 @@
 class C {}
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  A(_);
+}
+
+class C {
+  synthetic C();
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  A(_);
+}
+
+class C {
+  synthetic C();
+}
+''');
+    }
   }
 
   test_unresolved_annotation_instanceCreation_argument_this() {
-    checkLibrary(
+    var library = checkLibrary(
         '''
 class A {
   const A(_);
@@ -5061,59 +13588,294 @@
 class C {}
 ''',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(dynamic _);
+}
+@A(this)
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class A {
+  const A(dynamic _);
+}
+@A(this)
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_namedConstructorCall_noClass() {
-    checkLibrary('@foo.bar() class C {}', allowErrors: true);
+    var library = checkLibrary('@foo.bar() class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo.bar()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo.bar()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_namedConstructorCall_noConstructor() {
-    checkLibrary('@String.foo() class C {}', allowErrors: true);
+    var library = checkLibrary('@String.foo() class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@String.foo()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@String.foo()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedIdentifier_badPrefix() {
-    checkLibrary('@foo.bar class C {}', allowErrors: true);
+    var library = checkLibrary('@foo.bar class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo.bar
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo.bar
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedIdentifier_noDeclaration() {
-    checkLibrary('import "dart:async" as foo; @foo.bar class C {}',
+    var library = checkLibrary(
+        'import "dart:async" as foo; @foo.bar class C {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() {
-    checkLibrary('@foo.bar.baz() class C {}', allowErrors: true);
+    var library = checkLibrary('@foo.bar.baz() class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo.bar.baz()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo.bar.baz()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noClass() {
-    checkLibrary('import "dart:async" as foo; @foo.bar.baz() class C {}',
+    var library = checkLibrary(
+        'import "dart:async" as foo; @foo.bar.baz() class C {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar.baz()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar.baz()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() {
-    checkLibrary('import "dart:async" as foo; @foo.Future.bar() class C {}',
+    var library = checkLibrary(
+        'import "dart:async" as foo; @foo.Future.bar() class C {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.Future.bar()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.Future.bar()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() {
-    checkLibrary('@foo.bar() class C {}', allowErrors: true);
+    var library = checkLibrary('@foo.bar() class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo.bar()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo.bar()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() {
-    checkLibrary('import "dart:async" as foo; @foo.bar() class C {}',
+    var library = checkLibrary(
+        'import "dart:async" as foo; @foo.bar() class C {}',
         allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'dart:async' as foo;
+@foo.bar()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_simpleIdentifier() {
-    checkLibrary('@foo class C {}', allowErrors: true);
+    var library = checkLibrary('@foo class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_annotation_unnamedConstructorCall_noClass() {
-    checkLibrary('@foo() class C {}', allowErrors: true);
+    var library = checkLibrary('@foo() class C {}', allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+@foo()
+class C {
+}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+@foo()
+class C {
+}
+''');
+    }
   }
 
   test_unresolved_export() {
     allowMissingFiles = true;
-    checkLibrary("export 'foo.dart';", allowErrors: true);
+    var library = checkLibrary("export 'foo.dart';", allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+export 'foo.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+export 'foo.dart';
+''');
+    }
   }
 
   test_unresolved_import() {
@@ -5124,101 +13886,452 @@
     expect(importedLibrary.loadLibraryFunction, isNotNull);
     expect(importedLibrary.publicNamespace, isNotNull);
     expect(importedLibrary.exportNamespace, isNotNull);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'foo.dart';
+''');
+    }
   }
 
   test_unresolved_part() {
     allowMissingFiles = true;
-    checkLibrary("part 'foo.dart';", allowErrors: true);
+    var library = checkLibrary("part 'foo.dart';", allowErrors: true);
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+part 'foo.dart';
+--------------------
+unit: foo.dart
+
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+part 'foo.dart';
+--------------------
+unit: foo.dart
+
+''');
+    }
   }
 
   test_unused_type_parameter() {
-    checkLibrary('''
+    var library = checkLibrary('''
 class C<T> {
   void f() {}
 }
 C<int> c;
 var v = c.f;
 ''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  void f() {}
+}
+C<int> c;
+() → void v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+class C<T> {
+  void f() {}
+}
+C<int> c;
+dynamic v;
+''');
+    }
   }
 
   test_variable_const() {
-    checkLibrary('const int i = 0;');
+    var library = checkLibrary('const int i = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int i = 0;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const int i = 0;
+''');
+    }
   }
 
   test_variable_documented() {
-    checkLibrary('''
+    var library = checkLibrary('''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
 var x;''');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+dynamic x;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+/**
+ * Docs
+ */
+dynamic x;
+''');
+    }
   }
 
   test_variable_final() {
-    checkLibrary('final int x = 0;');
+    var library = checkLibrary('final int x = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+final int x;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final int x;
+''');
+    }
   }
 
   test_variable_final_top_level_untyped() {
-    checkLibrary('final v = 0;');
+    var library = checkLibrary('final v = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+final int v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final dynamic v;
+''');
+    }
   }
 
   test_variable_getterInLib_setterInPart() {
     addSource('/a.dart', 'part of my.lib; void set x(int _) {}');
-    checkLibrary('library my.lib; part "a.dart"; int get x => 42;');
+    var library =
+        checkLibrary('library my.lib; part "a.dart"; int get x => 42;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+int get x {}
+--------------------
+unit: a.dart
+
+void set x(int _) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+int get x {}
+--------------------
+unit: a.dart
+
+void set x(int _) {}
+''');
+    }
   }
 
   test_variable_getterInPart_setterInLib() {
     addSource('/a.dart', 'part of my.lib; int get x => 42;');
-    checkLibrary('library my.lib; part "a.dart"; void set x(int _) {}');
+    var library =
+        checkLibrary('library my.lib; part "a.dart"; void set x(int _) {}');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+void set x(int _) {}
+--------------------
+unit: a.dart
+
+int get x {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+void set x(int _) {}
+--------------------
+unit: a.dart
+
+int get x {}
+''');
+    }
   }
 
   test_variable_getterInPart_setterInPart() {
     addSource('/a.dart', 'part of my.lib; int get x => 42;');
     addSource('/b.dart', 'part of my.lib; void set x(int _) {}');
-    checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    var library = checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+int get x {}
+--------------------
+unit: b.dart
+
+void set x(int _) {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+int get x {}
+--------------------
+unit: b.dart
+
+void set x(int _) {}
+''');
+    }
   }
 
   test_variable_implicit_type() {
-    checkLibrary('var x;');
+    var library = checkLibrary('var x;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+dynamic x;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic x;
+''');
+    }
   }
 
   test_variable_inferred_type_implicit_initialized() {
-    checkLibrary('var v = 0;');
+    var library = checkLibrary('var v = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+int v;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+dynamic v;
+''');
+    }
   }
 
   test_variable_propagatedType_const_noDep() {
-    checkLibrary('const i = 0;');
+    var library = checkLibrary('const i = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+const int i = 0;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+const dynamic i = 0;
+''');
+    }
   }
 
   test_variable_propagatedType_final_dep_inLib() {
     addLibrarySource('/a.dart', 'final a = 1;');
-    checkLibrary('import "a.dart"; final b = a / 2;');
+    var library = checkLibrary('import "a.dart"; final b = a / 2;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+final num b;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'a.dart';
+final dynamic b;
+''');
+    }
   }
 
   test_variable_propagatedType_final_dep_inPart() {
     addSource('/a.dart', 'part of lib; final a = 1;');
-    checkLibrary('library lib; part "a.dart"; final b = a / 2;');
+    var library = checkLibrary('library lib; part "a.dart"; final b = a / 2;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+final num b;
+--------------------
+unit: a.dart
+
+final int a;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library lib;
+part 'a.dart';
+final dynamic b;
+--------------------
+unit: a.dart
+
+final dynamic a;
+''');
+    }
   }
 
   test_variable_propagatedType_final_noDep() {
-    checkLibrary('final i = 0;');
+    var library = checkLibrary('final i = 0;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+final int i;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+final dynamic i;
+''');
+    }
   }
 
   test_variable_propagatedType_implicit_dep() {
     // The propagated type is defined in a library that is not imported.
     addLibrarySource('/a.dart', 'class C {}');
     addLibrarySource('/b.dart', 'import "a.dart"; C f() => null;');
-    checkLibrary('import "b.dart"; final x = f();');
+    var library = checkLibrary('import "b.dart"; final x = f();');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+import 'b.dart';
+final C x;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+import 'b.dart';
+final dynamic x;
+''');
+    }
   }
 
   test_variable_setterInPart_getterInPart() {
     addSource('/a.dart', 'part of my.lib; void set x(int _) {}');
     addSource('/b.dart', 'part of my.lib; int get x => 42;');
-    checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    var library = checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+void set x(int _) {}
+--------------------
+unit: b.dart
+
+int get x {}
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+library my.lib;
+part 'a.dart';
+part 'b.dart';
+--------------------
+unit: a.dart
+
+void set x(int _) {}
+--------------------
+unit: b.dart
+
+int get x {}
+''');
+    }
   }
 
   test_variables() {
-    checkLibrary('int i; int j;');
+    var library = checkLibrary('int i; int j;');
+    if (isStrongMode) {
+      checkElementText(
+          library,
+          r'''
+int i;
+int j;
+''');
+    } else {
+      checkElementText(
+          library,
+          r'''
+int i;
+int j;
+''');
+    }
   }
 
   /**
diff --git a/pkg/analyzer_cli/analyzer_cli.iml b/pkg/analyzer_cli/analyzer_cli.iml
index 4a27243..8eaae91 100644
--- a/pkg/analyzer_cli/analyzer_cli.iml
+++ b/pkg/analyzer_cli/analyzer_cli.iml
@@ -7,7 +7,18 @@
       <excludeFolder url="file://$MODULE_DIR$/bin/packages" />
       <excludeFolder url="file://$MODULE_DIR$/build" />
       <excludeFolder url="file://$MODULE_DIR$/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/bazel/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/bazel/proj/lib/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/bazel/proj/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/data/embedder_client/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/errors_reported_once/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/lib/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/somepkgs/flutter/lib/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/somepkgs/flutter/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/somepkgs/meta/lib/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/somepkgs/meta/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/data/flutter_analysis_options/somepkgs/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/data/library_and_parts/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/data/linter_project/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/data/no_lints_project/packages" />
diff --git a/pkg/front_end/front_end.iml b/pkg/front_end/front_end.iml
index 8b2c80f..7f7c017 100644
--- a/pkg/front_end/front_end.iml
+++ b/pkg/front_end/front_end.iml
@@ -2,7 +2,20 @@
 <module type="WEB_MODULE" version="4">
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
-    <content url="file://$MODULE_DIR$" />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.pub" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+      <excludeFolder url="file://$MODULE_DIR$/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/fasta/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/fasta/parser/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/fasta/rasta/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/fasta/scanner/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/src/base/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/src/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/tool/fasta/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/tool/packages" />
+    </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Dart SDK" level="application" />
diff --git a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
index 5a74165..3933e7c 100644
--- a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
@@ -13,7 +13,9 @@
   DynamicTypeBuilder(this.type, LibraryBuilder compilationUnit, int charOffset)
       : super(null, 0, "dynamic", compilationUnit, charOffset);
 
-  R buildType(List<T> arguments) => type;
+  R buildType(LibraryBuilder library, List<T> arguments) => type;
 
-  R buildTypesWithBuiltArguments(List<R> arguments) => type;
+  R buildTypesWithBuiltArguments(LibraryBuilder library, List<R> arguments) {
+    return type;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 4a91321..8f0065e 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -4,7 +4,8 @@
 
 library fasta.type_builder;
 
-import 'builder.dart' show Builder, TypeDeclarationBuilder, TypeVariableBuilder;
+import 'builder.dart'
+    show Builder, LibraryBuilder, TypeDeclarationBuilder, TypeVariableBuilder;
 
 import 'scope.dart' show Scope;
 
@@ -27,5 +28,5 @@
 
   TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) => this;
 
-  build();
+  build(LibraryBuilder library);
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
index e0cc771..0053c44 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
@@ -5,7 +5,7 @@
 library fasta.type_declaration_builder;
 
 import 'builder.dart'
-    show Builder, MetadataBuilder, ModifierBuilder, TypeBuilder;
+    show Builder, LibraryBuilder, MetadataBuilder, ModifierBuilder, TypeBuilder;
 
 import '../util/relativize.dart' show relativizeUri;
 
@@ -32,8 +32,10 @@
 
   bool get isTypeDeclaration => true;
 
-  R buildType(List<T> arguments);
+  bool get isTypeVariable => false;
+
+  R buildType(LibraryBuilder library, List<T> arguments);
 
   /// [arguments] have already been built.
-  R buildTypesWithBuiltArguments(List<R> arguments);
+  R buildTypesWithBuiltArguments(LibraryBuilder library, List<R> arguments);
 }
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 ee94d2c..a7b5df7 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
@@ -14,6 +14,8 @@
       String name, this.bound, LibraryBuilder compilationUnit, int charOffset)
       : super(null, null, name, compilationUnit, charOffset);
 
+  bool get isTypeVariable => true;
+
   String get debugName => "TypeVariableBuilder";
 
   StringBuffer printOn(StringBuffer buffer) {
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 e906a19..532feca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -175,7 +175,7 @@
     } else if (node is BuilderAccessor) {
       return node.buildSimpleRead();
     } else if (node is TypeVariableBuilder) {
-      TypeParameterType type = node.buildTypesWithBuiltArguments(null);
+      TypeParameterType type = node.buildTypesWithBuiltArguments(library, null);
       if (!isInstanceContext && type.parameter.parent is Class) {
         return buildCompileTimeError(
             "Type variables can only be used in instance methods.");
@@ -183,9 +183,9 @@
         return new TypeLiteral(type);
       }
     } else if (node is TypeDeclarationBuilder) {
-      return new TypeLiteral(node.buildTypesWithBuiltArguments(null));
+      return new TypeLiteral(node.buildTypesWithBuiltArguments(library, null));
     } else if (node is KernelTypeBuilder) {
-      return new TypeLiteral(node.build());
+      return new TypeLiteral(node.build(library));
     } else if (node is Expression) {
       return node;
     } else if (node is PrefixBuilder) {
@@ -949,8 +949,8 @@
     Expression value = popForValue();
     var accessor = pop();
     if (accessor is TypeDeclarationBuilder) {
-      push(wrapInvalid(
-          new TypeLiteral(accessor.buildTypesWithBuiltArguments(null))));
+      push(wrapInvalid(new TypeLiteral(
+          accessor.buildTypesWithBuiltArguments(library, null))));
     } else if (accessor is! BuilderAccessor) {
       push(buildCompileTimeError("Can't assign to this.", token.charOffset));
     } else {
@@ -1148,7 +1148,7 @@
     if (identical(name, "dynamic")) return const DynamicType();
     Builder builder = scope.lookup(name, charOffset, uri);
     if (builder is TypeDeclarationBuilder) {
-      return builder.buildTypesWithBuiltArguments(arguments);
+      return builder.buildTypesWithBuiltArguments(library, arguments);
     }
     if (builder == null) {
       warning("Type not found: '$name'.", charOffset);
@@ -1202,11 +1202,11 @@
       warning("'${name.name}' isn't a type.", beginToken.charOffset);
       push(const DynamicType());
     } else if (name is TypeVariableBuilder) {
-      push(name.buildTypesWithBuiltArguments(arguments));
+      push(name.buildTypesWithBuiltArguments(library, arguments));
     } else if (name is TypeDeclarationBuilder) {
-      push(name.buildTypesWithBuiltArguments(arguments));
+      push(name.buildTypesWithBuiltArguments(library, arguments));
     } else if (name is TypeBuilder) {
-      push(name.build());
+      push(name.build(library));
     } else {
       push(toKernelType(name, arguments, beginToken.charOffset));
     }
@@ -1293,7 +1293,7 @@
           thisKeyword = null;
         }
       } else if (thisKeyword == null) {
-        variable = builder.build();
+        variable = builder.build(library);
         variable.initializer = name.initializer;
       } else if (builder.isField && builder.parent == classBuilder) {
         FieldBuilder field = builder;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index a6a7025..185e1d5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -62,7 +62,8 @@
   Class get target => cls;
 
   /// [arguments] have already been built.
-  InterfaceType buildTypesWithBuiltArguments(List<DartType> arguments) {
+  InterfaceType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
     return arguments == null
         ? cls.rawType
         : new InterfaceType(
@@ -72,27 +73,29 @@
             computeDefaultTypeArguments(cls.typeParameters, arguments));
   }
 
-  InterfaceType buildType(List<KernelTypeBuilder> arguments) {
+  InterfaceType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     List<DartType> typeArguments;
     if (arguments != null) {
       typeArguments = <DartType>[];
       for (KernelTypeBuilder builder in arguments) {
-        DartType type = builder.build();
+        DartType type = builder.build(library);
         if (type == null) {
           internalError("Bad type: ${builder.runtimeType}");
         }
         typeArguments.add(type);
       }
     }
-    return buildTypesWithBuiltArguments(typeArguments);
+    return buildTypesWithBuiltArguments(library, typeArguments);
   }
 
-  Supertype buildSupertype(List<KernelTypeBuilder> arguments) {
+  Supertype buildSupertype(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     List<DartType> typeArguments;
     if (arguments != null) {
       typeArguments = <DartType>[];
       for (KernelTypeBuilder builder in arguments) {
-        DartType type = builder.build();
+        DartType type = builder.build(library);
         if (type == null) {
           internalError("Bad type: ${builder.runtimeType}");
         }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 1a36877..4261723 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -174,7 +174,8 @@
 
   KernelTypeBuilder get mixedInType => null;
 
-  InterfaceType buildType(List<KernelTypeBuilder> arguments) {
+  InterfaceType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     return cls.rawType;
   }
 
@@ -183,10 +184,10 @@
       libraryBuilder.addCompileTimeError(
           -1, "An enum declaration can't be empty.");
     }
-    toStringMap.keyType = intType.build();
-    toStringMap.valueType = stringType.build();
+    toStringMap.keyType = intType.build(libraryBuilder);
+    toStringMap.valueType = stringType.build(libraryBuilder);
     KernelFieldBuilder indexFieldBuilder = members["index"];
-    Field indexField = indexFieldBuilder.build(libraryBuilder.library);
+    Field indexField = indexFieldBuilder.build(libraryBuilder);
     KernelProcedureBuilder toStringBuilder = members["toString"];
     toStringBuilder.body = new ReturnStatement(new MethodInvocation(
         toStringMap,
@@ -197,14 +198,14 @@
     List<Expression> values = <Expression>[];
     for (String name in constants) {
       KernelFieldBuilder builder = members[name];
-      values.add(new StaticGet(builder.build(libraryBuilder.library)));
+      values.add(new StaticGet(builder.build(libraryBuilder)));
     }
     KernelFieldBuilder valuesBuilder = members["values"];
-    valuesBuilder.build(libraryBuilder.library);
+    valuesBuilder.build(libraryBuilder);
     valuesBuilder.initializer =
         new ListLiteral(values, typeArgument: cls.rawType, isConst: true);
     KernelConstructorBuilder constructorBuilder = members[""];
-    Constructor constructor = constructorBuilder.build(libraryBuilder.library);
+    Constructor constructor = constructorBuilder.build(libraryBuilder);
     constructor.initializers.insert(
         0,
         new FieldInitializer(indexField,
@@ -213,7 +214,7 @@
     int index = 0;
     for (String constant in constants) {
       KernelFieldBuilder field = members[constant];
-      field.build(libraryBuilder.library);
+      field.build(libraryBuilder);
       Arguments arguments =
           new Arguments(<Expression>[new IntLiteral(index++)]);
       field.initializer =
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index 2f0cfd2..8cb5a8d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -4,10 +4,15 @@
 
 library fasta.kernel_field_builder;
 
-import 'package:kernel/ast.dart' show Expression, Field, Library, Name;
+import 'package:kernel/ast.dart' show Expression, Field, Name;
 
 import 'kernel_builder.dart'
-    show Builder, FieldBuilder, KernelTypeBuilder, MetadataBuilder;
+    show
+        Builder,
+        FieldBuilder,
+        KernelTypeBuilder,
+        LibraryBuilder,
+        MetadataBuilder;
 
 class KernelFieldBuilder extends FieldBuilder<Expression> {
   final Field field;
@@ -24,10 +29,10 @@
     field.initializer = value..parent = field;
   }
 
-  Field build(Library library) {
-    field.name ??= new Name(name, library);
+  Field build(LibraryBuilder library) {
+    field.name ??= new Name(name, library.target);
     if (type != null) {
-      field.type = type.build();
+      field.type = type.build(library);
     }
     bool isInstanceMember = !isStatic && !isTopLevel;
     return field
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index aa671e9..09bd875 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -11,6 +11,7 @@
         FormalParameterBuilder,
         KernelLibraryBuilder,
         KernelTypeBuilder,
+        LibraryBuilder,
         MetadataBuilder;
 
 class KernelFormalParameterBuilder
@@ -28,9 +29,9 @@
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
 
-  VariableDeclaration build() {
+  VariableDeclaration build(LibraryBuilder library) {
     return declaration ??= new VariableDeclaration(name,
-        type: type?.build() ?? const DynamicType(),
+        type: type?.build(library) ?? const DynamicType(),
         isFinal: isFinal,
         isConst: isConst);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
index 63e2010..70e0205 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
@@ -46,7 +46,7 @@
       : super(metadata, returnType, name, typeVariables, formals, parent,
             charOffset);
 
-  DartType buildThisType() {
+  DartType buildThisType(LibraryBuilder library) {
     if (thisType != null) {
       if (thisType == const InvalidType()) {
         thisType = const DynamicType();
@@ -57,13 +57,14 @@
       return thisType;
     }
     thisType = const InvalidType();
-    DartType returnType = this.returnType?.build() ?? const DynamicType();
+    DartType returnType =
+        this.returnType?.build(library) ?? const DynamicType();
     List<DartType> positionalParameters = <DartType>[];
     List<NamedType> namedParameters;
     int requiredParameterCount = 0;
     if (formals != null) {
       for (KernelFormalParameterBuilder formal in formals) {
-        DartType type = formal.type?.build() ?? const DynamicType();
+        DartType type = formal.type?.build(library) ?? const DynamicType();
         if (formal.isPositional) {
           positionalParameters.add(type);
           if (formal.isRequired) requiredParameterCount++;
@@ -90,8 +91,9 @@
   }
 
   /// [arguments] have already been built.
-  DartType buildTypesWithBuiltArguments(List<DartType> arguments) {
-    var thisType = buildThisType();
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    var thisType = buildThisType(library);
     if (thisType is DynamicType) return thisType;
     FunctionType result = thisType;
     if (result.typeParameters.isEmpty && arguments == null) return result;
@@ -103,8 +105,9 @@
     return substitute(result.withoutTypeParameters, substitution);
   }
 
-  DartType buildType(List<KernelTypeBuilder> arguments) {
-    var thisType = buildThisType();
+  DartType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+    var thisType = buildThisType(library);
     if (thisType is DynamicType) return thisType;
     FunctionType result = thisType;
     if (result.typeParameters.isEmpty && arguments == null) return result;
@@ -112,9 +115,9 @@
     List<DartType> builtArguments = <DartType>[];
     if (arguments != null) {
       for (int i = 0; i < arguments.length; i++) {
-        builtArguments.add(arguments[i].build());
+        builtArguments.add(arguments[i].build(library));
       }
     }
-    return buildTypesWithBuiltArguments(builtArguments);
+    return buildTypesWithBuiltArguments(library, builtArguments);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
index da0f433..b2c215b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
@@ -8,21 +8,24 @@
 
 import '../messages.dart' show warning;
 
-import 'kernel_builder.dart' show InvalidTypeBuilder, KernelTypeBuilder;
+import 'kernel_builder.dart'
+    show InvalidTypeBuilder, KernelTypeBuilder, LibraryBuilder;
 
 class KernelInvalidTypeBuilder
     extends InvalidTypeBuilder<KernelTypeBuilder, DartType> {
   KernelInvalidTypeBuilder(String name, int charOffset, Uri fileUri)
       : super(name, null, charOffset, fileUri);
 
-  DartType buildType(List<KernelTypeBuilder> arguments) {
+  DartType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     // TODO(ahe): Implement error handling.
     warning(fileUri, charOffset, "No type for: '$name'.");
     return const DynamicType();
   }
 
   /// [Arguments] have already been built.
-  DartType buildTypesWithBuiltArguments(List<DartType> arguments) {
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
     // TODO(ahe): Implement error handling.
     warning(fileUri, charOffset, "No type for: '$name'.");
     return const DynamicType();
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index fae44fc..c2d6b22 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -68,6 +68,8 @@
       : library = new Library(uri, fileUri: relativizeUri(fileUri)),
         super(loader, fileUri);
 
+  Library get target => library;
+
   Uri get uri => library.importUri;
 
   KernelTypeBuilder addNamedType(
@@ -280,9 +282,9 @@
       Class cls = builder.build(this);
       library.addClass(cls);
     } else if (builder is KernelFieldBuilder) {
-      library.addMember(builder.build(library)..isStatic = true);
+      library.addMember(builder.build(this)..isStatic = true);
     } else if (builder is KernelProcedureBuilder) {
-      library.addMember(builder.build(library)..isStatic = true);
+      library.addMember(builder.build(this)..isStatic = true);
     } else if (builder is FunctionTypeAliasBuilder) {
       // Kernel discard typedefs and use their corresponding function types
       // directly.
@@ -394,7 +396,7 @@
   int finishTypeVariables(ClassBuilder object) {
     int count = boundlessTypeVariables.length;
     for (KernelTypeVariableBuilder builder in boundlessTypeVariables) {
-      builder.finish(object);
+      builder.finish(this, object);
     }
     boundlessTypeVariables.clear();
     return count;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
index c79e55f..8b9d903 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
@@ -16,6 +16,7 @@
         KernelNamedTypeBuilder,
         KernelTypeBuilder,
         KernelTypeVariableBuilder,
+        LibraryBuilder,
         MixinApplicationBuilder,
         TypeBuilder,
         TypeVariableBuilder;
@@ -45,15 +46,17 @@
         relativeFileUri = relativizeUri(fileUri),
         super(supertype, mixins, charOffset, fileUri);
 
-  InterfaceType build() => buildSupertype().asInterfaceType;
+  InterfaceType build(LibraryBuilder library) {
+    return buildSupertype(library)?.asInterfaceType;
+  }
 
-  Supertype buildSupertype() {
+  Supertype buildSupertype(LibraryBuilder library) {
     if (builtType != null) return builtType;
     KernelTypeBuilder s = this.supertype;
     for (KernelTypeBuilder builder in mixins) {
       s = applyMixin(s, builder);
     }
-    builtType = s.buildSupertype();
+    builtType = s.buildSupertype(library);
     return builtType;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
index f4f88ac..7dd7fb3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
@@ -14,6 +14,7 @@
         KernelClassBuilder,
         KernelInvalidTypeBuilder,
         KernelTypeBuilder,
+        LibraryBuilder,
         NamedTypeBuilder,
         TypeBuilder,
         TypeVariableBuilder;
@@ -37,27 +38,35 @@
     return const DynamicType();
   }
 
-  Supertype handleMissingSuperType() {
+  Supertype handleMissingSupertype() {
     warning(fileUri, charOffset, "No type for: '$name'.");
     return null;
   }
 
-  DartType build() {
+  Supertype handleInvalidSupertype(LibraryBuilder library) {
+    String message = builder.isTypeVariable
+        ? "The type variable '$name' can't be used as supertype."
+        : "The type '$name' can't be used as supertype.";
+    library.addCompileTimeError(charOffset, message, fileUri);
+    return null;
+  }
+
+  DartType build(LibraryBuilder library) {
     if (name == "void") return const VoidType();
     if (name == "dynamic") return const DynamicType();
     if (builder == null) return handleMissingType();
-    return builder.buildType(arguments);
+    return builder.buildType(library, arguments);
   }
 
-  Supertype buildSupertype() {
+  Supertype buildSupertype(LibraryBuilder library) {
     if (name == "void") return null;
     if (name == "dynamic") return null;
-    if (builder == null) return handleMissingSuperType();
+    if (builder == null) return handleMissingSupertype();
     if (builder is KernelClassBuilder) {
       KernelClassBuilder builder = this.builder;
-      return builder.buildSupertype(arguments);
+      return builder.buildSupertype(library, arguments);
     } else {
-      return handleMissingSuperType();
+      return handleInvalidSupertype(library);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index 08b6f47..cd8ee41 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -16,7 +16,6 @@
         Expression,
         FunctionNode,
         Initializer,
-        Library,
         LocalInitializer,
         Member,
         Name,
@@ -52,6 +51,7 @@
         KernelLibraryBuilder,
         KernelTypeBuilder,
         KernelTypeVariableBuilder,
+        LibraryBuilder,
         MetadataBuilder,
         ProcedureBuilder,
         TypeVariableBuilder,
@@ -93,7 +93,7 @@
 
   bool get isNative => nativeMethodName != null;
 
-  FunctionNode buildFunction() {
+  FunctionNode buildFunction(LibraryBuilder library) {
     assert(function == null);
     FunctionNode result = new FunctionNode(body, asyncMarker: asyncModifier);
     if (typeVariables != null) {
@@ -104,7 +104,7 @@
     }
     if (formals != null) {
       for (KernelFormalParameterBuilder formal in formals) {
-        VariableDeclaration parameter = formal.build();
+        VariableDeclaration parameter = formal.build(library);
         if (formal.isNamed) {
           result.namedParameters.add(parameter);
         } else {
@@ -117,7 +117,7 @@
       }
     }
     if (returnType != null) {
-      result.returnType = returnType.build();
+      result.returnType = returnType.build(library);
     }
     if (!isConstructor && !isInstanceMember && parent is ClassBuilder) {
       List<TypeParameter> typeParameters = parent.target.typeParameters;
@@ -154,7 +154,7 @@
     return function = result;
   }
 
-  Member build(Library library);
+  Member build(LibraryBuilder library);
 
   void becomeNative(Loader loader) {
     target.isExternal = true;
@@ -220,16 +220,16 @@
     }
   }
 
-  Procedure build(Library library) {
+  Procedure build(LibraryBuilder library) {
     // TODO(ahe): I think we may call this twice on parts. Investigate.
     if (procedure.name == null) {
-      procedure.function = buildFunction();
+      procedure.function = buildFunction(library);
       procedure.function.parent = procedure;
       procedure.isAbstract = isAbstract;
       procedure.isStatic = isStatic;
       procedure.isExternal = isExternal;
       procedure.isConst = isConst;
-      procedure.name = new Name(name, library);
+      procedure.name = new Name(name, library.target);
     }
     return procedure;
   }
@@ -268,20 +268,20 @@
 
   ProcedureKind get kind => null;
 
-  Constructor build(Library library) {
+  Constructor build(LibraryBuilder library) {
     if (constructor.name == null) {
-      constructor.function = buildFunction();
+      constructor.function = buildFunction(library);
       constructor.function.parent = constructor;
       constructor.isConst = isConst;
       constructor.isExternal = isExternal;
-      constructor.name = new Name(name, library);
+      constructor.name = new Name(name, library.target);
     }
     return constructor;
   }
 
-  FunctionNode buildFunction() {
+  FunctionNode buildFunction(LibraryBuilder library) {
     // TODO(ahe): Should complain if another type is explicitly set.
-    return super.buildFunction()..returnType = const VoidType();
+    return super.buildFunction(library)..returnType = const VoidType();
   }
 
   Constructor get target => constructor;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 2ed1a8c..93ef761 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -132,9 +132,6 @@
       Builder builder = type.builder;
       if (builder is ClassBuilder) {
         set.add(builder);
-      } else if (builder is! InvalidTypeBuilder &&
-          builder is! DynamicTypeBuilder) {
-        internalError("Unhandled: ${builder.runtimeType}");
       }
     }
 
@@ -247,7 +244,7 @@
       loader.buildProgram();
       loader.checkSemantics();
       List<SourceClassBuilder> sourceClasses = collectAllSourceClasses();
-      installDefaultSupertypes(sourceClasses);
+      installDefaultSupertypes();
       installDefaultConstructors(sourceClasses);
       loader.resolveConstructors();
       loader.finishTypeVariables(objectClassBuilder);
@@ -353,17 +350,21 @@
     return null;
   }
 
-  void installDefaultSupertypes(List<SourceClassBuilder> builders) {
+  void installDefaultSupertypes() {
     Class objectClass = this.objectClass;
-    for (SourceClassBuilder builder in builders) {
-      Class cls = builder.target;
-      if (cls != objectClass) {
-        cls.supertype ??= objectClass.asRawSupertype;
-      }
-      if (builder.isMixinApplication) {
-        cls.mixedInType = builder.mixedInType.buildSupertype();
-      }
-    }
+    loader.builders.forEach((Uri uri, LibraryBuilder library) {
+      library.members.forEach((String name, Builder builder) {
+        if (builder is SourceClassBuilder) {
+          Class cls = builder.target;
+          if (cls != objectClass) {
+            cls.supertype ??= objectClass.asRawSupertype;
+          }
+          if (builder.isMixinApplication) {
+            cls.mixedInType = builder.mixedInType.buildSupertype(library);
+          }
+        }
+      });
+    });
     ticker.logMs("Installed Object as implicit superclass");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
index a1c3b70..9bee8f9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
@@ -6,12 +6,12 @@
 
 import 'package:kernel/ast.dart' show DartType, Supertype;
 
-import 'kernel_builder.dart' show TypeBuilder;
+import 'kernel_builder.dart' show LibraryBuilder, TypeBuilder;
 
 abstract class KernelTypeBuilder extends TypeBuilder {
   KernelTypeBuilder(int charOffset, Uri fileUri) : super(charOffset, fileUri);
 
-  DartType build();
+  DartType build(LibraryBuilder library);
 
-  Supertype buildSupertype();
+  Supertype buildSupertype(LibraryBuilder library);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 585bf1a..7475312 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -15,6 +15,7 @@
         KernelLibraryBuilder,
         KernelNamedTypeBuilder,
         KernelTypeBuilder,
+        LibraryBuilder,
         TypeVariableBuilder;
 
 class KernelTypeVariableBuilder
@@ -27,7 +28,8 @@
       : parameter = new TypeParameter(name, null),
         super(name, bound, compilationUnit, charOffset);
 
-  DartType buildType(List<KernelTypeBuilder> arguments) {
+  DartType buildType(
+      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     if (arguments != null) {
       return inputError(null, null,
           "Can't use type arguments with type parameter $parameter");
@@ -36,12 +38,13 @@
     }
   }
 
-  DartType buildTypesWithBuiltArguments(List<DartType> arguments) {
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
     if (arguments != null) {
       return inputError(null, null,
           "Can't use type arguments with type parameter $parameter");
     } else {
-      return buildType(null);
+      return buildType(library, null);
     }
   }
 
@@ -49,7 +52,7 @@
     return new KernelNamedTypeBuilder(name, null, -1, null)..builder = this;
   }
 
-  void finish(KernelClassBuilder object) {
-    parameter.bound = bound?.build() ?? object.buildType(null);
+  void finish(LibraryBuilder library, KernelClassBuilder object) {
+    parameter.bound = bound?.build(library) ?? object.buildType(library, null);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/outline.dart b/pkg/front_end/lib/src/fasta/outline.dart
index 0604a26..1b14e2a 100644
--- a/pkg/front_end/lib/src/fasta/outline.dart
+++ b/pkg/front_end/lib/src/fasta/outline.dart
@@ -92,7 +92,8 @@
   }
 
   Future<KernelTarget> buildOutline([Uri output]) async {
-    TranslateUri uriTranslator = await TranslateUri.parse(c.options.sdk);
+    TranslateUri uriTranslator =
+        await TranslateUri.parse(c.options.sdk, c.options.packages);
     ticker.logMs("Read packages file");
     DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
     KernelTarget kernelTarget = createKernelTarget(dillTarget, uriTranslator);
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 3c2abf2..017534b 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -85,9 +85,9 @@
       if (builder is KernelFieldBuilder) {
         // TODO(ahe): It would be nice to have a common interface for the build
         // method to avoid duplicating these two cases.
-        cls.addMember(builder.build(library.library));
+        cls.addMember(builder.build(library));
       } else if (builder is KernelFunctionBuilder) {
-        cls.addMember(builder.build(library.library));
+        cls.addMember(builder.build(library));
       } else {
         internalError("Unhandled builder: ${builder.runtimeType}");
       }
@@ -99,14 +99,14 @@
         builder = builder.next;
       } while (builder != null);
     });
-    cls.supertype = supertype?.buildSupertype();
-    cls.mixedInType = mixedInType?.buildSupertype();
+    cls.supertype = supertype?.buildSupertype(library);
+    cls.mixedInType = mixedInType?.buildSupertype(library);
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
     if (interfaces != null) {
       for (KernelTypeBuilder interface in interfaces) {
-        Supertype supertype = interface.buildSupertype();
+        Supertype supertype = interface.buildSupertype(library);
         if (supertype != null) {
           // TODO(ahe): Report an error if supertype is null.
           cls.implementedTypes.add(supertype);
diff --git a/pkg/front_end/test/fasta/compile.status b/pkg/front_end/test/fasta/compile.status
index 79faa18..7772214 100644
--- a/pkg/front_end/test/fasta/compile.status
+++ b/pkg/front_end/test/fasta/compile.status
@@ -7,9 +7,10 @@
 # pkg/fasta/lib/src/kernel/.
 
 await: Fail
-invocations: Fail
 function_type_recovery: Crash
+invocations: Fail
 statements: Fail # Make async tranformer optional for golden file testing.
+type_variable_as_super: Fail
 
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
diff --git a/pkg/front_end/test/fasta/kompile.status b/pkg/front_end/test/fasta/kompile.status
index f0dc306..3442779 100644
--- a/pkg/front_end/test/fasta/kompile.status
+++ b/pkg/front_end/test/fasta/kompile.status
@@ -27,6 +27,7 @@
 statements: Crash
 super_rasta_copy: Crash
 top_level_accessors: Crash
+type_variable_as_super: Fail
 typedef: Crash
 
 rasta/abstract_constructor: Fail
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 3a72a05..dfd09643 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -80,6 +80,7 @@
 static const char* assembly_filename = NULL;
 static const char* script_snapshot_filename = NULL;
 static bool dependencies_only = false;
+static bool print_dependencies = false;
 static const char* dependencies_filename = NULL;
 
 
@@ -331,6 +332,17 @@
   return false;
 }
 
+static bool ProcessPrintDependenciesOption(const char* option) {
+  const char* name = ProcessOption(option, "--print_dependencies");
+  if (name == NULL) {
+    name = ProcessOption(option, "--print-dependencies");
+  }
+  if (name != NULL) {
+    print_dependencies = true;
+    return true;
+  }
+  return false;
+}
 
 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) {
   const char* name = ProcessOption(option, "--embedder_entry_points_manifest=");
@@ -406,6 +418,7 @@
         ProcessScriptSnapshotOption(argv[i]) ||
         ProcessDependenciesOption(argv[i]) ||
         ProcessDependenciesOnlyOption(argv[i]) ||
+        ProcessPrintDependenciesOption(argv[i]) ||
         ProcessEmbedderEntryPointsManifestOption(argv[i]) ||
         ProcessURLmappingOption(argv[i]) || ProcessPackageRootOption(argv[i]) ||
         ProcessPackagesOption(argv[i]) || ProcessEnvironmentOption(argv[i])) {
@@ -673,55 +686,72 @@
     return;
   }
 
-  ASSERT(dependencies_filename != NULL);
-  File* file = File::Open(dependencies_filename, File::kWriteTruncate);
-  if (file == NULL) {
-    Log::PrintErr("Error: Unable to open dependencies file: %s\n\n",
-                  dependencies_filename);
-    exit(kErrorExitCode);
-  }
+  ASSERT((dependencies_filename != NULL) || print_dependencies);
   bool success = true;
+  File* file = NULL;
+  if (dependencies_filename != NULL) {
+    file = File::Open(dependencies_filename, File::kWriteTruncate);
+    if (file == NULL) {
+      Log::PrintErr("Error: Unable to open dependencies file: %s\n\n",
+                    dependencies_filename);
+      exit(kErrorExitCode);
+    }
 
-  // Targets:
-  switch (snapshot_kind) {
-    case kCore:
-      success &= file->Print("%s ", vm_snapshot_data_filename);
-      success &= file->Print("%s ", isolate_snapshot_data_filename);
-      break;
-    case kScript:
-      success &= file->Print("%s ", script_snapshot_filename);
-      break;
-    case kAppAOTAssembly:
-      success &= file->Print("%s ", assembly_filename);
-      break;
-    case kAppAOTBlobs:
-      success &= file->Print("%s ", vm_snapshot_data_filename);
-      success &= file->Print("%s ", vm_snapshot_instructions_filename);
-      success &= file->Print("%s ", isolate_snapshot_data_filename);
-      success &= file->Print("%s ", isolate_snapshot_instructions_filename);
-      break;
+    // Targets:
+    switch (snapshot_kind) {
+      case kCore:
+        success &= file->Print("%s ", vm_snapshot_data_filename);
+        success &= file->Print("%s ", isolate_snapshot_data_filename);
+        break;
+      case kScript:
+        success &= file->Print("%s ", script_snapshot_filename);
+        break;
+      case kAppAOTAssembly:
+        success &= file->Print("%s ", assembly_filename);
+        break;
+      case kAppAOTBlobs:
+        success &= file->Print("%s ", vm_snapshot_data_filename);
+        success &= file->Print("%s ", vm_snapshot_instructions_filename);
+        success &= file->Print("%s ", isolate_snapshot_data_filename);
+        success &= file->Print("%s ", isolate_snapshot_instructions_filename);
+        break;
+    }
+
+    success &= file->Print(": ");
   }
 
-  success &= file->Print(": ");
-
   // Sources:
   if (snapshot_kind == kScript) {
-    success &= file->Print("%s ", vm_snapshot_data_filename);
-    success &= file->Print("%s ", isolate_snapshot_data_filename);
+    if (dependencies_filename != NULL) {
+      success &= file->Print("%s ", vm_snapshot_data_filename);
+      success &= file->Print("%s ", isolate_snapshot_data_filename);
+    }
+    if (print_dependencies) {
+      Log::Print("%s\n", vm_snapshot_data_filename);
+      Log::Print("%s\n", isolate_snapshot_data_filename);
+    }
   }
   for (intptr_t i = 0; i < dependencies->length(); i++) {
     char* dep = dependencies->At(i);
-    success &= file->Print("%s ", dep);
+    if (dependencies_filename != NULL) {
+      success &= file->Print("%s ", dep);
+    }
+    if (print_dependencies) {
+      Log::Print("%s\n", dep);
+    }
     free(dep);
   }
-  success &= file->Print("\n");
 
-  if (!success) {
-    Log::PrintErr("Error: Unable to write dependencies file: %s\n\n",
-                  dependencies_filename);
-    exit(kErrorExitCode);
+  if (dependencies_filename != NULL) {
+    success &= file->Print("\n");
+
+    if (!success) {
+      Log::PrintErr("Error: Unable to write dependencies file: %s\n\n",
+                    dependencies_filename);
+      exit(kErrorExitCode);
+    }
+    file->Release();
   }
-  file->Release();
   delete dependencies;
   isolate_data->set_dependencies(NULL);
 }
@@ -839,6 +869,7 @@
 "   --dependencies=<output-file>  Generates a Makefile with snapshot output  \n"
 "                                 files as targets and all transitive imports\n"
 "                                 as sources.                                \n"
+"   --print_dependencies          Prints all transitive imports to stdout.   \n"
 "   --dependencies_only           Don't create and output the snapshot.      \n"
 "                                                                            \n"
 " To create a core snapshot:                                                 \n"
@@ -1565,7 +1596,7 @@
     const bool is_kernel_file =
         TryReadKernel(app_script_name, &kernel, &kernel_length);
 
-    if (dependencies_filename != NULL) {
+    if ((dependencies_filename != NULL) || print_dependencies) {
       isolate_data->set_dependencies(new MallocGrowableArray<char*>());
     }
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 0bbb63b..918e3cc 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -620,6 +620,7 @@
   bool enable_error_on_bad_type;
   bool enable_error_on_bad_override;
   bool use_field_guards;
+  bool use_osr;
 } Dart_IsolateFlags;
 
 /**
diff --git a/runtime/observatory/lib/src/elements/isolate_view.dart b/runtime/observatory/lib/src/elements/isolate_view.dart
index 7e7599e..8c0f186 100644
--- a/runtime/observatory/lib/src/elements/isolate_view.dart
+++ b/runtime/observatory/lib/src/elements/isolate_view.dart
@@ -389,6 +389,8 @@
                     ..children = [
                       new SpanElement()
                         ..children = [
+                          // TODO(bkonyi): zones will always be empty. See
+                          // issue #28885.
                           new SpanElement()
                             ..text = 'zone ${index++} ',
                           new CurlyBlockElement(queue: _r.queue)
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1618aed..954f24e 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3107,6 +3107,8 @@
   String _kindString;
   int get memoryHighWatermark => _memoryHighWatermark;
   int _memoryHighWatermark;
+
+  // TODO(bkonyi): zones will always be empty. See issue #28885.
   List<Zone> get zones => _zones;
   final List<Zone> _zones = new List<Zone>();
 
@@ -3114,7 +3116,6 @@
 
   void _update(Map map, bool mapIsRef) {
     String rawKind = map['kind'];
-    List<Map> zoneList = map['zones'];
 
     switch(rawKind) {
       case "kUnknownTask":
@@ -3146,13 +3147,6 @@
     }
 
     _memoryHighWatermark = int.parse(map['_memoryHighWatermark']);
-
-    zones.clear();
-    zoneList.forEach((zone) {
-      int capacity = zone['capacity'];
-      int used = zone['used'];
-      zones.add(new Zone(capacity, used));
-    });
   }
 }
 
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 19ba41f..3d1c34a 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -369,7 +369,6 @@
   assert(defined(invoker.libraries), "Need libraries in $target_name")
 
   concatenation_target_names = []
-  concatenation_files = []
 
   # Concatenate vm library patches.
   foreach(library, invoker.libraries) {
@@ -381,7 +380,6 @@
       output = target_output
     }
     concatenation_target_names += [ ":concatenate_${name}_patch" ]
-    concatenation_files += [ target_output ]
   }
 
   # Build the patched sdk out of the concatenated patches and the special
@@ -397,57 +395,16 @@
 
     script = "../../tools/patch_sdk.py"
 
-    # We list all files which make up the sdk (modulo patches) and get them
-    # back as a GN list object.
-    shared_sdk_sources = exec_script("../../tools/list_dart_files.py",
-                                     [
-                                       "absolute",
-                                       rebase_path("../../sdk/lib"),
-                                     ],
-                                     "list lines")
-
-    front_end_sources = exec_script("../../tools/list_dart_files.py",
-                                    [
-                                      "absolute",
-                                      rebase_path("../../pkg/front_end"),
-                                    ],
-                                    "list lines")
-
-    kernel_sources = exec_script("../../tools/list_dart_files.py",
-                                 [
-                                   "absolute",
-                                   rebase_path("../../pkg/kernel"),
-                                 ],
-                                 "list lines")
-
     # We list the `patch_sdk.dart` tool here because the [script] (which is
     # implicitly an input) will call it.
     inputs = [
       "../../tools/patch_sdk.dart",
     ]
-
-    # Files below are not patches, they will not be in [concatenation_files]
-    # but the `patch_sdk.dart` script will copy them into the patched sdk.
-    inputs += [
-      "../bin/builtin.dart",
-      "../bin/vmservice/vmservice_io.dart",
-      "../bin/vmservice/loader.dart",
-      "../bin/vmservice/server.dart",
-    ]
-
-    # Add all the normal sdk sources.
-    inputs += shared_sdk_sources
-
-    # Add all the concatenated patch files.
-    inputs += concatenation_files
-
-    # Add some front-end dependencies
-    inputs += front_end_sources
-    inputs += kernel_sources
+    depfile = "$root_out_dir/patched_sdk.d"
 
     outputs = [
       # Instead of listing all outputs we list a single well-known one.
-      "${patched_sdk_dir}/lib/core/core.dart",
+      "${patched_sdk_dir}/platform.dill",
     ]
 
     args = [ "--quiet" ]
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 3bd1c6c..dc9e0fe 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -5033,7 +5033,7 @@
   intptr_t buffer_len = OS::StrNLen(features, PendingBytes());
   if ((buffer_len != expected_len) ||
       strncmp(features, expected_features, expected_len)) {
-    const intptr_t kMessageBufferSize = 256;
+    const intptr_t kMessageBufferSize = 1024;
     char message_buffer[kMessageBufferSize];
     char* actual_features =
         OS::StrNDup(features, buffer_len < 128 ? buffer_len : 128);
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index f549231..72e3aae 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1668,7 +1668,7 @@
   }
 
   if ((stack_overflow_flags & Thread::kOsrRequest) != 0) {
-    ASSERT(FLAG_use_osr);
+    ASSERT(isolate->use_osr());
     DartFrameIterator iterator;
     StackFrame* frame = iterator.NextFrame();
     ASSERT(frame != NULL);
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 5a6a1b9..4c4a87d 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -669,15 +669,13 @@
 
   if (Snapshot::IncludesCode(kind)) {
     // Checked mode affects deopt ids.
-    const bool asserts =
-        (isolate != NULL) ? isolate->asserts() : FLAG_enable_asserts;
-    const bool type_checks =
-        (isolate != NULL) ? isolate->type_checks() : FLAG_enable_type_checks;
-    const bool field_guards =
-        (isolate != NULL) ? isolate->use_field_guards() : FLAG_use_field_guards;
-    buffer.AddString(asserts ? " asserts" : " no-asserts");
-    buffer.AddString(type_checks ? " type-checks" : " no-type-checks");
-    buffer.AddString(field_guards ? "field-guards" : "no-field-guards");
+#define ADD_FLAG(name, isolate_flag, flag)                                     \
+  do {                                                                         \
+    const bool name = (isolate != NULL) ? isolate->name() : flag;              \
+    buffer.AddString(name ? (" " #name) : (" no-" #name));                     \
+  } while (0);
+    ISOLATE_FLAG_LIST(ADD_FLAG);
+#undef ADD_FLAG
 
 // Generated code must match the host architecture and ABI.
 #if defined(TARGET_ARCH_ARM)
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index ee47df9..24a339a 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -465,8 +465,9 @@
   int saved_threshold = FLAG_optimization_counter_threshold;
   const int kLowThreshold = 100;
   const int kHighThreshold = 10000;
-  bool saved_osr = FLAG_use_osr;
-  FLAG_use_osr = false;
+  Isolate* isolate = Isolate::Current();
+  const bool saved_use_osr = isolate->use_osr();
+  isolate->set_use_osr(false);
 
   if (optimize) {
     // Warm up the code to make sure it gets optimized.  We ignore any
@@ -511,7 +512,7 @@
   }
 
   FLAG_optimization_counter_threshold = saved_threshold;
-  FLAG_use_osr = saved_osr;
+  isolate->set_use_osr(saved_use_osr);
 }
 
 
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 5831114..be174f0 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -25,6 +25,12 @@
 #define USING_MULTICORE false
 #endif
 
+#if defined(DART_PRECOMPILER)
+#define USING_PRECOMPILER true
+#else
+#define USING_PRECOMPILER false
+#endif
+
 // List of all flags in the VM.
 // Flags can be one of three categories:
 // * P roduct flags: Can be set in any of the deployment modes, including in
@@ -162,7 +168,7 @@
     "Use class hierarchy analysis even if it can cause deoptimization.")       \
   P(use_field_guards, bool, !USING_DBC,                                        \
     "Use field guards and track field types")                                  \
-  C(use_osr, false, true, bool, true, "Use OSR")                               \
+  C(use_osr, false, !USING_PRECOMPILER, bool, !USING_PRECOMPILER, "Use OSR")   \
   P(verbose_gc, bool, false, "Enables verbose GC.")                            \
   P(verbose_gc_hdr, int, 40, "Print verbose GC header interval.")              \
   R(verify_after_gc, false, bool, false,                                       \
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 1aa4347..4610cd6 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -333,7 +333,7 @@
 
 
 bool FlowGraphCompiler::CanOSRFunction() const {
-  return FLAG_use_osr & CanOptimizeFunction() && !is_optimizing();
+  return isolate()->use_osr() && CanOptimizeFunction() && !is_optimizing();
 }
 
 
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index c9eb941..ff47301 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -175,8 +175,8 @@
   if (array_index_ < map_.array_size_) {
     // If we're not in the middle of a list, find the next array slot.
     if (list_index_ == kNil) {
-      while (KeyValueTrait::ValueOf(map_.array_[array_index_].kv) == kNoValue &&
-             array_index_ < map_.array_size_) {
+      while ((array_index_ < map_.array_size_) &&
+             KeyValueTrait::ValueOf(map_.array_[array_index_].kv) == kNoValue) {
         array_index_++;
       }
       if (array_index_ < map_.array_size_) {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index a327937..ea29a8a 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -2949,7 +2949,7 @@
       : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
+    if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       const Register value = instruction_->locs()->temp(0).reg();
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
@@ -2968,7 +2968,8 @@
         instruction_->token_pos(), instruction_->deopt_id(),
         kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
-    if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
+    if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
+        instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
@@ -2980,7 +2981,7 @@
   }
 
   Label* osr_entry_label() {
-    ASSERT(FLAG_use_osr);
+    ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 0d78d48..1f2a9b2 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2642,7 +2642,7 @@
       : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
+    if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       const Register value = instruction_->locs()->temp(0).reg();
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
@@ -2661,7 +2661,8 @@
         instruction_->token_pos(), instruction_->deopt_id(),
         kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
-    if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
+    if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
+        instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
@@ -2673,7 +2674,7 @@
   }
 
   Label* osr_entry_label() {
-    ASSERT(FLAG_use_osr);
+    ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index e19bbf1..1f4f419 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2565,7 +2565,7 @@
       : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
+    if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
       __ movl(Address(THR, Thread::stack_overflow_flags_offset()),
@@ -2583,7 +2583,8 @@
         instruction_->token_pos(), instruction_->deopt_id(),
         kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
-    if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
+    if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
+        instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
@@ -2595,7 +2596,7 @@
   }
 
   Label* osr_entry_label() {
-    ASSERT(FLAG_use_osr);
+    ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 36217a4..51882f8 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2778,7 +2778,7 @@
       : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
+    if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       Register value = instruction_->locs()->temp(0).reg();
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
@@ -2797,7 +2797,8 @@
         instruction_->token_pos(), instruction_->deopt_id(),
         kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
-    if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
+    if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
+        instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
@@ -2809,7 +2810,7 @@
   }
 
   Label* osr_entry_label() {
-    ASSERT(FLAG_use_osr);
+    ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 0193a09..c704319 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -2632,7 +2632,7 @@
       : instruction_(instruction) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (FLAG_use_osr && osr_entry_label()->IsLinked()) {
+    if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
       __ movq(Address(THR, Thread::stack_overflow_flags_offset()),
@@ -2650,7 +2650,8 @@
         instruction_->token_pos(), instruction_->deopt_id(),
         kStackOverflowRuntimeEntry, 0, instruction_->locs());
 
-    if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
+    if (compiler->isolate()->use_osr() && !compiler->is_optimizing() &&
+        instruction_->in_loop()) {
       // In unoptimized code, record loop stack checks as possible OSR entries.
       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry,
                                      instruction_->deopt_id(),
@@ -2663,7 +2664,7 @@
 
 
   Label* osr_entry_label() {
-    ASSERT(FLAG_use_osr);
+    ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index af870e9..b473061 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -722,31 +722,27 @@
 
 void Isolate::FlagsInitialize(Dart_IsolateFlags* api_flags) {
   api_flags->version = DART_FLAGS_CURRENT_VERSION;
-  api_flags->enable_type_checks = FLAG_enable_type_checks;
-  api_flags->enable_asserts = FLAG_enable_asserts;
-  api_flags->enable_error_on_bad_type = FLAG_error_on_bad_type;
-  api_flags->enable_error_on_bad_override = FLAG_error_on_bad_override;
-  api_flags->use_field_guards = FLAG_use_field_guards;
+#define INIT_FROM_FLAG(name, isolate_flag, flag) api_flags->isolate_flag = flag;
+  ISOLATE_FLAG_LIST(INIT_FROM_FLAG)
+#undef INIT_FROM_FLAG
 }
 
 
 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const {
   api_flags->version = DART_FLAGS_CURRENT_VERSION;
-  api_flags->enable_type_checks = type_checks();
-  api_flags->enable_asserts = asserts();
-  api_flags->enable_error_on_bad_type = error_on_bad_type();
-  api_flags->enable_error_on_bad_override = error_on_bad_override();
-  api_flags->use_field_guards = use_field_guards();
+#define INIT_FROM_FIELD(name, isolate_flag, flag)                              \
+  api_flags->isolate_flag = name();
+  ISOLATE_FLAG_LIST(INIT_FROM_FIELD)
+#undef INIT_FROM_FIELD
 }
 
 
 #if !defined(PRODUCT)
 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
-  type_checks_ = api_flags.enable_type_checks;
-  asserts_ = api_flags.enable_asserts;
-  error_on_bad_type_ = api_flags.enable_error_on_bad_type;
-  error_on_bad_override_ = api_flags.enable_error_on_bad_override;
-  use_field_guards_ = api_flags.use_field_guards;
+#define SET_FROM_FLAG(name, isolate_flag, flag)                                \
+  name##_ = api_flags.isolate_flag;
+  ISOLATE_FLAG_LIST(SET_FROM_FLAG)
+#undef SET_FROM_FLAG
   // Leave others at defaults.
 }
 #endif  // !defined(PRODUCT)
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 3d9bf2b..e5c55b4 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -129,6 +129,19 @@
 // Fixed cache for exception handler lookup.
 typedef FixedCache<intptr_t, ExceptionHandlerInfo, 16> HandlerInfoCache;
 
+// List of Isolate flags with corresponding members of Dart_IsolateFlags and
+// corresponding global command line flags.
+//
+//       V(name, Dart_IsolateFlags-member-name, command-line-flag-name)
+//
+#define ISOLATE_FLAG_LIST(V)                                                   \
+  V(type_checks, enable_type_checks, FLAG_enable_type_checks)                  \
+  V(asserts, enable_asserts, FLAG_enable_asserts)                              \
+  V(error_on_bad_type, enable_error_on_bad_type, FLAG_error_on_bad_type)       \
+  V(error_on_bad_override, enable_error_on_bad_override,                       \
+    FLAG_error_on_bad_override)                                                \
+  V(use_field_guards, use_field_guards, FLAG_use_field_guards)                 \
+  V(use_osr, use_osr, FLAG_use_osr)
 
 class Isolate : public BaseIsolate {
  public:
@@ -634,17 +647,17 @@
   void FlagsCopyFrom(const Dart_IsolateFlags& api_flags);
 
 #if defined(PRODUCT)
-  bool type_checks() const { return FLAG_enable_type_checks; }
-  bool asserts() const { return FLAG_enable_asserts; }
-  bool error_on_bad_type() const { return FLAG_error_on_bad_type; }
-  bool error_on_bad_override() const { return FLAG_error_on_bad_override; }
-  bool use_field_guards() const { return FLAG_use_field_guards; }
+#define DECLARE_GETTER(name, isolate_flag_name, flag_name)                     \
+  bool name() const { return flag_name; }
+  ISOLATE_FLAG_LIST(DECLARE_GETTER)
+#undef DECLARE_GETTER
+  void set_use_osr(bool use_osr) { ASSERT(!use_osr); }
 #else   // defined(PRODUCT)
-  bool type_checks() const { return type_checks_; }
-  bool asserts() const { return asserts_; }
-  bool error_on_bad_type() const { return error_on_bad_type_; }
-  bool error_on_bad_override() const { return error_on_bad_override_; }
-  bool use_field_guards() const { return use_field_guards_; }
+#define DECLARE_GETTER(name, isolate_flag_name, flag_name)                     \
+  bool name() const { return name##_; }
+  ISOLATE_FLAG_LIST(DECLARE_GETTER)
+#undef DECLARE_GETTER
+  void set_use_osr(bool use_osr) { use_osr_ = use_osr; }
 #endif  // defined(PRODUCT)
 
   static void KillAllIsolates(LibMsgId msg_id);
@@ -770,11 +783,9 @@
 
 // Isolate-specific flags.
 #if !defined(PRODUCT)
-  bool type_checks_;
-  bool asserts_;
-  bool error_on_bad_type_;
-  bool error_on_bad_override_;
-  bool use_field_guards_;
+#define DECLARE_FIELD(name, isolate_flag_name, flag_name) bool name##_;
+  ISOLATE_FLAG_LIST(DECLARE_FIELD)
+#undef DECLARE_FIELD
 #endif  // !defined(PRODUCT)
 
   // Timestamps of last operation via service.
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index d0a09f8..0b6e867 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -71,15 +71,14 @@
     // Note: these flags must match those passed to the VM during
     // the app-jit training run (see //utils/kernel-service/BUILD.gn).
     Dart_IsolateFlags api_flags;
-    api_flags.version = DART_FLAGS_CURRENT_VERSION;
+    Isolate::FlagsInitialize(&api_flags);
     api_flags.enable_type_checks = false;
     api_flags.enable_asserts = false;
     api_flags.enable_error_on_bad_type = false;
     api_flags.enable_error_on_bad_override = false;
-#if defined(DART_PRECOMPILER)
-    api_flags.use_field_guards = false;
-#else
+#if !defined(DART_PRECOMPILER)
     api_flags.use_field_guards = true;
+    api_flags.use_osr = true;
 #endif
 
     isolate = reinterpret_cast<Isolate*>(create_callback(
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index dc54d6a..31ecabe 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -230,15 +230,6 @@
                      OSThread::ThreadIdToIntPtr(os_thread()->trace_id()));
   jsobj.AddProperty("kind", TaskKindToCString(task_kind()));
   jsobj.AddPropertyF("_memoryHighWatermark", "%" Pu "", memory_high_watermark_);
-  Zone* zone = zone_;
-  {
-    JSONArray zone_info_array(&jsobj, "zones");
-    zone = zone_;
-    while (zone != NULL) {
-      zone_info_array.AddValue(zone);
-      zone = zone->previous();
-    }
-  }
 }
 #endif
 
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 74a97fd..7905969 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -325,24 +325,9 @@
   // Confirm all expected entries are in the JSON output.
   for (intptr_t i = 0; i < kTaskCount + 1; i++) {
     Thread* thread = threads[i];
-    Zone* top_zone = thread->zone();
-
     StackZone stack_zone(current_thread);
     Zone* current_zone = current_thread->zone();
 
-    // Check that all zones are present with correct sizes.
-    while (top_zone != NULL) {
-      char* zone_info_buf =
-          OS::SCreate(current_zone,
-                      "\"type\":\"_Zone\","
-                      "\"capacity\":%" Pd
-                      ","
-                      "\"used\":%" Pd "",
-                      top_zone->CapacityInBytes(), top_zone->SizeInBytes());
-      EXPECT_SUBSTRING(zone_info_buf, json);
-      top_zone = top_zone->previous();
-    }
-
     // Check the thread exists and is the correct size.
     char* thread_info_buf =
         OS::SCreate(current_zone,
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index fc988a7..8b3cdac 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -301,6 +301,7 @@
 
 
 #ifndef PRODUCT
+// TODO(bkonyi): Currently dead code. See issue #28885.
 void Zone::PrintJSON(JSONStream* stream) const {
   JSONObject jsobj(stream);
   intptr_t capacity = CapacityInBytes();
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index c7dda2b..51f15c2 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -101,19 +101,11 @@
 Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: RuntimeError
 Language/Classes/Superclasses/superclass_of_itself_t01: MissingCompileTimeError
 Language/Classes/Superclasses/superclass_of_itself_t02: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t01: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t02: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t03: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t05: DartkCrash
 Language/Classes/Superclasses/wrong_superclass_t07: Crash
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
 Language/Classes/Superinterfaces/dynamic_type_t01: MissingCompileTimeError
 Language/Classes/Superinterfaces/dynamic_type_t02: MissingCompileTimeError
 Language/Classes/Superinterfaces/itself_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/type_variable_as_superinterface_t01: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t02: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t03: MissingCompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
 Language/Classes/declarations_t02: MissingCompileTimeError
@@ -308,7 +300,6 @@
 Language/Expressions/Method_Invocation/Super_Invocation/invocation_t03: MissingCompileTimeError
 Language/Expressions/Method_Invocation/Super_Invocation/syntax_t02: DartkCrash
 Language/Expressions/Method_Invocation/Super_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Numbers/extend_or_implement_double_t06: MissingCompileTimeError
 Language/Expressions/Numbers/syntax_t21: MissingCompileTimeError
 Language/Expressions/Numbers/syntax_t25: MissingCompileTimeError
 Language/Expressions/Numbers/syntax_t26: MissingCompileTimeError
@@ -393,11 +384,9 @@
 Language/Libraries_and_Scripts/Imports/namespace_changes_t27: CompileTimeError
 Language/Libraries_and_Scripts/Imports/same_name_t02/01: MissingRuntimeError
 Language/Libraries_and_Scripts/Imports/same_name_t05: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t07: MissingCompileTimeError
 Language/Libraries_and_Scripts/Imports/same_name_t10: RuntimeError
 Language/Libraries_and_Scripts/Imports/same_name_t12/01: MissingRuntimeError
 Language/Libraries_and_Scripts/Imports/same_name_t15/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t17: MissingCompileTimeError
 Language/Libraries_and_Scripts/Imports/same_name_t19: RuntimeError
 Language/Libraries_and_Scripts/Imports/static_type_t01: Skip # No support for deferred libraries.
 Language/Libraries_and_Scripts/Imports/syntax_t32: MissingCompileTimeError
@@ -449,15 +438,11 @@
 Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t04: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_mixin_type_t05: DartkCrash
 Language/Mixins/Mixin_Application/wrong_mixin_type_t06: DartkCrash
 Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t08: Crash
 Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_type_t02: DartkCrash
-Language/Mixins/Mixin_Application/wrong_type_t03: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_type_t04: Crash
 Language/Mixins/Mixin_Application/wrong_type_t05: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_type_t06: Crash
@@ -706,6 +691,7 @@
 Language/Overview/Scoping/conflicting_names_t43: Crash
 Language/Overview/Scoping/hiding_declaration_t11: Crash
 Language/Overview/Scoping/hiding_declaration_t12: Crash
+LibTest/isolate/Isolate/spawnUri_A01_t04: Pass, Slow, Timeout
 
 # dartk: precompilation failures
 [ $compiler == dartkp ]
@@ -749,6 +735,7 @@
 Language/Expressions/Function_Invocation/Unqualified_Invocation/prefix_object_invocation_t01: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/evaluation_prefix_t01: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/evaluation_type_parameter_t02: MissingCompileTimeError
+Language/Expressions/Instance_Creation/New/syntax_t02: MissingCompileTimeError
 Language/Expressions/Logical_Boolean_Expressions/syntax_t02: MissingCompileTimeError
 Language/Expressions/Logical_Boolean_Expressions/syntax_t03: MissingCompileTimeError
 Language/Expressions/Method_Invocation/Super_Invocation/invocation_t01: MissingCompileTimeError
@@ -766,6 +753,8 @@
 Language/Expressions/This/placement_t06: MissingCompileTimeError
 Language/Expressions/This/placement_t07: MissingCompileTimeError
 Language/Expressions/This/placement_t08: MissingCompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t07: MissingCompileTimeError
+Language/Libraries_and_Scripts/Imports/namespace_changes_t08: MissingCompileTimeError
 Language/Overview/Privacy/private_and_public_t04: RuntimeError
 Language/Overview/Scoping/conflicting_names_t43: Crash
 Language/Overview/Scoping/hiding_declaration_t11: Crash
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 4d58159..c98b85d 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -323,8 +323,6 @@
 export_double_same_main_test: Crash
 export_main_test: Crash
 export_private_test/01: MissingCompileTimeError
-extend_type_parameter2_negative_test: DartkCrash
-extend_type_parameter_negative_test: DartkCrash
 external_test/11: MissingCompileTimeError
 external_test/12: MissingCompileTimeError
 external_test/13: MissingRuntimeError
@@ -379,7 +377,6 @@
 function_type_alias5_test/02: MissingCompileTimeError
 function_type_alias6_test/00: MissingCompileTimeError
 function_type_alias7_test/00: MissingCompileTimeError
-function_type_alias7_test/01: DartkCrash
 function_type_alias7_test/02: MissingCompileTimeError
 function_type_alias9_test/00: MissingCompileTimeError
 function_type_parameter2_negative_test: Crash
@@ -413,7 +410,6 @@
 initializing_formal_final_test: RuntimeError
 inst_field_initializer1_negative_test: Fail
 instanceof3_test: RuntimeError
-interface2_negative_test: Fail
 interface_cycle_test/01: MissingCompileTimeError
 interface_cycle_test/02: MissingCompileTimeError
 invocation_mirror_test: RuntimeError
@@ -431,22 +427,14 @@
 large_class_declaration_test: SkipSlow  # KernelVM Issue 28312
 library_ambiguous_test/00: MissingRuntimeError
 library_ambiguous_test/04: MissingRuntimeError
-library_ambiguous_test/05: MissingCompileTimeError
 library_env_test/has_html_support: RuntimeError
 library_env_test/has_no_io_support: RuntimeError
 list_literal2_negative_test: Fail
 list_literal4_test: RuntimeError
 main_not_a_function_test/01: Crash
 malformed2_test/00: RuntimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: Crash
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_inheritance_test/07: DartkCrash
-malformed_inheritance_test/08: DartkCrash
 malformed_inheritance_test/09: MissingCompileTimeError
 malformed_inheritance_test/10: MissingCompileTimeError
-malformed_inheritance_test/11: DartkCrash
-malformed_inheritance_test/12: DartkCrash
 malformed_test/none: RuntimeError
 map_literal2_negative_test: Fail
 map_literal3_test: RuntimeError
@@ -487,11 +475,6 @@
 mixin_illegal_object_test/01: MissingCompileTimeError
 mixin_illegal_object_test/02: MissingCompileTimeError
 mixin_illegal_syntax_test/00: DartkCrash
-mixin_invalid_inheritance1_test/01: Crash
-mixin_invalid_inheritance1_test/02: Crash
-mixin_invalid_inheritance1_test/03: Crash
-mixin_invalid_inheritance2_test/01: MissingCompileTimeError
-mixin_invalid_inheritance2_test/02: MissingCompileTimeError
 mixin_invalid_inheritance2_test/03: DartkCrash
 mixin_issue10216_2_test: RuntimeError
 mixin_mixin2_test: RuntimeError
@@ -534,8 +517,6 @@
 on_catch_malformed_type_test: RuntimeError
 parameter_initializer6_negative_test: Fail
 part2_test: RuntimeError
-prefix13_negative_test: Fail
-prefix15_negative_test: Fail
 private_access_test/05: RuntimeError
 private_access_test/06: RuntimeError
 private_super_constructor_test/01: MissingCompileTimeError
@@ -656,7 +637,6 @@
 vm/debug_break_enabled_vm_test/none: CompileTimeError
 vm/regress_27201_test: CompileTimeError
 vm/regress_27671_test: RuntimeError
-vm/regress_28325_test: RuntimeError
 vm/type_cast_vm_test: RuntimeError
 vm/type_vm_test: RuntimeError
 
@@ -718,14 +698,13 @@
 super_call4_test: RuntimeError
 super_getter_setter_test: RuntimeError
 try_catch_syntax_test/05: MissingCompileTimeError
-vm/lazy_deopt_vm_test: Pass, Slow
-vm/lazy_deopt_vm_test: Pass, Timeout
+vm/lazy_deopt_vm_test: Pass, Slow, Timeout
 vm/optimized_stacktrace_test: Skip # Issue 28788
 
 # dartk: JIT failures (debug)
 [ $compiler == dartk && $mode == debug ]
 constructor_duplicate_initializers_test/03: Crash
-deopt_inlined_function_lazy_test: Timeout
+deopt_inlined_function_lazy_test: Skip
 hello_dart_test: Crash  # error: expected: cls.is_type_finalized()
 not_enough_positional_arguments_test/02: Crash  # Dartk Issue 28301
 not_enough_positional_arguments_test/05: Crash  # Dartk Issue 28301
@@ -739,6 +718,7 @@
 ref_before_declaration_test/07: Crash
 ref_before_declaration_test/none: Crash
 try_catch_syntax_test/05: Crash
+vm/lazy_deopt_vm_test: Crash
 
 # dartk: precompilation failures
 [ $compiler == dartkp ]
@@ -774,6 +754,8 @@
 illegal_initializer_test/04: MissingCompileTimeError
 illegal_invocation_test/01: MissingCompileTimeError
 label_test: RuntimeError
+named_constructor_test/05: MissingCompileTimeError
+named_constructor_test/08: MissingCompileTimeError
 prefix_assignment_test/01: MissingCompileTimeError
 prefix_assignment_test/02: MissingCompileTimeError
 prefix_identifier_reference_test/01: MissingCompileTimeError
diff --git a/tools/VERSION b/tools/VERSION
index a5691e7..00ca6a0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 23
 PATCH 0
-PRERELEASE 3
+PRERELEASE 4
 PRERELEASE_PATCH 0
diff --git a/tools/deps/dartium.deps/DEPS.chromium b/tools/deps/dartium.deps/DEPS.chromium
index d15aff5..8d00973 100644
--- a/tools/deps/dartium.deps/DEPS.chromium
+++ b/tools/deps/dartium.deps/DEPS.chromium
@@ -623,17 +623,6 @@
   {
     'action': [
       'python',
-      'src/third_party/mojo/src/mojo/public/tools/download_shell_binary.py',
-      '--tools-directory=../../../../../../tools'
-    ],
-    'pattern':
-      '',
-    'name':
-      'download_mojo_shell'
-  },
-  {
-    'action': [
-      'python',
       'src/third_party/instrumented_libraries/scripts/download_binaries.py'
     ],
     'pattern':
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 33a06fb..bcdc635 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -13,8 +13,41 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:path/path.dart' as path;
-import 'package:front_end/src/fasta/compile_platform.dart' as
-    compile_platform;
+import 'package:front_end/src/fasta/compile_platform.dart' as compile_platform;
+
+import 'package:front_end/src/fasta/outline.dart' show CompileTask;
+
+import 'package:front_end/src/fasta/compiler_command_line.dart'
+    show CompilerCommandLine;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/ticker.dart' show Ticker;
+
+/// Set of input files that were read by this script to generate patched SDK.
+/// We will dump it out into the depfile for ninja to use.
+///
+/// For more information see GN and Ninja references:
+///    https://chromium.googlesource.com/chromium/src/+/56807c6cb383140af0c03da8f6731d77785d7160/tools/gn/docs/reference.md#depfile_string_File-name-for-input-dependencies-for-actions
+///    https://ninja-build.org/manual.html#_depfile
+///
+final deps = new Set<String>();
+
+/// Create [File] object from the given path and register it as a dependency.
+File getInputFile(String path, {canBeMissing: false}) {
+  final file = new File(path);
+  if (!file.existsSync()) {
+    if (!canBeMissing) throw "patch_sdk.dart expects all inputs to exist";
+    return null;
+  }
+  deps.add(file.absolute.path);
+  return file;
+}
+
+/// Read the given file synchronously as a string and register this path as
+/// a dependency.
+String readInputFile(String path, {canBeMissing: false}) =>
+    getInputFile(path, canBeMissing: canBeMissing)?.readAsStringSync();
 
 Future main(List<String> argv) async {
   var base = path.fromUri(Platform.script);
@@ -28,8 +61,8 @@
     final sdkExample = path.relative(path.join(repositoryDir, 'sdk'));
     final patchExample = path.relative(
         path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patch'));
-    final outExample = path.relative(path.join(repositoryDir, 'out', 'DebugX64',
-                                               'obj', 'gen', 'patched_sdk'));
+    final outExample = path.relative(path.join(
+        repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patched_sdk'));
     print('For example:');
     print('\$ $self vm $sdkExample $patchExample $outExample');
 
@@ -37,6 +70,7 @@
   }
 
   var mode = argv[0];
+  assert(mode == "vm");
   var input = argv[1];
   var sdkLibIn = path.join(input, 'lib');
   var patchIn = argv[2];
@@ -48,12 +82,11 @@
   var INTERNAL_PATH = '_internal/compiler/js_lib/';
 
   // Copy and patch libraries.dart and version
-  var libContents = new File(path.join(sdkLibIn, '_internal',
-      'sdk_library_metadata', 'lib', 'libraries.dart')).readAsStringSync();
-  if (mode == 'vm') {
-    libContents = libContents.replaceAll(
-        ' libraries = const {',
-        ''' libraries = const {
+  var libContents = readInputFile(path.join(
+      sdkLibIn, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'));
+  libContents = libContents.replaceAll(
+      ' libraries = const {',
+      ''' libraries = const {
 
   "_builtin": const LibraryInfo(
       "_builtin/_builtin.dart",
@@ -80,39 +113,25 @@
       platforms: VM_PLATFORM),
 
 ''');
-  }
   _writeSync(
       path.join(
           sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
       libContents);
-  if (mode == 'ddc') {
-    _writeSync(path.join(sdkOut, '..', 'version'),
-        new File(path.join(sdkLibIn, '..', 'version')).readAsStringSync());
-  }
 
   // Parse libraries.dart
   var sdkLibraries = _getSdkLibraries(libContents);
 
   // Enumerate core libraries and apply patches
   for (SdkLibrary library in sdkLibraries) {
-    // TODO(jmesserly): analyzer does not handle the default case of
-    // "both platforms" correctly, and treats it as being supported on neither.
-    // So instead we skip explicitly marked as either VM or dart2js libs.
-    if (mode == 'ddc' ? library.isVmLibrary : library.isDart2JsLibrary) {
+    if (library.isDart2JsLibrary) {
       continue;
     }
 
     var libraryOut = path.join(sdkLibIn, library.path);
-    var libraryIn;
-    if (mode == 'ddc' && library.path.contains(INTERNAL_PATH)) {
-      libraryIn =
-          path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
-    } else {
-      libraryIn = libraryOut;
-    }
+    var libraryIn = libraryOut;
 
-    var libraryFile = new File(libraryIn);
-    if (libraryFile.existsSync()) {
+    var libraryFile = getInputFile(libraryIn, canBeMissing: true);
+    if (libraryFile != null) {
       var outPaths = <String>[libraryOut];
       var libraryContents = libraryFile.readAsStringSync();
 
@@ -124,7 +143,8 @@
           var partPath = part.uri.stringValue;
           outPaths.add(path.join(path.dirname(libraryOut), partPath));
 
-          var partFile = new File(path.join(path.dirname(libraryIn), partPath));
+          var partFile =
+              getInputFile(path.join(path.dirname(libraryIn), partPath));
           partFiles.add(partFile);
           inputModifyTime = math.max(inputModifyTime,
               partFile.lastModifiedSync().millisecondsSinceEpoch);
@@ -135,9 +155,8 @@
       var patchPath = path.join(
           patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
 
-      var patchFile = new File(patchPath);
-      bool patchExists = patchFile.existsSync();
-      if (patchExists) {
+      var patchFile = getInputFile(patchPath, canBeMissing: true);
+      if (patchFile != null) {
         inputModifyTime = math.max(inputModifyTime,
             patchFile.lastModifiedSync().millisecondsSinceEpoch);
       }
@@ -162,10 +181,9 @@
       if (needsUpdate) {
         var contents = <String>[libraryContents];
         contents.addAll(partFiles.map((f) => f.readAsStringSync()));
-        if (patchExists) {
+        if (patchFile != null) {
           var patchContents = patchFile.readAsStringSync();
-          contents = _patchLibrary(
-              patchFile.path, contents, patchContents);
+          contents = _patchLibrary(patchFile.path, contents, patchContents);
         }
 
         for (var i = 0; i < outPaths.length; i++) {
@@ -175,22 +193,22 @@
     }
   }
 
-  if (mode == 'vm') {
-    for (var tuple in [['_builtin', 'builtin.dart']]) {
-      var vmLibrary = tuple[0];
-      var dartFile = tuple[1];
+  for (var tuple in [
+    ['_builtin', 'builtin.dart']
+  ]) {
+    var vmLibrary = tuple[0];
+    var dartFile = tuple[1];
 
-      // The "dart:_builtin" library is only available for the DartVM.
-      var builtinLibraryIn  = path.join(dartDir, 'runtime', 'bin', dartFile);
-      var builtinLibraryOut = path.join(sdkOut, vmLibrary, '${vmLibrary}.dart');
-      _writeSync(builtinLibraryOut, new File(builtinLibraryIn).readAsStringSync());
-    }
+    // The "dart:_builtin" library is only available for the DartVM.
+    var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', dartFile);
+    var builtinLibraryOut = path.join(sdkOut, vmLibrary, '${vmLibrary}.dart');
+    _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn));
+  }
 
-    for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) {
-      var libraryIn  = path.join(dartDir, 'runtime', 'bin', 'vmservice', file);
-      var libraryOut = path.join(sdkOut, 'vmservice_io', file);
-      _writeSync(libraryOut, new File(libraryIn).readAsStringSync());
-    }
+  for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) {
+    var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file);
+    var libraryOut = path.join(sdkOut, 'vmservice_io', file);
+    _writeSync(libraryOut, readInputFile(libraryIn));
   }
 
   // TODO(kustermann): We suppress compiler hints/warnings/errors temporarily
@@ -199,13 +217,49 @@
   // been fixed (either in fasta or the dart files in the patched_sdk).
   final capturedLines = <String>[];
   try {
+    final platform = path.join(outDir, 'platform.dill');
+
     await runZoned(() async {
       await compile_platform.mainEntryPoint(<String>[
         '--packages',
         new Uri.file(packagesFile).toString(),
         new Uri.directory(outDir).toString(),
-        path.join(outDir, 'platform.dill')
+        platform,
       ]);
+
+      // platform.dill was generated, now generate platform.dill.d depfile
+      // that captures all dependencies that participated in the generation.
+      // There are two types of dependencies:
+      //   (1) all Dart sources that constitute this tool itself
+      //   (2) Dart SDK and patch sources.
+      // We already collected all inputs from the second category in the deps
+      // set. To collect inputs from the first category we actually use Fasta:
+      // we ask Fasta to outline patch_sdk.dart and generate a depfile which
+      // would list all the sources.
+      final depfile = "${outDir}.d";
+      await CompilerCommandLine.withGlobalOptions("outline", [
+        '--packages',
+        new Uri.file(packagesFile).toString(),
+        '--platform',
+        new Uri.file(platform).toString(), // platform.dill
+        Platform.script.toString() // patch_sdk.dart
+      ], (CompilerContext c) async {
+        CompileTask task =
+            new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
+        final kernelTarget = await task.buildOutline(null);
+        await kernelTarget.writeDepsFile(
+            new Uri.file(platform), new Uri.file(depfile));
+      });
+
+      // Read depfile generated by Fasta and append deps that we have collected
+      // during generation of patched_sdk to it.
+      // Note: we are splitting by ': ' because Windows paths can start with
+      // drive letter followed by a colon.
+      final list = new File(depfile).readAsStringSync().split(': ');
+      assert(list.length == 2);
+      deps.addAll(list[1].split(' ').where((str) => str.isNotEmpty));
+      assert(list[0] == path.join('patched_sdk', 'platform.dill'));
+      new File(depfile).writeAsStringSync("${list[0]}: ${deps.join(' ')}\n");
     }, zoneSpecification: new ZoneSpecification(print: (_, _2, _3, line) {
       capturedLines.add(line);
     }));
@@ -244,9 +298,8 @@
 /// in the Dart language. Since this feature is only for the convenience of
 /// writing the dart:* libraries, and not a tool given to Dart developers, it
 /// seems like a non-ideal situation. Instead we keep the preprocessing simple.
-List<String> _patchLibrary(String name,
-                           List<String> partsContents,
-                           String patchContents) {
+List<String> _patchLibrary(
+    String name, List<String> partsContents, String patchContents) {
   var results = <StringEditBuffer>[];
 
   // Parse the patch first. We'll need to extract bits of this as we go through
@@ -275,8 +328,13 @@
 }
 
 final String injectedCidFields = [
-  'Array', 'ExternalOneByteString', 'GrowableObjectArray',
-  'ImmutableArray', 'OneByteString', 'TwoByteString', 'Bigint'
+  'Array',
+  'ExternalOneByteString',
+  'GrowableObjectArray',
+  'ImmutableArray',
+  'OneByteString',
+  'TwoByteString',
+  'Bigint'
 ].map((name) => "static final int cid${name} = 0;").join('\n');
 
 /// Merge `@patch` declarations into `external` declarations.
@@ -302,8 +360,7 @@
     // make core libraries compile. Kernel reader will actually ignore these
     // fields and instead inject concrete constants into this class.
     if (node is ClassDeclaration && node.name.name == 'ClassID') {
-      code = code.replaceFirst(
-          new RegExp(r'}$'), injectedCidFields + '}');
+      code = code.replaceFirst(new RegExp(r'}$'), injectedCidFields + '}');
     }
     edits.insert(pos, '\n' + code);
   }
@@ -449,7 +506,8 @@
 
   var accessor = '';
   if (node is MethodDeclaration) {
-    if (node.isGetter) accessor = 'get:';
+    if (node.isGetter)
+      accessor = 'get:';
     else if (node.isSetter) accessor = 'set:';
   }
   return className + accessor + name;
diff --git a/tools/patch_sdk.py b/tools/patch_sdk.py
index 25e553e..212514a 100755
--- a/tools/patch_sdk.py
+++ b/tools/patch_sdk.py
@@ -48,7 +48,8 @@
     print >> sys.stderr, 'ERROR: cannot locate dart executable'
     return -1
   dart_file = os.path.join(os.path.dirname(__file__), 'patch_sdk.dart')
-  subprocess.check_call([options.dart_executable, dart_file] + args)
+  subprocess.check_call(
+      [options.dart_executable, '--checked', dart_file] + args)
   return 0
 
 if __name__ == '__main__':
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index b225c15..1f64f27 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -213,7 +213,7 @@
       CommandArtifact artifact) {
     List<String> args = [];
     if (useDFE) {
-      args.add('--dfe=utils/kernel-service/kernel-service.dart');
+      args.add('--dfe=${buildDir}/gen/kernel-service.dart.snapshot');
     }
     if (isChecked) {
       args.add('--enable_asserts');
