diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 1e00004..5c81b7b 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -690,16 +690,12 @@
   String get analyzerCode => _original.code.analyzerCode;
 
   SourceSpan get span {
-    var uri = _original.uri;
-    var offset = _original.charOffset;
-    if (offset == -1) {
-      if (uri == null) return null;
-      return new SourceLocation(0, sourceUrl: uri).pointSpan();
+    if (_original.charOffset == -1) {
+      if (_original.uri == null) return null;
+      return new SourceLocation(0, sourceUrl: _original.uri).pointSpan();
     }
-    return new SourceSpan(
-        new SourceLocation(offset, sourceUrl: uri),
-        new SourceLocation(offset + _original.length, sourceUrl: uri),
-        'X' * _original.length);
+    return new SourceLocation(_original.charOffset, sourceUrl: _original.uri)
+        .pointSpan();
   }
 
   _CompilationMessage(this._original, this.severity);
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index b6bad03..4f95542 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -63,9 +63,6 @@
 
   String get debugName => "ClassBuilder";
 
-  @override
-  bool get buildsArguments => true;
-
   /// Returns true if this class is the result of applying a mixin to its
   /// superclass.
   bool get isMixinApplication => mixedInType != null;
diff --git a/pkg/front_end/lib/src/fasta/builder/declaration.dart b/pkg/front_end/lib/src/fasta/builder/declaration.dart
index bc3f76b..d340033 100644
--- a/pkg/front_end/lib/src/fasta/builder/declaration.dart
+++ b/pkg/front_end/lib/src/fasta/builder/declaration.dart
@@ -26,12 +26,8 @@
 
   String get fullNameForErrors;
 
-  bool get buildsArguments => false;
-
   bool get hasProblem => false;
 
-  bool get hasTarget => false;
-
   bool get isConst => false;
 
   bool get isConstructor => false;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
index 5cd87e1..7abb3f3 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_alias_builder.dart
@@ -24,9 +24,6 @@
 
   String get debugName => "FunctionTypeAliasBuilder";
 
-  @override
-  bool get buildsArguments => true;
-
   LibraryBuilder get parent => super.parent;
 
   int get typeVariablesCount;
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 759c0f9..827fe5f 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -17,9 +17,6 @@
 
   MemberBuilder(this.parent, int charOffset) : super(parent, charOffset);
 
-  @override
-  bool get hasTarget => true;
-
   bool get isInstanceMember => isClassMember && !isStatic;
 
   bool get isClassMember => parent is ClassBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 08b77d8..4cf8c2a 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -10,8 +10,6 @@
         templateMissingExplicitTypeArguments,
         templateTypeArgumentMismatch;
 
-import '../source/outline_listener.dart';
-
 import 'builder.dart'
     show
         Declaration,
@@ -24,20 +22,13 @@
         TypeDeclarationBuilder;
 
 abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
-  final OutlineListener outlineListener;
   final Object name;
 
   List<T> arguments;
 
   TypeDeclarationBuilder<T, R> declaration;
 
-  /// If the number of [arguments] does not correspond to the number of
-  /// type parameters in the [declaration], semantically we should replace
-  /// [declaration] with [InvalidTypeBuilder]. But we still need to store
-  /// the original declaration into [outlineListener].
-  TypeDeclarationBuilder<T, R> actualDeclaration;
-
-  NamedTypeBuilder(this.outlineListener, this.name, this.arguments);
+  NamedTypeBuilder(this.name, this.arguments);
 
   InvalidTypeBuilder<T, R> buildInvalidType(int charOffset, Uri fileUri,
       [Message message]);
@@ -56,8 +47,6 @@
     if (name is QualifiedName) {
       Declaration prefix = scope.lookup(name.prefix, charOffset, fileUri);
       if (prefix is PrefixBuilder) {
-        outlineListener?.store(charOffset, false,
-            importIndex: prefix.importIndex);
         member = prefix.lookup(name.suffix, name.charOffset, fileUri);
       }
     } else {
@@ -82,7 +71,6 @@
   void check(int charOffset, Uri fileUri) {
     if (arguments != null &&
         arguments.length != declaration.typeVariablesCount) {
-      actualDeclaration = declaration;
       declaration = buildInvalidType(
           charOffset,
           fileUri,
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 c853c15..4f3acc7 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
@@ -16,9 +16,6 @@
       String name, this.bound, LibraryBuilder compilationUnit, int charOffset)
       : super(null, null, name, compilationUnit, charOffset);
 
-  @override
-  bool get hasTarget => true;
-
   bool get isTypeVariable => true;
 
   String get debugName => "TypeVariableBuilder";
diff --git a/pkg/front_end/lib/src/fasta/combinator.dart b/pkg/front_end/lib/src/fasta/combinator.dart
index 5dfcf91..9f97607 100644
--- a/pkg/front_end/lib/src/fasta/combinator.dart
+++ b/pkg/front_end/lib/src/fasta/combinator.dart
@@ -7,30 +7,15 @@
 class Combinator {
   final bool isShow;
 
-  final List<CombinatorIdentifier> identifiers;
-
   final Set<String> names;
 
-  Combinator(
-      this.isShow, this.identifiers, this.names, int charOffset, Uri fileUri);
+  Combinator(this.isShow, this.names, int charOffset, Uri fileUri);
 
-  Combinator.hide(List<CombinatorIdentifier> identifiers,
-      Iterable<String> names, int charOffset, Uri fileUri)
-      : this(false, identifiers, new Set<String>.from(names), charOffset,
-            fileUri);
+  Combinator.show(Iterable<String> names, int charOffset, Uri fileUri)
+      : this(true, new Set<String>.from(names), charOffset, fileUri);
 
-  Combinator.show(List<CombinatorIdentifier> identifiers,
-      Iterable<String> names, int charOffset, Uri fileUri)
-      : this(true, identifiers, new Set<String>.from(names), charOffset,
-            fileUri);
+  Combinator.hide(Iterable<String> names, int charOffset, Uri fileUri)
+      : this(false, new Set<String>.from(names), charOffset, fileUri);
 
   bool get isHide => !isShow;
 }
-
-class CombinatorIdentifier {
-  final int offset;
-  final String name;
-  final bool isSynthetic;
-
-  CombinatorIdentifier(this.offset, this.name, this.isSynthetic);
-}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index c440b0b..6c94030 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -65,9 +65,6 @@
   String get name => library.name;
 
   @override
-  bool get hasTarget => true;
-
-  @override
   Library get target => library;
 
   void becomeCoreLibrary(dynamicType) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index b7b8496..7b54cd3 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -30,9 +30,6 @@
 
   String get debugName => "DillMemberBuilder";
 
-  @override
-  bool get hasTarget => true;
-
   Member get target => member;
 
   String get name => member.name.name;
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 7855f44..7ad5957 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -6936,36 +6936,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsCouldBeNamed = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments: #count allowed, but #count2 found.""",
-    tipTemplate:
-        r"""Try removing the extra positional arguments or specifying the name for named arguments.""",
-    withArguments: _withArgumentsTooManyArgumentsCouldBeNamed);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsCouldBeNamed =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsCouldBeNamed", templateTooManyArgumentsCouldBeNamed,
-        analyzerCode: "EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED",
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsCouldBeNamed(int count, int count2) {
-  return new Message(codeTooManyArgumentsCouldBeNamed,
-      message:
-          """Too many positional arguments: ${count} allowed, but ${count2} found.""",
-      tip: """Try removing the extra positional arguments or specifying the name for named arguments.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTopLevelOperator = messageTopLevelOperator;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index c42bcec..0697cc1 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -472,10 +472,10 @@
             combinators ??= <Combinator>[];
 
             combinators.add(combinator.isShow
-                ? new Combinator.show(null, combinator.names,
-                    combinator.fileOffset, library.fileUri)
-                : new Combinator.hide(null, combinator.names,
-                    combinator.fileOffset, library.fileUri));
+                ? new Combinator.show(
+                    combinator.names, combinator.fileOffset, library.fileUri)
+                : new Combinator.hide(
+                    combinator.names, combinator.fileOffset, library.fileUri));
           }
 
           debugLibrary.addImport(
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 40d1b37..b560333 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -114,8 +114,6 @@
 
 import 'kernel_builder.dart';
 
-import 'kernel_expression_generator.dart' show KernelNonLValueGenerator;
-
 import 'type_algorithms.dart' show calculateBounds;
 
 // TODO(ahe): Remove this and ensure all nodes have a location.
@@ -644,8 +642,8 @@
     Initializer initializer;
     if (node is Initializer) {
       initializer = node;
-    } else if (node is DelayedAssignment) {
-      initializer = node.buildFieldInitializer();
+    } else if (node is Generator) {
+      initializer = node.buildFieldInitializer(initializedFields);
     } else if (node is ConstructorInvocation) {
       initializer = buildSuperInitializer(
           false, node.target, node.arguments, token.charOffset);
@@ -861,8 +859,7 @@
       } else if (resolvedTarget is Constructor &&
           resolvedTarget.enclosingClass.isAbstract) {
         replacementNode = evaluateArgumentsBefore(
-            forest.arguments(
-                invocation.arguments.positional, noLocation, noLocation,
+            forest.arguments(invocation.arguments.positional, null,
                 types: invocation.arguments.types,
                 named: invocation.arguments.named),
             buildAbstractClassInstantiationError(
@@ -883,8 +880,7 @@
               throwNoSuchMethodError(
                   forest.literalNull(null)..fileOffset = invocation.fileOffset,
                   errorName,
-                  forest.arguments(
-                      invocation.arguments.positional, noLocation, noLocation,
+                  forest.arguments(invocation.arguments.positional, null,
                       types: invocation.arguments.types,
                       named: invocation.arguments.named),
                   initialTarget.fileOffset));
@@ -902,8 +898,7 @@
 
           replacementNode = buildStaticInvocation(
               resolvedTarget,
-              forest.arguments(
-                  invocation.arguments.positional, noLocation, noLocation,
+              forest.arguments(invocation.arguments.positional, null,
                   types: invocation.arguments.types,
                   named: invocation.arguments.named),
               constness: invocation.isConst
@@ -1042,7 +1037,7 @@
       /// >unless the enclosing class is class Object.
       Constructor superTarget = lookupConstructor(emptyName, isSuper: true);
       Initializer initializer;
-      Arguments arguments = forest.argumentsEmpty(noLocation, noLocation);
+      Arguments arguments = forest.argumentsEmpty(noLocation);
       if (superTarget == null ||
           checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
@@ -1097,14 +1092,12 @@
         Expression argument = toValue(node);
         arguments[i] = argument;
         if (i > firstNamedArgumentIndex) {
-          arguments[i] = new NamedExpressionJudgment(
-              tokensSaver?.namedExpressionTokens(null, null),
-              '#$i',
+          arguments[i] = new NamedExpression(
+              "#$i",
               buildCompileTimeErrorExpression(
                   fasta.messageExpectedNamedArgument,
-                  forest.readOffset(argument)),
-              originalValue: argument)
-            ..fileOffset = offsetForToken(beginToken);
+                  forest.readOffset(argument)))
+            ..fileOffset = beginToken.charOffset;
         }
       }
     }
@@ -1113,12 +1106,11 @@
           arguments.getRange(0, firstNamedArgumentIndex));
       List<NamedExpression> named = new List<NamedExpression>.from(
           arguments.getRange(firstNamedArgumentIndex, arguments.length));
-      push(forest.arguments(positional, beginToken, endToken, named: named));
+      push(forest.arguments(positional, beginToken, named: named));
     } else {
       // TODO(kmillikin): Find a way to avoid allocating a second list in the
       // case where there were no named arguments, which is a common one.
-      push(forest.arguments(
-          new List<Expression>.from(arguments), beginToken, endToken));
+      push(forest.arguments(new List<Expression>.from(arguments), beginToken));
     }
   }
 
@@ -1138,7 +1130,7 @@
   @override
   void handleSend(Token beginToken, Token endToken) {
     debugEvent("Send");
-    ArgumentsJudgment arguments = pop();
+    Arguments arguments = pop();
     List<DartType> typeArguments = pop();
     Object receiver = pop();
     if (arguments != null && typeArguments != null) {
@@ -1163,7 +1155,7 @@
   }
 
   @override
-  finishSend(Object receiver, ArgumentsJudgment arguments, int charOffset) {
+  finishSend(Object receiver, Arguments arguments, int charOffset) {
     if (receiver is Generator) {
       return receiver.doInvocation(charOffset, arguments);
     } else {
@@ -1258,11 +1250,8 @@
           fasta.templateInvalidOperator.withArguments(token), token.charOffset,
           length: token.length);
     } else {
-      Expression result = buildMethodInvocation(
-          a,
-          new Name(operator),
-          forest.arguments(<Expression>[b], noLocation, noLocation),
-          token.charOffset,
+      Expression result = buildMethodInvocation(a, new Name(operator),
+          forest.arguments(<Expression>[b], noLocation), token.charOffset,
           // This *could* be a constant expression, we can't know without
           // evaluating [a] and [b].
           isConstantExpression: !isSuper,
@@ -1848,15 +1837,11 @@
       bool hasExpression, Token beginToken, Token endToken) {
     debugEvent("ReturnStatement");
     Expression expression = hasExpression ? popForValue() : null;
-    var statement = forest.returnStatement(beginToken, expression, endToken);
     if (expression != null && inConstructor) {
-      Expression error = buildCompileTimeError(
-          fasta.messageConstructorWithReturnType,
-          beginToken.charOffset,
-          lengthForToken(beginToken));
-      push(new InvalidStatementJudgment(error, statement));
+      push(buildCompileTimeErrorStatement(
+          fasta.messageConstructorWithReturnType, beginToken.charOffset));
     } else {
-      push(statement);
+      push(forest.returnStatement(beginToken, expression, endToken));
     }
   }
 
@@ -2041,15 +2026,16 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
-    Object lhs = pop();
-    Generator generator;
-    if (lhs is Generator) {
-      generator = lhs;
+    Object generator = pop();
+    if (generator is! Generator) {
+      push(new SyntheticExpressionJudgment(buildCompileTimeError(
+          fasta.messageNotAnLvalue,
+          offsetForToken(token),
+          lengthForToken(token))));
     } else {
-      generator = new KernelNonLValueGenerator(this, token, lhs);
+      push(new DelayedAssignment(
+          this, token, generator, value, token.stringValue));
     }
-    push(new DelayedAssignment(
-        this, token, generator, value, token.stringValue));
   }
 
   @override
@@ -2376,15 +2362,14 @@
     debugEvent("AsOperator");
     DartType type = pop();
     Expression expression = popForValue();
-    Expression error;
     if (constantContext != ConstantContext.none) {
-      error = buildCompileTimeError(
+      push(buildCompileTimeError(
           fasta.templateNotConstantExpression.withArguments('As expression'),
           operator.charOffset,
-          operator.length);
+          operator.length));
+    } else {
+      push(forest.asExpression(expression, type, operator));
     }
-    push(
-        forest.asExpression(expression, type, operator, desugaredError: error));
   }
 
   @override
@@ -2713,13 +2698,12 @@
       push(new SuperIndexedAccessGenerator(
           this,
           openSquareBracket,
-          closeSquareBracket,
           index,
           lookupInstanceMember(indexGetName, isSuper: true),
           lookupInstanceMember(indexSetName, isSuper: true)));
     } else {
-      push(IndexedAccessGenerator.make(this, openSquareBracket,
-          closeSquareBracket, toValue(receiver), index, null, null));
+      push(IndexedAccessGenerator.make(
+          this, openSquareBracket, toValue(receiver), index, null, null));
     }
   }
 
@@ -2755,7 +2739,7 @@
         }
       }
       push(buildMethodInvocation(receiverValue, new Name(operator),
-          forest.argumentsEmpty(noLocation, noLocation), token.charOffset,
+          forest.argumentsEmpty(noLocation), token.charOffset,
           // This *could* be a constant expression, we can't know without
           // evaluating [receiver].
           isConstantExpression: !isSuper,
@@ -2772,29 +2756,27 @@
   @override
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression");
-    Object target = pop();
-    Generator generator;
-    if (target is Generator) {
-      generator = target;
+    Object generator = pop();
+    if (generator is Generator) {
+      push(generator.buildPrefixIncrement(incrementOperator(token),
+          offset: token.charOffset));
     } else {
-      generator = new KernelNonLValueGenerator(this, token, toValue(target));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
-    push(generator.buildPrefixIncrement(incrementOperator(token),
-        offset: token.charOffset));
   }
 
   @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression");
-    Object target = pop();
-    Generator generator;
-    if (target is Generator) {
-      generator = target;
+    Object generator = pop();
+    if (generator is Generator) {
+      push(new DelayedPostfixIncrement(
+          this, token, generator, incrementOperator(token), null));
     } else {
-      generator = new KernelNonLValueGenerator(this, token, toValue(target));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
-    push(new DelayedPostfixIncrement(
-        this, token, generator, incrementOperator(token), null));
   }
 
   @override
@@ -2873,7 +2855,7 @@
   }
 
   @override
-  Expression buildStaticInvocation(Member target, ArgumentsJudgment arguments,
+  Expression buildStaticInvocation(Member target, Arguments arguments,
       {Constness constness: Constness.implicit,
       int charOffset: -1,
       int charLength: noLength,
@@ -2950,31 +2932,21 @@
   }
 
   @override
-  LocatedMessage checkArgumentsForFunction(
-      FunctionNode function,
-      ArgumentsJudgment arguments,
-      int offset,
-      List<TypeParameter> typeParameters) {
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters) {
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
-      var argsOffset = arguments.fileOffset;
-      var argsLength = arguments.fileEndOffset - argsOffset;
       return fasta.templateTooFewArguments
           .withArguments(function.requiredParameterCount,
               forest.argumentsPositional(arguments).length)
-          .withLocation(uri, argsOffset, argsLength);
+          .withLocation(uri, arguments.fileOffset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
         function.positionalParameters.length) {
-      var argsOffset = arguments.fileOffset;
-      var argsLength = arguments.fileEndOffset - argsOffset;
-      var template = function.namedParameters.isNotEmpty
-          ? fasta.templateTooManyArgumentsCouldBeNamed
-          : fasta.templateTooManyArguments;
-      return template
+      return fasta.templateTooManyArguments
           .withArguments(function.positionalParameters.length,
               forest.argumentsPositional(arguments).length)
-          .withLocation(uri, argsOffset, argsLength);
+          .withLocation(uri, arguments.fileOffset, noLength);
     }
     List<Object> named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
@@ -3004,27 +2976,20 @@
 
   @override
   LocatedMessage checkArgumentsForType(
-      FunctionType function, ArgumentsJudgment arguments, int offset) {
+      FunctionType function, Arguments arguments, int offset) {
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
-      var argsOffset = arguments.fileOffset;
-      var argsLength = arguments.fileEndOffset - argsOffset;
       return fasta.templateTooFewArguments
           .withArguments(function.requiredParameterCount,
               forest.argumentsPositional(arguments).length)
-          .withLocation(uri, argsOffset, argsLength);
+          .withLocation(uri, arguments.fileOffset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
         function.positionalParameters.length) {
-      var argsOffset = arguments.fileOffset;
-      var argsLength = arguments.fileEndOffset - argsOffset;
-      var template = function.namedParameters.isNotEmpty
-          ? fasta.templateTooManyArgumentsCouldBeNamed
-          : fasta.templateTooManyArguments;
-      return template
+      return fasta.templateTooManyArguments
           .withArguments(function.positionalParameters.length,
               forest.argumentsPositional(arguments).length)
-          .withLocation(uri, argsOffset, argsLength);
+          .withLocation(uri, arguments.fileOffset, noLength);
     }
     List<Object> named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
@@ -3182,7 +3147,7 @@
               target.function.typeParameters.length !=
                   forest.argumentsTypeArguments(arguments).length) {
             arguments = forest.arguments(
-                forest.argumentsPositional(arguments), noLocation, noLocation,
+                forest.argumentsPositional(arguments), null,
                 named: forest.argumentsNamed(arguments),
                 types: new List<DartType>.filled(
                     target.function.typeParameters.length, const DynamicType(),
@@ -4099,10 +4064,9 @@
 
   @override
   Expression buildCompileTimeErrorExpression(Message message, int offset,
-      {int length, Expression original}) {
+      {int length}) {
     return new SyntheticExpressionJudgment(
-        buildCompileTimeError(message, offset, length ?? noLength),
-        original: original);
+        buildCompileTimeError(message, offset, length ?? noLength));
   }
 
   Expression wrapInCompileTimeError(Expression expression, Message message,
@@ -4140,21 +4104,19 @@
       {List<LocatedMessage> context}) {
     // TODO(askesc): Produce explicit error expression wrapping the original.
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
-    return new SyntheticExpressionJudgment(
-        new Let(
-            new VariableDeclaration.forValue(new SyntheticExpressionJudgment(
-                buildCompileTimeError(
-                    message.messageObject, message.charOffset, message.length,
-                    context: context)))
-              ..fileOffset = forest.readOffset(expression),
-            new Let(
-                new VariableDeclaration.forValue(expression)
-                  ..fileOffset = forest.readOffset(expression),
-                forest.literalNull(null)
-                  ..fileOffset = forest.readOffset(expression))
-              ..fileOffset = forest.readOffset(expression))
+    return new SyntheticExpressionJudgment(new Let(
+        new VariableDeclaration.forValue(new SyntheticExpressionJudgment(
+            buildCompileTimeError(
+                message.messageObject, message.charOffset, message.length,
+                context: context)))
           ..fileOffset = forest.readOffset(expression),
-        original: expression);
+        new Let(
+            new VariableDeclaration.forValue(expression)
+              ..fileOffset = forest.readOffset(expression),
+            forest.literalNull(null)
+              ..fileOffset = forest.readOffset(expression))
+          ..fileOffset = forest.readOffset(expression))
+      ..fileOffset = forest.readOffset(expression));
   }
 
   Expression buildFallThroughError(int charOffset) {
@@ -4172,7 +4134,7 @@
           forest.literalString("${location?.file ?? uri}", null)
             ..fileOffset = charOffset,
           forest.literalInt(location?.line ?? 0, null)..fileOffset = charOffset,
-        ], noLocation, noLocation),
+        ], noLocation),
         charOffset: charOffset));
   }
 
@@ -4187,7 +4149,7 @@
         constructor.target,
         forest.arguments(<Expression>[
           forest.literalString(className, null)..fileOffset = charOffset
-        ], noLocation, noLocation)));
+        ], noLocation)));
   }
 
   Statement buildCompileTimeErrorStatement(Message message, int charOffset,
@@ -4207,16 +4169,6 @@
   }
 
   @override
-  Initializer buildInvalidFieldInitializer(int offset, bool isSynthetic,
-      Node target, Expression value, Expression error) {
-    needsImplicitSuperInitializer = false;
-    return new ShadowInvalidFieldInitializer(
-        target, value, new VariableDeclaration.forValue(error))
-      ..fileOffset = offset
-      ..isSynthetic = isSynthetic;
-  }
-
-  @override
   Initializer buildInvalidInitializer(Expression expression,
       [int charOffset = -1]) {
     needsImplicitSuperInitializer = false;
@@ -4290,7 +4242,7 @@
                 constructor.target,
                 forest.arguments(<Expression>[
                   forest.literalString(name, null)..fileOffset = offset
-                ], noLocation, noLocation),
+                ], noLocation),
                 charOffset: offset))))
           ..fileOffset = offset;
       } else {
@@ -4314,17 +4266,12 @@
           ..isSynthetic = isSynthetic;
       }
     } else {
-      builder ??= classBuilder.scope.setters[name];
-      var error = buildCompileTimeError(
-          fasta.templateInitializerForStaticField.withArguments(name),
-          offset,
-          name.length);
-      return buildInvalidFieldInitializer(
-          offset,
-          isSynthetic,
-          builder != null && builder.hasTarget ? builder.target : null,
-          expression,
-          error);
+      return buildInvalidInitializer(
+          buildCompileTimeError(
+              fasta.templateInitializerForStaticField.withArguments(name),
+              offset,
+              name.length),
+          offset);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ec87044..d60a3a8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -64,17 +64,14 @@
 import 'kernel_ast_api.dart'
     show
         Arguments,
-        ArgumentsJudgment,
         DartType,
         DynamicType,
         Expression,
-        IllegalAssignmentJudgment,
         Initializer,
         InvalidConstructorInvocationJudgment,
         InvalidType,
         Member,
         Name,
-        Node,
         Procedure,
         StaticInvocationJudgment,
         SyntheticExpressionJudgment,
@@ -120,8 +117,7 @@
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
-  Expression buildAssignment(Expression value,
-      {bool voidContext, int offset: -1});
+  Expression buildAssignment(Expression value, {bool voidContext});
 
   /// Returns a [Expression] representing a null-aware assignment (`??=`) with
   /// the generator on the LHS and [value] on the RHS.
@@ -196,16 +192,16 @@
 
   Expression buildForEffect() => buildSimpleRead();
 
-  Node get fieldInitializerTarget => null;
-
-  Expression buildFieldInitializerError() {
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
     int offset = offsetForToken(token);
-    return helper.buildCompileTimeError(
-        messageInvalidInitializer, offset, lengthForToken(token));
+    return helper.buildInvalidInitializer(
+        new SyntheticExpressionJudgment(helper.buildCompileTimeError(
+            messageInvalidInitializer, offset, lengthForToken(token))),
+        offset);
   }
 
   /* Expression | Generator | Initializer */ doInvocation(
-      int offset, ArgumentsJudgment arguments);
+      int offset, Arguments arguments);
 
   /* Expression | Generator */ buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
@@ -376,30 +372,28 @@
 abstract class IndexedAccessGenerator implements Generator {
   factory IndexedAccessGenerator.internal(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token token,
       Expression receiver,
       Expression index,
       Procedure getter,
       Procedure setter) {
-    return helper.forest.indexedAccessGenerator(helper, openSquareBracket,
-        closeSquareBracket, receiver, index, getter, setter);
+    return helper.forest
+        .indexedAccessGenerator(helper, token, receiver, index, getter, setter);
   }
 
   static Generator make(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token token,
       Expression receiver,
       Expression index,
       Procedure getter,
       Procedure setter) {
     if (helper.forest.isThisExpression(receiver)) {
       return new ThisIndexedAccessGenerator(
-          helper, openSquareBracket, closeSquareBracket, index, getter, setter);
+          helper, token, index, getter, setter);
     } else {
-      return new IndexedAccessGenerator.internal(helper, openSquareBracket,
-          closeSquareBracket, receiver, index, getter, setter);
+      return new IndexedAccessGenerator.internal(
+          helper, token, receiver, index, getter, setter);
     }
   }
 
@@ -416,15 +410,10 @@
 /// Special case of [IndexedAccessGenerator] to avoid creating an indirect
 /// access to 'this'.
 abstract class ThisIndexedAccessGenerator implements Generator {
-  factory ThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
-    return helper.forest.thisIndexedAccessGenerator(
-        helper, openSquareBracket, closeSquareBracket, index, getter, setter);
+  factory ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Expression index, Procedure getter, Procedure setter) {
+    return helper.forest
+        .thisIndexedAccessGenerator(helper, token, index, getter, setter);
   }
 
   @override
@@ -438,15 +427,10 @@
 }
 
 abstract class SuperIndexedAccessGenerator implements Generator {
-  factory SuperIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
-      Expression index,
-      Member getter,
-      Member setter) {
-    return helper.forest.superIndexedAccessGenerator(
-        helper, openSquareBracket, closeSquareBracket, index, getter, setter);
+  factory SuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Expression index, Member getter, Member setter) {
+    return helper.forest
+        .superIndexedAccessGenerator(helper, token, index, getter, setter);
   }
 
   String get plainNameForRead => "[]";
@@ -763,8 +747,9 @@
   withReceiver(Object receiver, int operatorOffset, {bool isNullAware}) => this;
 
   @override
-  Expression buildFieldInitializerError() {
-    return buildError(forest.argumentsEmpty(token, token), isSetter: true);
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    return helper.buildInvalidInitializer(new SyntheticExpressionJudgment(
+        buildError(forest.argumentsEmpty(token), isSetter: true)));
   }
 
   @override
@@ -781,10 +766,9 @@
   }
 
   @override
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return new SyntheticExpressionJudgment(buildError(
-        forest.arguments(<Expression>[value], token, token),
+        forest.arguments(<Expression>[value], token),
         isSetter: true));
   }
 
@@ -796,7 +780,7 @@
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
     return new SyntheticExpressionJudgment(buildError(
-        forest.arguments(<Expression>[value], token, token),
+        forest.arguments(<Expression>[value], token),
         isGetter: true));
   }
 
@@ -806,7 +790,6 @@
     var error = buildError(
         forest.arguments(
             <Expression>[forest.literalInt(1, null)..fileOffset = offset],
-            token,
             token),
         isGetter: true);
     return new UnresolvedVariableUnaryJudgment(
@@ -820,7 +803,6 @@
     var error = buildError(
         forest.arguments(
             <Expression>[forest.literalInt(1, null)..fileOffset = offset],
-            token,
             token),
         isGetter: true);
     return new UnresolvedVariableUnaryJudgment(
@@ -833,22 +815,22 @@
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
     return new SyntheticExpressionJudgment(buildError(
-        forest.arguments(<Expression>[value], token, token),
+        forest.arguments(<Expression>[value], token),
         isSetter: true));
   }
 
   @override
   Expression buildSimpleRead() => new SyntheticExpressionJudgment(
-      buildError(forest.argumentsEmpty(token, token), isGetter: true));
+      buildError(forest.argumentsEmpty(token), isGetter: true));
 
   @override
   Expression makeInvalidRead() => new SyntheticExpressionJudgment(
-      buildError(forest.argumentsEmpty(token, token), isGetter: true));
+      buildError(forest.argumentsEmpty(token), isGetter: true));
 
   @override
   Expression makeInvalidWrite(Expression value) {
     return new SyntheticExpressionJudgment(buildError(
-        forest.arguments(<Expression>[value], token, token),
+        forest.arguments(<Expression>[value], token),
         isSetter: true));
   }
 
@@ -941,16 +923,15 @@
   }
 
   @override
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
-    return buildInvalidAssignment(value, offset);
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return makeInvalidWrite(value);
   }
 
   @override
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    return buildInvalidAssignment(value, offset);
+    return makeInvalidWrite(value);
   }
 
   @override
@@ -960,34 +941,19 @@
       Procedure interfaceTarget,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    return buildInvalidAssignment(value, offset);
+    return makeInvalidWrite(value);
   }
 
   @override
   Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    return buildInvalidAssignment(
-        forest.literalInt(1, null, isSynthetic: true), offset);
+    return makeInvalidWrite(null);
   }
 
   @override
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    return buildInvalidAssignment(
-        forest.literalInt(1, null, isSynthetic: true), offset);
-  }
-
-  Expression buildInvalidAssignment(Expression value, int offset) {
-    var lhs = buildSimpleRead();
-    // The lhs expression needs to have a parent so that type inference can be
-    // applied to it, but it doesn't matter what the parent is because the
-    // lhs expression won't appear in the tree.  So just give it a quick and
-    // dirty parent.
-    new VariableDeclaration.forValue(lhs);
-
-    return new IllegalAssignmentJudgment(value,
-        assignmentOffset: offset, desugared: makeInvalidWrite(value))
-      ..write = lhs;
+    return makeInvalidWrite(null);
   }
 
   @override
@@ -1028,26 +994,13 @@
   }
 
   Expression handleAssignment(bool voidContext) {
-    var assignment = makeAssignmentExpression(voidContext);
     if (helper.constantContext != ConstantContext.none) {
-      // The assignment needs to have a parent so that type inference can be
-      // applied to it, but it doesn't matter what the parent is because the
-      // assignment won't appear in the tree.  So just give it a quick and dirty
-      // parent.
-      new VariableDeclaration.forValue(assignment);
-
       return helper.buildCompileTimeErrorExpression(
           messageNotAConstantExpression, offsetForToken(token),
-          length: token.length, original: assignment);
-    } else {
-      return assignment;
+          length: token.length);
     }
-  }
-
-  Expression makeAssignmentExpression(bool voidContext) {
     if (identical("=", assignmentOperator)) {
-      return generator.buildAssignment(value,
-          voidContext: voidContext, offset: token.offset);
+      return generator.buildAssignment(value, voidContext: voidContext);
     } else if (identical("+=", assignmentOperator)) {
       return generator.buildCompoundAssignment(plusName, value,
           offset: offsetForToken(token), voidContext: voidContext);
@@ -1091,15 +1044,11 @@
     }
   }
 
-  Initializer buildFieldInitializer() {
+  @override
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
     if (!identical("=", assignmentOperator) ||
         !generator.isThisPropertyAccess) {
-      return helper.buildInvalidFieldInitializer(
-          offsetForToken(token),
-          false,
-          generator.fieldInitializerTarget,
-          value,
-          generator.buildFieldInitializerError());
+      return generator.buildFieldInitializer(initializedFields);
     }
     return helper.buildFieldInitializer(
         false, generator.plainNameForRead, offsetForToken(token), value);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index af00914..d50dd58 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -27,7 +27,6 @@
 import 'kernel_ast_api.dart'
     show
         Arguments,
-        ArgumentsJudgment,
         Constructor,
         DartType,
         Expression,
@@ -71,22 +70,19 @@
   scopeLookup(Scope scope, String name, Token token,
       {bool isQualified: false, PrefixBuilder prefix});
 
-  finishSend(Object receiver, ArgumentsJudgment arguments, int offset);
+  finishSend(Object receiver, Arguments arguments, int offset);
 
   Expression buildCompileTimeError(Message message, int charOffset, int length,
       {List<LocatedMessage> context});
 
   Expression buildCompileTimeErrorExpression(Message message, int offset,
-      {int length, Expression original});
+      {int length});
 
   Expression wrapInCompileTimeError(Expression expression, Message message);
 
   Expression wrapInProblem(Expression expression, Message message, int length,
       {List<LocatedMessage> context});
 
-  Initializer buildInvalidFieldInitializer(int offset, bool isSynthetic,
-      Node target, Expression value, Expression error);
-
   Initializer buildInvalidInitializer(Expression expression, [int offset]);
 
   Initializer buildFieldInitializer(
@@ -101,8 +97,7 @@
       Constructor constructor, Arguments arguments,
       [int charOffset = -1]);
 
-  Expression buildStaticInvocation(
-      Procedure target, ArgumentsJudgment arguments,
+  Expression buildStaticInvocation(Procedure target, Arguments arguments,
       {Constness constness, int charOffset, Expression error});
 
   Expression buildProblemExpression(
@@ -117,14 +112,11 @@
       bool isStatic,
       LocatedMessage argMessage});
 
-  LocatedMessage checkArgumentsForFunction(
-      FunctionNode function,
-      ArgumentsJudgment arguments,
-      int offset,
-      List<TypeParameter> typeParameters);
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters);
 
   LocatedMessage checkArgumentsForType(
-      FunctionType function, ArgumentsJudgment arguments, int offset);
+      FunctionType function, Arguments arguments, int offset);
 
   StaticGet makeStaticGet(Member readTarget, Token token);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 42e8892..6e147a8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -35,7 +35,7 @@
         VariableDeclaration,
         setParents;
 
-import '../parser.dart' show endOffsetForToken, offsetForToken, optional;
+import '../parser.dart' show offsetForToken, optional;
 
 import '../problems.dart' show unsupported;
 
@@ -132,17 +132,15 @@
   Fangorn(this.typeInferenceTokensSaver);
 
   @override
-  ArgumentsJudgment arguments(
-      List<Expression> positional, Token beginToken, Token endToken,
+  ArgumentsJudgment arguments(List<Expression> positional, Token token,
       {List<DartType> types, List<NamedExpression> named}) {
-    return new ArgumentsJudgment(
-        offsetForToken(beginToken), endOffsetForToken(endToken), positional,
-        types: types, named: named);
+    return new ArgumentsJudgment(positional, types: types, named: named)
+      ..fileOffset = offsetForToken(token);
   }
 
   @override
-  ArgumentsJudgment argumentsEmpty(Token beginToken, Token endToken) {
-    return arguments(<Expression>[], beginToken, endToken);
+  ArgumentsJudgment argumentsEmpty(Token token) {
+    return arguments(<Expression>[], token);
   }
 
   @override
@@ -183,11 +181,9 @@
   }
 
   @override
-  IntJudgment literalInt(int value, Token token,
-      {Expression desugaredError, bool isSynthetic: false}) {
+  IntJudgment literalInt(int value, Token token) {
     return new IntJudgment(
-        typeInferenceTokensSaver?.intLiteralTokens(token), value,
-        desugaredError: desugaredError, isSynthetic: isSynthetic)
+        typeInferenceTokensSaver?.intLiteralTokens(token), value)
       ..fileOffset = offsetForToken(token);
   }
 
@@ -291,11 +287,9 @@
   }
 
   @override
-  Expression asExpression(Expression expression, covariant type, Token token,
-      {Expression desugaredError}) {
+  Expression asExpression(Expression expression, covariant type, Token token) {
     return new AsJudgment(
-        expression, typeInferenceTokensSaver?.asExpressionTokens(token), type,
-        desugaredError: desugaredError)
+        expression, typeInferenceTokensSaver?.asExpressionTokens(token), type)
       ..fileOffset = offsetForToken(token);
   }
 
@@ -790,38 +784,35 @@
   @override
   KernelIndexedAccessGenerator indexedAccessGenerator(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token token,
       Expression receiver,
       Expression index,
       Procedure getter,
       Procedure setter) {
-    return new KernelIndexedAccessGenerator.internal(helper, openSquareBracket,
-        closeSquareBracket, receiver, index, getter, setter);
+    return new KernelIndexedAccessGenerator.internal(
+        helper, token, receiver, index, getter, setter);
   }
 
   @override
   KernelThisIndexedAccessGenerator thisIndexedAccessGenerator(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token token,
       Expression index,
       Procedure getter,
       Procedure setter) {
     return new KernelThisIndexedAccessGenerator(
-        helper, openSquareBracket, closeSquareBracket, index, getter, setter);
+        helper, token, index, getter, setter);
   }
 
   @override
   KernelSuperIndexedAccessGenerator superIndexedAccessGenerator(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token token,
       Expression index,
       Member getter,
       Member setter) {
     return new KernelSuperIndexedAccessGenerator(
-        helper, openSquareBracket, closeSquareBracket, index, getter, setter);
+        helper, token, index, getter, setter);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 2e029e5..b66c371 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -48,13 +48,10 @@
 abstract class Forest {
   const Forest();
 
-  /// [beginToken] is the opening `(`.
-  /// [endToken] is the closing `)`.
-  Arguments arguments(
-      List<Expression> positional, Token beginToken, Token endToken,
+  Arguments arguments(List<Expression> positional, Token location,
       {covariant List types, covariant List named});
 
-  Arguments argumentsEmpty(Token beginToken, Token endToken);
+  Arguments argumentsEmpty(Token location);
 
   List argumentsNamed(Arguments arguments);
 
@@ -76,8 +73,7 @@
 
   /// Return a representation of an integer literal at the given [location]. The
   /// literal has the given [value].
-  Expression literalInt(int value, Token location,
-      {Expression desugaredError, bool isSynthetic: false});
+  Expression literalInt(int value, Token location);
 
   /// Return a representation of a list literal. The [constKeyword] is the
   /// location of the `const` keyword, or `null` if there is no keyword. The
@@ -166,8 +162,8 @@
 
   Expression checkLibraryIsLoaded(covariant dependency);
 
-  Expression asExpression(Expression expression, covariant type, Token location,
-      {Expression desugaredError});
+  Expression asExpression(
+      Expression expression, covariant type, Token location);
 
   /// Return a representation of an assert that appears in a constructor's
   /// initializer list.
@@ -394,28 +390,17 @@
 
   Generator indexedAccessGenerator(
       ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
+      Token location,
       Expression receiver,
       Expression index,
       Procedure getter,
       Procedure setter);
 
-  Generator thisIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
-      Expression index,
-      Procedure getter,
-      Procedure setter);
+  Generator thisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Expression index, Procedure getter, Procedure setter);
 
-  Generator superIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token openSquareBracket,
-      Token closeSquareBracket,
-      Expression index,
-      Member getter,
-      Member setter);
+  Generator superIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Expression index, Member getter, Member setter);
 
   Generator staticAccessGenerator(ExpressionGeneratorHelper helper,
       Token location, Member getter, Member setter);
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 d46c89c..acb1b8b 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
@@ -116,9 +116,6 @@
 
   Class get cls;
 
-  @override
-  bool get hasTarget => true;
-
   Class get target => cls;
 
   Class get actualCls;
@@ -220,13 +217,14 @@
     Set<ClassBuilder> implemented = new Set<ClassBuilder>();
     for (KernelTypeBuilder type in interfaces) {
       if (type is KernelNamedTypeBuilder) {
+        int charOffset = -1; // TODO(ahe): Get offset from type.
         Declaration decl = type.declaration;
         if (decl is ClassBuilder) {
           ClassBuilder interface = decl;
           if (superClass == interface) {
             addCompileTimeError(
                 templateImplementsSuperClass.withArguments(interface.name),
-                type.charOffset,
+                charOffset,
                 noLength);
           } else if (implemented.contains(interface)) {
             // Aggregate repetitions.
@@ -235,9 +233,9 @@
             problems[interface] += 1;
 
             problemsOffsets ??= new Map<ClassBuilder, int>();
-            problemsOffsets[interface] ??= type.charOffset;
+            problemsOffsets[interface] ??= charOffset;
           } else if (interface.target == coreTypes.futureOrClass) {
-            addCompileTimeError(messageImplementsFutureOr, type.charOffset,
+            addCompileTimeError(messageImplementsFutureOr, charOffset,
                 interface.target.name.length);
           } else {
             implemented.add(interface);
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 a245bb8..60288dd 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
@@ -99,19 +99,16 @@
     constantNamesAndOffsetsAndDocs ??= const <Object>[];
     // TODO(ahe): These types shouldn't be looked up in scope, they come
     // directly from dart:core.
-    KernelTypeBuilder intType =
-        new KernelNamedTypeBuilder(null, -1, "int", null);
-    KernelTypeBuilder stringType =
-        new KernelNamedTypeBuilder(null, -1, "String", null);
+    KernelTypeBuilder intType = new KernelNamedTypeBuilder("int", null);
+    KernelTypeBuilder stringType = new KernelNamedTypeBuilder("String", null);
     KernelNamedTypeBuilder objectType =
-        new KernelNamedTypeBuilder(null, -1, "Object", null);
+        new KernelNamedTypeBuilder("Object", null);
     ShadowClass cls = new ShadowClass(name: name);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
-    KernelNamedTypeBuilder selfType =
-        new KernelNamedTypeBuilder(null, -1, name, null);
-    KernelTypeBuilder listType = new KernelNamedTypeBuilder(
-        null, -1, "List", <KernelTypeBuilder>[selfType]);
+    KernelNamedTypeBuilder selfType = new KernelNamedTypeBuilder(name, null);
+    KernelTypeBuilder listType =
+        new KernelNamedTypeBuilder("List", <KernelTypeBuilder>[selfType]);
 
     /// metadata class E {
     ///   final int index;
@@ -164,15 +161,15 @@
         charEndOffset);
     members["toString"] = toStringBuilder;
     String className = name;
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 5) {
-      List<MetadataBuilder> metadata = constantNamesAndOffsetsAndDocs[i + 1];
-      String name = constantNamesAndOffsetsAndDocs[i + 2];
-      int charOffset = constantNamesAndOffsetsAndDocs[i + 3];
-      String documentationComment = constantNamesAndOffsetsAndDocs[i + 4];
+    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
+      List<MetadataBuilder> metadata = constantNamesAndOffsetsAndDocs[i];
+      String name = constantNamesAndOffsetsAndDocs[i + 1];
+      int charOffset = constantNamesAndOffsetsAndDocs[i + 2];
+      String documentationComment = constantNamesAndOffsetsAndDocs[i + 3];
       if (members.containsKey(name)) {
         parent.addCompileTimeError(templateDuplicatedName.withArguments(name),
             charOffset, noLength, parent.fileUri);
-        constantNamesAndOffsetsAndDocs[i + 2] = null;
+        constantNamesAndOffsetsAndDocs[i + 1] = null;
         continue;
       }
       if (name == className) {
@@ -181,7 +178,7 @@
             charOffset,
             noLength,
             parent.fileUri);
-        constantNamesAndOffsetsAndDocs[i + 2] = null;
+        constantNamesAndOffsetsAndDocs[i + 1] = null;
         continue;
       }
       KernelFieldBuilder fieldBuilder = new KernelFieldBuilder(
@@ -253,8 +250,8 @@
     toStringBuilder.body = new ReturnStatement(
         new DirectPropertyGet(new ThisExpression(), nameField));
     List<Expression> values = <Expression>[];
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 5) {
-      String name = constantNamesAndOffsetsAndDocs[i + 2];
+    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
+      String name = constantNamesAndOffsetsAndDocs[i + 1];
       if (name != null) {
         KernelFieldBuilder builder = this[name];
         values.add(new StaticGet(builder.build(libraryBuilder)));
@@ -291,8 +288,8 @@
             ..parent = constructor);
     }
     int index = 0;
-    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 5) {
-      String constant = constantNamesAndOffsetsAndDocs[i + 2];
+    for (int i = 0; i < constantNamesAndOffsetsAndDocs.length; i += 4) {
+      String constant = constantNamesAndOffsetsAndDocs[i + 1];
       if (constant != null) {
         KernelFieldBuilder field = this[constant];
         field.build(libraryBuilder);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 004ea06..82944ef 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -75,7 +75,6 @@
 
 import 'kernel_ast_api.dart'
     show
-        ArgumentsJudgment,
         ComplexAssignmentJudgment,
         Constructor,
         DartType,
@@ -142,8 +141,7 @@
   }
 
   @override
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     var complexAssignment = startComplexAssignment(value);
     return _finish(_makeSimpleWrite(value, voidContext, complexAssignment),
         complexAssignment);
@@ -200,8 +198,8 @@
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
       Procedure interfaceTarget}) {
-    return buildCompoundAssignment(binaryOperator,
-        forest.literalInt(1, null, isSynthetic: true)..fileOffset = offset,
+    return buildCompoundAssignment(
+        binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
         offset: offset,
         voidContext: voidContext,
         interfaceTarget: interfaceTarget,
@@ -214,8 +212,8 @@
       bool voidContext: false,
       Procedure interfaceTarget}) {
     if (voidContext) {
-      return buildCompoundAssignment(binaryOperator,
-          forest.literalInt(1, null, isSynthetic: true)..fileOffset = offset,
+      return buildCompoundAssignment(
+          binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
           offset: offset,
           voidContext: voidContext,
           interfaceTarget: interfaceTarget,
@@ -242,7 +240,7 @@
     return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
         forest.literalNull(token),
         plainNameForRead,
-        forest.argumentsEmpty(noLocation, noLocation),
+        forest.argumentsEmpty(noLocation),
         offsetForToken(token),
         isGetter: true));
   }
@@ -252,7 +250,7 @@
     return buildInvalidWriteJudgment(helper.throwNoSuchMethodError(
         forest.literalNull(token),
         plainNameForRead,
-        forest.arguments(<Expression>[value], noLocation, noLocation),
+        forest.arguments(<Expression>[value], noLocation),
         offsetForToken(token),
         isSetter: true));
   }
@@ -502,8 +500,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new PropertyAssignmentJudgment(null, rhs,
-          isSyntheticLhs: token.isSynthetic);
+      new PropertyAssignmentJudgment(null, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -693,10 +690,6 @@
 
 class KernelIndexedAccessGenerator extends KernelGenerator
     with IndexedAccessGenerator {
-  final Token openSquareBracket;
-
-  final Token closeSquareBracket;
-
   final Expression receiver;
 
   final Expression index;
@@ -709,15 +702,9 @@
 
   VariableDeclaration indexVariable;
 
-  KernelIndexedAccessGenerator.internal(
-      ExpressionGeneratorHelper helper,
-      this.openSquareBracket,
-      this.closeSquareBracket,
-      this.receiver,
-      this.index,
-      this.getter,
-      this.setter)
-      : super(helper, openSquareBracket);
+  KernelIndexedAccessGenerator.internal(ExpressionGeneratorHelper helper,
+      Token token, this.receiver, this.index, this.getter, this.setter)
+      : super(helper, token);
 
   Expression indexAccess() {
     indexVariable ??= new VariableDeclaration.forValue(index);
@@ -734,11 +721,8 @@
 
   @override
   Expression _makeSimpleRead() {
-    var read = new MethodInvocationJudgment(
-        receiver,
-        indexGetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index], openSquareBracket, closeSquareBracket)),
+    var read = new MethodInvocationJudgment(receiver, indexGetName,
+        forest.castArguments(forest.arguments(<Expression>[index], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     return read;
@@ -751,8 +735,8 @@
     var write = new MethodInvocationJudgment(
         receiver,
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index, value], openSquareBracket, closeSquareBracket)),
+        forest
+            .castArguments(forest.arguments(<Expression>[index, value], token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -764,8 +748,8 @@
     var read = new MethodInvocationJudgment(
         receiverAccess(),
         indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[indexAccess()],
-            openSquareBracket, closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess()], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -779,10 +763,8 @@
     var write = new MethodInvocationJudgment(
         receiverAccess(),
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), value],
-            openSquareBracket,
-            closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess(), value], token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -801,8 +783,7 @@
         indexSetName,
         forest.castArguments(forest.arguments(
             <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            openSquareBracket,
-            closeSquareBracket)),
+            token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -854,10 +835,6 @@
 
 class KernelThisIndexedAccessGenerator extends KernelGenerator
     with ThisIndexedAccessGenerator {
-  final Token openSquareBracket;
-
-  final Token closeSquareBracket;
-
   final Expression index;
 
   final Procedure getter;
@@ -866,14 +843,9 @@
 
   VariableDeclaration indexVariable;
 
-  KernelThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      this.openSquareBracket,
-      this.closeSquareBracket,
-      this.index,
-      this.getter,
-      this.setter)
-      : super(helper, openSquareBracket);
+  KernelThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.index, this.getter, this.setter)
+      : super(helper, token);
 
   Expression indexAccess() {
     indexVariable ??= new VariableDeclaration.forValue(index);
@@ -888,8 +860,7 @@
         indexSetName,
         forest.castArguments(forest.arguments(
             <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            openSquareBracket,
-            closeSquareBracket)),
+            token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -903,8 +874,7 @@
     return new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexGetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index], openSquareBracket, closeSquareBracket)),
+        forest.castArguments(forest.arguments(<Expression>[index], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
   }
@@ -916,8 +886,8 @@
     var write = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index, value], openSquareBracket, closeSquareBracket)),
+        forest
+            .castArguments(forest.arguments(<Expression>[index, value], token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -929,8 +899,8 @@
     var read = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[indexAccess()],
-            openSquareBracket, closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess()], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -944,10 +914,8 @@
     var write = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), value],
-            openSquareBracket,
-            closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess(), value], token)),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -987,10 +955,6 @@
 
 class KernelSuperIndexedAccessGenerator extends KernelGenerator
     with SuperIndexedAccessGenerator {
-  final Token openSquareBracket;
-
-  final Token closeSquareBracket;
-
   final Expression index;
 
   final Member getter;
@@ -999,14 +963,9 @@
 
   VariableDeclaration indexVariable;
 
-  KernelSuperIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      this.openSquareBracket,
-      this.closeSquareBracket,
-      this.index,
-      this.getter,
-      this.setter)
-      : super(helper, openSquareBracket);
+  KernelSuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.index, this.getter, this.setter)
+      : super(helper, token);
 
   Expression indexAccess() {
     indexVariable ??= new VariableDeclaration.forValue(index);
@@ -1024,8 +983,7 @@
         indexSetName,
         forest.castArguments(forest.arguments(
             <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            openSquareBracket,
-            closeSquareBracket)),
+            token)),
         setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -1041,10 +999,8 @@
           isSuper: true);
     }
     // TODO(ahe): Use [DirectMethodInvocation] when possible.
-    return new SuperMethodInvocationJudgment(
-        indexGetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index], openSquareBracket, closeSquareBracket)),
+    return new SuperMethodInvocationJudgment(indexGetName,
+        forest.castArguments(forest.arguments(<Expression>[index], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
   }
@@ -1059,8 +1015,8 @@
     }
     var write = new SuperMethodInvocation(
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[index, value], openSquareBracket, closeSquareBracket)),
+        forest
+            .castArguments(forest.arguments(<Expression>[index, value], token)),
         setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -1075,8 +1031,8 @@
     }
     var read = new SuperMethodInvocation(
         indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[indexAccess()],
-            openSquareBracket, closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess()], token)),
         getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -1093,10 +1049,8 @@
     }
     var write = new SuperMethodInvocation(
         indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), value],
-            openSquareBracket,
-            closeSquareBracket)),
+        forest.castArguments(
+            forest.arguments(<Expression>[indexAccess(), value], token)),
         setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -1149,9 +1103,6 @@
         super(helper, token);
 
   @override
-  Node get fieldInitializerTarget => readTarget;
-
-  @override
   String get plainNameForRead => (readTarget ?? writeTarget).name.name;
 
   @override
@@ -1191,7 +1142,7 @@
   }
 
   @override
-  Expression doInvocation(int offset, ArgumentsJudgment arguments) {
+  Expression doInvocation(int offset, Arguments arguments) {
     Expression error;
     if (helper.constantContext != ConstantContext.none &&
         !helper.isIdentical(readTarget)) {
@@ -1321,51 +1272,32 @@
   @override
   Expression get expression {
     if (super.expression == null) {
-      super.expression = computeExpression();
+      int offset = offsetForToken(token);
+      if (declaration is KernelInvalidTypeBuilder) {
+        KernelInvalidTypeBuilder declaration = this.declaration;
+        helper.addProblemErrorIfConst(
+            declaration.message.messageObject, offset, token.length);
+        super.expression = new SyntheticExpressionJudgment(
+            new Throw(forest.literalString(declaration.message.message, token))
+              ..fileOffset = offset);
+      } else {
+        super.expression = forest.literalType(
+            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
+            token);
+      }
     }
     return super.expression;
   }
 
-  Expression computeExpression({bool silent: false}) {
-    int offset = offsetForToken(token);
-    if (declaration is KernelInvalidTypeBuilder) {
-      KernelInvalidTypeBuilder declaration = this.declaration;
-      if (!silent) {
-        helper.addProblemErrorIfConst(
-            declaration.message.messageObject, offset, token.length);
-      }
-      return new UnresolvedVariableGetJudgment(
-          new Throw(forest.literalString(declaration.message.message, token))
-            ..fileOffset = offset,
-          token.isSynthetic)
-        ..fileOffset = offset;
-    } else {
-      return forest.literalType(
-          buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
-          token);
-    }
-  }
-
-  @override
-  Node get fieldInitializerTarget =>
-      declaration.hasTarget ? declaration.target : null;
-
   @override
   Expression makeInvalidWrite(Expression value) {
-    var read = computeExpression(silent: true);
-    // The read needs to have a parent so that type inference can be applied to
-    // it, but it doesn't mater what the parent is because the final read won't
-    // appear in the tree.  So just give it a quick and dirty parent.
-    new VariableDeclaration.forValue(read);
-
-    var throwExpr = helper.throwNoSuchMethodError(
+    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
         forest.literalNull(token),
         plainNameForRead,
-        forest.arguments(<Expression>[value], noLocation, noLocation)
+        forest.arguments(<Expression>[value], null)
           ..fileOffset = value.fileOffset,
         offsetForToken(token),
-        isSetter: true);
-    return new SyntheticExpressionJudgment(throwExpr, original: read);
+        isSetter: true));
   }
 
   @override
@@ -1495,30 +1427,23 @@
       : super(helper, token);
 
   @override
-  Expression _makeSimpleRead() {
-    return _buildErrorIntLiteral();
-  }
+  Expression _makeSimpleRead() => new SyntheticExpressionJudgment(buildError());
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    return _buildErrorIntLiteral();
+    return new SyntheticExpressionJudgment(buildError());
   }
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    return _buildErrorIntLiteral();
+    return new SyntheticExpressionJudgment(buildError());
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    return _buildErrorIntLiteral();
-  }
-
-  Expression _buildErrorIntLiteral() {
-    var error = buildError();
-    return forest.literalInt(0, token, desugaredError: error);
+    return new SyntheticExpressionJudgment(buildError());
   }
 }
 
@@ -1532,8 +1457,7 @@
       : super(helper, token);
 
   @override
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return _buildUnresolvedVariableAssignment(false, value);
   }
 
@@ -1549,8 +1473,7 @@
 
   @override
   Expression buildSimpleRead() {
-    Expression error =
-        buildError(forest.argumentsEmpty(token, token), isGetter: true);
+    Expression error = buildError(forest.argumentsEmpty(token), isGetter: true);
     return new UnresolvedVariableGetJudgment(error, token.isSynthetic)
       ..fileOffset = token.charOffset;
   }
@@ -1574,12 +1497,10 @@
   UnresolvedVariableAssignmentJudgment _buildUnresolvedVariableAssignment(
       bool isCompound, Expression value) {
     return new UnresolvedVariableAssignmentJudgment(
-        buildError(forest.arguments(<Expression>[value], token, token),
-            isSetter: true),
-        isCompound,
-        value,
-        token.isSynthetic)
-      ..fileOffset = token.charOffset;
+      buildError(forest.arguments(<Expression>[value], token), isSetter: true),
+      isCompound,
+      value,
+    )..fileOffset = token.charOffset;
   }
 }
 
@@ -1599,8 +1520,7 @@
         super(helper, token);
 
   @override
-  Expression buildAssignment(Expression value,
-      {bool voidContext, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext}) {
     return new PropertySet(receiver, name, value)
       ..fileOffset = offsetForToken(token);
   }
@@ -1705,9 +1625,9 @@
   return new MethodInvocationJudgment(
       left,
       operator,
-      helper.forest.castArguments(
-          helper.forest.arguments(<Expression>[right], noLocation, noLocation))
-        ..fileOffset = offset,
+      helper.forest
+          .castArguments(helper.forest.arguments(<Expression>[right], null))
+            ..fileOffset = offset,
       interfaceTarget: interfaceTarget)
     ..fileOffset = offset;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index c9cfbf9..5905d5d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -36,7 +36,8 @@
   Expression buildSimpleRead() {
     if (!isSuper) {
       if (inFieldInitializer) {
-        return buildFieldInitializerError();
+        return new SyntheticExpressionJudgment(
+            buildFieldInitializerError(null));
       } else {
         return forest.thisExpression(token);
       }
@@ -48,14 +49,18 @@
     }
   }
 
-  @override
-  Expression buildFieldInitializerError() {
+  Expression buildFieldInitializerError(Map<String, int> initializedFields) {
     String keyword = isSuper ? "super" : "this";
-    int offset = offsetForToken(token);
-    return helper.buildCompileTimeErrorExpression(
+    return helper.buildCompileTimeError(
         templateThisOrSuperAccessInFieldInitializer.withArguments(keyword),
-        offset,
-        length: keyword.length);
+        offsetForToken(token),
+        keyword.length);
+  }
+
+  @override
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    Expression error = buildFieldInitializerError(initializedFields);
+    return helper.buildInvalidInitializer(error, error.fileOffset);
   }
 
   buildPropertyAccess(
@@ -71,7 +76,7 @@
       return buildConstructorInitializer(offset, name, arguments);
     }
     if (inFieldInitializer && !isInitializer) {
-      return buildFieldInitializerError();
+      return new SyntheticExpressionJudgment(buildFieldInitializerError(null));
     }
     Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
     if (send is SendAccessGenerator) {
@@ -135,8 +140,7 @@
     }
   }
 
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return buildAssignmentError();
   }
 
@@ -230,7 +234,7 @@
 
   @override
   Expression buildSimpleRead() {
-    var error = buildError(forest.argumentsEmpty(token, token), isGetter: true);
+    var error = buildError(forest.argumentsEmpty(token), isGetter: true);
     return new InvalidPropertyGetJudgment(error, member)
       ..fileOffset = offsetForToken(token);
   }
@@ -261,8 +265,7 @@
     return unsupported("buildSimpleRead", offsetForToken(token), uri);
   }
 
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return unsupported("buildAssignment", offsetForToken(token), uri);
   }
 
@@ -333,8 +336,7 @@
     return unsupported("buildSimpleRead", offsetForToken(token), uri);
   }
 
-  Expression buildAssignment(Expression value,
-      {bool voidContext: false, int offset: -1}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return unsupported("buildAssignment", offsetForToken(token), uri);
   }
 
@@ -379,26 +381,6 @@
   }
 }
 
-class KernelNonLValueGenerator extends KernelReadOnlyAccessGenerator {
-  KernelNonLValueGenerator(
-      ExpressionGeneratorHelper helper, Token token, Expression expression)
-      : super(helper, token, expression, null);
-
-  String get debugName => "KernelNonLValueGenerator";
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
-    return new IllegalAssignmentJudgment(rhs,
-        assignmentOffset: offsetForToken(token));
-  }
-
-  Expression makeInvalidWrite(Expression value) {
-    var error = helper.buildCompileTimeError(
-        messageNotAnLvalue, offsetForToken(token), lengthForToken(token));
-    return new InvalidWriteJudgment(error, expression);
-  }
-}
-
 class ParenthesizedExpressionGenerator extends KernelReadOnlyAccessGenerator {
   ParenthesizedExpressionGenerator(
       ExpressionGeneratorHelper helper, Token token, Expression expression)
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 516bb9b..e2b769e 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
@@ -85,9 +85,6 @@
     return field;
   }
 
-  @override
-  bool get hasTarget => true;
-
   Field get target => field;
 
   @override
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 3cf6839..5646641 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
@@ -33,9 +33,6 @@
       : super(metadata, modifiers, type, name, hasThis, compilationUnit,
             charOffset);
 
-  @override
-  bool get hasTarget => true;
-
   VariableDeclarationJudgment get target => declaration;
 
   VariableDeclarationJudgment build(SourceLibraryBuilder library) {
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 077758d..5e62f6b 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
@@ -35,7 +35,6 @@
 
 class KernelFunctionTypeAliasBuilder
     extends FunctionTypeAliasBuilder<KernelFunctionTypeBuilder, DartType> {
-  final bool hasTarget = true;
   final Typedef target;
 
   DartType thisType;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
index 9a86218..2dbf686 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
@@ -17,8 +17,6 @@
 
 import '../problems.dart' show unsupported;
 
-import '../source/outline_listener.dart';
-
 import 'kernel_builder.dart'
     show
         FormalParameterBuilder,
@@ -32,12 +30,7 @@
 
 class KernelFunctionTypeBuilder extends FunctionTypeBuilder
     implements KernelTypeBuilder {
-  final OutlineListener outlineListener;
-  final int charOffset;
-
   KernelFunctionTypeBuilder(
-      this.outlineListener,
-      this.charOffset,
       KernelTypeBuilder returnType,
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals)
@@ -71,12 +64,10 @@
         typeParameters.add(t.parameter);
       }
     }
-    var type = new FunctionType(positionalParameters, builtReturnType,
+    return new FunctionType(positionalParameters, builtReturnType,
         namedParameters: namedParameters ?? const <NamedType>[],
         typeParameters: typeParameters ?? const <TypeParameter>[],
         requiredParameterCount: requiredParameterCount);
-    outlineListener?.store(charOffset, false, type: type);
-    return type;
   }
 
   Supertype buildSupertype(
@@ -108,11 +99,7 @@
       clonedFormals[i] = formals[i].clone(newTypes);
     }
     KernelFunctionTypeBuilder newType = new KernelFunctionTypeBuilder(
-        outlineListener,
-        charOffset,
-        returnType.clone(newTypes),
-        clonedTypeVariables,
-        clonedFormals);
+        returnType.clone(newTypes), clonedTypeVariables, clonedFormals);
     newTypes.add(newType);
     return newType;
   }
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 d8d6de6..88a029a 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
@@ -158,9 +158,6 @@
   KernelLibraryBuilder get origin => actualOrigin ?? this;
 
   @override
-  bool get hasTarget => true;
-
-  @override
   Library get target => library;
 
   Uri get uri => library.importUri;
@@ -177,10 +174,7 @@
 
   KernelTypeBuilder addNamedType(
       Object name, List<KernelTypeBuilder> arguments, int charOffset) {
-    return addType(
-        new KernelNamedTypeBuilder(
-            outlineListener, charOffset, name, arguments),
-        charOffset);
+    return addType(new KernelNamedTypeBuilder(name, arguments), charOffset);
   }
 
   KernelTypeBuilder addMixinApplication(KernelTypeBuilder supertype,
@@ -206,9 +200,7 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      int supertypeOffset,
-      int codeStartOffset,
-      int codeEndOffset) {
+      int supertypeOffset) {
     // Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
     var declaration = endNestedDeclaration(className)
       ..resolveTypes(typeVariables, this);
@@ -242,8 +234,6 @@
         charEndOffset);
     loader.target.metadataCollector
         ?.setDocumentationComment(cls.target, documentationComment);
-    loader.target.metadataCollector
-        ?.setCodeStartEnd(cls.target, codeStartOffset, codeEndOffset);
 
     constructorReferences.clear();
     Map<String, TypeVariableBuilder> typeVariablesByName =
@@ -316,9 +306,7 @@
       String name,
       List<TypeVariableBuilder> typeVariables,
       int modifiers,
-      List<KernelTypeBuilder> interfaces,
-      int codeStartOffset,
-      int codeEndOffset}) {
+      List<KernelTypeBuilder> interfaces}) {
     if (name == null) {
       // The following parameters should only be used when building a named
       // mixin application.
@@ -498,8 +486,6 @@
         if (isNamedMixinApplication) {
           loader.target.metadataCollector?.setDocumentationComment(
               application.target, documentationComment);
-          loader.target.metadataCollector?.setCodeStartEnd(
-              application.target, codeStartOffset, codeEndOffset);
         }
         // TODO(ahe, kmillikin): Should always be true?
         // pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart can't
@@ -523,9 +509,7 @@
       int modifiers,
       KernelTypeBuilder mixinApplication,
       List<KernelTypeBuilder> interfaces,
-      int charOffset,
-      int codeStartOffset,
-      int codeEndOffset) {
+      int charOffset) {
     // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
     endNestedDeclaration(name).resolveTypes(typeVariables, this);
     KernelNamedTypeBuilder supertype = applyMixins(
@@ -535,9 +519,7 @@
         name: name,
         typeVariables: typeVariables,
         modifiers: modifiers,
-        interfaces: interfaces,
-        codeStartOffset: codeStartOffset,
-        codeEndOffset: codeEndOffset);
+        interfaces: interfaces);
     checkTypeVariables(typeVariables, supertype.declaration);
   }
 
@@ -549,19 +531,13 @@
       KernelTypeBuilder type,
       String name,
       int charOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer) {
     var builder = new KernelFieldBuilder(metadata, type, name, modifiers, this,
         charOffset, initializerTokenForInference, hasInitializer);
     addBuilder(name, builder, charOffset);
-
-    var metadataCollector = loader.target.metadataCollector;
-    metadataCollector?.setDocumentationComment(
-        builder.target, documentationComment);
-    metadataCollector?.setCodeStartEnd(
-        builder.target, codeStartOffset, codeEndOffset);
+    loader.target.metadataCollector
+        ?.setDocumentationComment(builder.target, documentationComment);
   }
 
   void addConstructor(
@@ -577,8 +553,6 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       String nativeMethodName) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     ProcedureBuilder procedure = new KernelConstructorBuilder(
@@ -597,8 +571,6 @@
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
     metadataCollector?.setConstructorNameOffset(procedure.target, name);
-    metadataCollector?.setCodeStartEnd(
-        procedure.target, codeStartOffset, codeEndOffset);
     checkTypeVariables(typeVariables, procedure);
     addBuilder(constructorName, procedure, charOffset);
     if (nativeMethodName != null) {
@@ -620,8 +592,6 @@
       int charOpenParenOffset,
       int charEndOffset,
       String nativeMethodName,
-      int codeStartOffset,
-      int codeEndOffset,
       {bool isTopLevel}) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     ProcedureBuilder procedure = new KernelProcedureBuilder(
@@ -640,8 +610,6 @@
         nativeMethodName);
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
-    metadataCollector?.setCodeStartEnd(
-        procedure.target, codeStartOffset, codeEndOffset);
     checkTypeVariables(typeVariables, procedure);
     addBuilder(name, procedure, charOffset);
     if (nativeMethodName != null) {
@@ -660,8 +628,6 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       String nativeMethodName) {
     KernelTypeBuilder returnType = addNamedType(
         currentDeclaration.parent.name, <KernelTypeBuilder>[], charOffset);
@@ -720,8 +686,6 @@
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
     metadataCollector?.setConstructorNameOffset(procedure.target, name);
-    metadataCollector?.setCodeStartEnd(
-        procedure.target, codeStartOffset, codeEndOffset);
 
     DeclarationBuilder<TypeBuilder> savedDeclaration = currentDeclaration;
     currentDeclaration = factoryDeclaration;
@@ -781,8 +745,8 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       int charOffset) {
-    var builder = new KernelFunctionTypeBuilder(
-        outlineListener, charOffset, returnType, typeVariables, formals);
+    var builder =
+        new KernelFunctionTypeBuilder(returnType, typeVariables, formals);
     checkTypeVariables(typeVariables, null);
     // Nested declaration began in `OutlineBuilder.beginFunctionType` or
     // `OutlineBuilder.beginFunctionTypedFormalParameter`.
@@ -875,7 +839,6 @@
     // This is required for the DietListener to correctly match up metadata.
     int importIndex = 0;
     int exportIndex = 0;
-    MetadataCollector metadataCollector = loader.target.metadataCollector;
     while (importIndex < imports.length || exportIndex < exports.length) {
       if (exportIndex >= exports.length ||
           (importIndex < imports.length &&
@@ -890,18 +853,15 @@
           continue;
         }
 
-        LibraryDependency dependency;
         if (import.deferred && import.prefixBuilder?.dependency != null) {
-          dependency = import.prefixBuilder.dependency;
+          library.addDependency(import.prefixBuilder.dependency);
         } else {
-          dependency = new LibraryDependency.import(import.imported.target,
+          library.addDependency(new LibraryDependency.import(
+              import.imported.target,
               name: import.prefix,
               combinators: toKernelCombinators(import.combinators))
-            ..fileOffset = import.charOffset;
+            ..fileOffset = import.charOffset);
         }
-        library.addDependency(dependency);
-        metadataCollector?.setImportPrefixOffset(
-            dependency, import.prefixCharOffset);
       } else {
         // Add export
         Export export = exports[exportIndex++];
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 82b8297..4c3e69c 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
@@ -4,15 +4,13 @@
 
 library fasta.kernel_interface_type_builder;
 
-import 'package:kernel/ast.dart' show DartType, InvalidType, Supertype;
+import 'package:kernel/ast.dart' show DartType, Supertype;
 
 import '../fasta_codes.dart' show Message;
 
 import '../messages.dart'
     show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
 
-import '../source/outline_listener.dart';
-
 import 'kernel_builder.dart'
     show
         KernelClassBuilder,
@@ -20,7 +18,6 @@
         KernelTypeBuilder,
         LibraryBuilder,
         NamedTypeBuilder,
-        QualifiedName,
         TypeBuilder,
         TypeDeclarationBuilder,
         TypeVariableBuilder;
@@ -28,11 +25,8 @@
 class KernelNamedTypeBuilder
     extends NamedTypeBuilder<KernelTypeBuilder, DartType>
     implements KernelTypeBuilder {
-  final int charOffset;
-
-  KernelNamedTypeBuilder(OutlineListener outlineListener, this.charOffset,
-      Object name, List<KernelTypeBuilder> arguments)
-      : super(outlineListener, name, arguments);
+  KernelNamedTypeBuilder(Object name, List<KernelTypeBuilder> arguments)
+      : super(name, arguments);
 
   KernelInvalidTypeBuilder buildInvalidType(int charOffset, Uri fileUri,
       [Message message]) {
@@ -52,28 +46,22 @@
   }
 
   DartType build(LibraryBuilder library) {
-    DartType type = declaration.buildType(library, arguments);
-    _storeType(library, type);
-    return type;
+    return declaration.buildType(library, arguments);
   }
 
   Supertype buildSupertype(
       LibraryBuilder library, int charOffset, Uri fileUri) {
     TypeDeclarationBuilder declaration = this.declaration;
     if (declaration is KernelClassBuilder) {
-      var supertype = declaration.buildSupertype(library, arguments);
-      _storeType(library, supertype.asInterfaceType);
-      return supertype;
+      return declaration.buildSupertype(library, arguments);
     } else if (declaration is KernelInvalidTypeBuilder) {
       library.addCompileTimeError(
           declaration.message.messageObject,
           declaration.message.charOffset,
           declaration.message.length,
           declaration.message.uri);
-      _storeType(library, const InvalidType());
       return null;
     } else {
-      _storeType(library, const InvalidType());
       return handleInvalidSupertype(library, charOffset, fileUri);
     }
   }
@@ -82,19 +70,15 @@
       LibraryBuilder library, int charOffset, Uri fileUri) {
     TypeDeclarationBuilder declaration = this.declaration;
     if (declaration is KernelClassBuilder) {
-      var supertype = declaration.buildMixedInType(library, arguments);
-      _storeType(library, supertype.asInterfaceType);
-      return supertype;
+      return declaration.buildMixedInType(library, arguments);
     } else if (declaration is KernelInvalidTypeBuilder) {
       library.addCompileTimeError(
           declaration.message.messageObject,
           declaration.message.charOffset,
           declaration.message.length,
           declaration.message.uri);
-      _storeType(library, const InvalidType());
       return null;
     } else {
-      _storeType(library, const InvalidType());
       return handleInvalidSupertype(library, charOffset, fileUri);
     }
   }
@@ -116,9 +100,7 @@
         i++;
       }
       if (arguments != null) {
-        return new KernelNamedTypeBuilder(
-            outlineListener, charOffset, name, arguments)
-          ..bind(declaration);
+        return new KernelNamedTypeBuilder(name, arguments)..bind(declaration);
       }
     }
     return this;
@@ -132,34 +114,9 @@
         clonedArguments[i] = arguments[i].clone(newTypes);
       }
     }
-    KernelNamedTypeBuilder newType = new KernelNamedTypeBuilder(
-        outlineListener, charOffset, name, clonedArguments);
+    KernelNamedTypeBuilder newType =
+        new KernelNamedTypeBuilder(name, clonedArguments);
     newTypes.add(newType);
     return newType;
   }
-
-  int get _storeOffset {
-    // TODO(scheglov) Can we always make charOffset the "suffix" offset?
-    var name = this.name;
-    return name is QualifiedName ? name.charOffset : charOffset;
-  }
-
-  void _storeType(LibraryBuilder library, DartType type) {
-    if (outlineListener != null) {
-      if (arguments != null && !this.declaration.buildsArguments) {
-        for (var argument in arguments) {
-          argument.build(library);
-        }
-      }
-      TypeDeclarationBuilder<KernelTypeBuilder, DartType> storeDeclaration;
-      if (actualDeclaration != null) {
-        storeDeclaration = actualDeclaration;
-        type = storeDeclaration.buildType(library, null);
-      } else {
-        storeDeclaration = declaration;
-      }
-      var target = storeDeclaration.hasTarget ? storeDeclaration.target : null;
-      outlineListener.store(_storeOffset, false, reference: target, type: type);
-    }
-  }
 }
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 06b3f80..c9fd115 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
@@ -485,9 +485,6 @@
     return super.buildFunction(library)..returnType = const VoidType();
   }
 
-  @override
-  bool get hasTarget => true;
-
   Constructor get target => origin.constructor;
 
   void injectInvalidInitializer(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index c6ab5e4..8bf8245 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -178,22 +178,16 @@
 
 /// Concrete shadow object representing a set of invocation arguments.
 class ArgumentsJudgment extends Arguments {
-  /// The end offset of the closing `)`.
-  final int fileEndOffset;
-
   bool _hasExplicitTypeArguments;
 
   List<ExpressionJudgment> get positionalJudgments => positional.cast();
 
   List<NamedExpressionJudgment> get namedJudgments => named.cast();
 
-  ArgumentsJudgment(
-      int fileOffset, this.fileEndOffset, List<Expression> positional,
+  ArgumentsJudgment(List<Expression> positional,
       {List<DartType> types, List<NamedExpression> named})
       : _hasExplicitTypeArguments = types != null && types.isNotEmpty,
-        super(positional, types: types, named: named) {
-    this.fileOffset = fileOffset;
-  }
+        super(positional, types: types, named: named);
 
   static void setNonInferrableArgumentTypes(
       ArgumentsJudgment arguments, List<DartType> types) {
@@ -211,12 +205,10 @@
 /// Shadow object for [AsExpression].
 class AsJudgment extends AsExpression implements ExpressionJudgment {
   final AsExpressionTokens tokens;
-  final Expression desugaredError;
 
   DartType inferredType;
 
-  AsJudgment(Expression operand, this.tokens, DartType type,
-      {this.desugaredError})
+  AsJudgment(Expression operand, this.tokens, DartType type)
       : super(operand, type);
 
   ExpressionJudgment get judgment => operand;
@@ -229,10 +221,6 @@
     inferredType = type;
     inferrer.listener
         .asExpression(this, fileOffset, null, tokens, null, inferredType);
-    if (desugaredError != null) {
-      parent.replaceChild(this, desugaredError);
-      parent = null;
-    }
     return null;
   }
 }
@@ -561,8 +549,7 @@
   /// pre-decrement.
   bool isPreIncDec = false;
 
-  ComplexAssignmentJudgment(this.rhs, {Expression desugared})
-      : super(desugared);
+  ComplexAssignmentJudgment(this.rhs) : super(null);
 
   String toString() {
     var parts = _getToStringParts();
@@ -1004,7 +991,7 @@
   @override
   InferenceNode inferenceNode;
 
-  ShadowTypeInferrer typeInferrer;
+  ShadowTypeInferrer _typeInferrer;
 
   final bool _isImplicitlyTyped;
 
@@ -1491,9 +1478,8 @@
   /// If `-1`, then there is no separate location for invalid assignment.
   final int assignmentOffset;
 
-  IllegalAssignmentJudgment(ExpressionJudgment rhs,
-      {this.assignmentOffset: -1, Expression desugared})
-      : super(rhs, desugared: desugared) {
+  IllegalAssignmentJudgment(ExpressionJudgment rhs, {this.assignmentOffset: -1})
+      : super(rhs) {
     rhs.parent = this;
   }
 
@@ -1605,8 +1591,8 @@
       _storeLetType(inferrer, replacedRead, readType);
     }
     var inferredResult = _inferRhs(inferrer, readType, writeContext);
-    inferrer.listener.indexAssign(this, write.fileOffset, receiverType,
-        writeMember, inferredResult.combiner, inferredType);
+    inferrer.listener.indexAssign(this, write.fileOffset, writeMember,
+        inferredResult.combiner, inferredType);
     _replaceWithDesugared();
     return null;
   }
@@ -1624,27 +1610,16 @@
 /// Concrete shadow object representing an integer literal in kernel form.
 class IntJudgment extends IntLiteral implements ExpressionJudgment {
   IntLiteralTokens tokens;
-  final kernel.Expression desugaredError;
-  final bool isSynthetic;
 
   DartType inferredType;
 
-  IntJudgment(this.tokens, int value,
-      {this.desugaredError, this.isSynthetic: false})
-      : super(value);
+  IntJudgment(this.tokens, int value) : super(value);
 
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer, DartType typeContext) {
     inferredType = inferrer.coreTypes.intClass.rawType;
-    if (!isSynthetic) {
-      inferrer.listener
-          .intLiteral(this, fileOffset, tokens, value, inferredType);
-    }
-    if (desugaredError != null) {
-      parent.replaceChild(this, desugaredError);
-      parent = null;
-    }
+    inferrer.listener.intLiteral(this, fileOffset, tokens, value, inferredType);
     return null;
   }
 }
@@ -1665,7 +1640,7 @@
 /// Concrete shadow object representing an invalid initializer in kernel form.
 class ShadowInvalidFieldInitializer extends LocalInitializer
     implements InitializerJudgment {
-  final Node field;
+  final Field field;
   final Expression value;
 
   ShadowInvalidFieldInitializer(
@@ -1679,9 +1654,7 @@
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer) {
-    var field = this.field;
-    var typeContext = field is Field ? field.type : const UnknownType();
-    inferrer.inferExpression(value, typeContext, false);
+    inferrer.inferExpression(value, field.type, false);
     inferrer.listener.fieldInitializer(
         this, fileOffset, null, null, null, null, null, field);
   }
@@ -2240,11 +2213,10 @@
   /// If this assignment uses null-aware access (`?.`), the conditional
   /// expression that guards the access; otherwise `null`.
   ConditionalExpression nullAwareGuard;
-  final bool isSyntheticLhs;
 
   PropertyAssignmentJudgment(
       ExpressionJudgment receiver, ExpressionJudgment rhs,
-      {bool isSuper: false, this.isSyntheticLhs: false})
+      {bool isSuper: false})
       : super(receiver, rhs, isSuper);
 
   @override
@@ -2294,8 +2266,6 @@
     inferrer.listener.propertyAssign(
         this,
         write.fileOffset,
-        isSyntheticLhs,
-        receiverType,
         inferrer.getRealTarget(writeMember),
         writeContext,
         inferredResult.combiner,
@@ -2804,7 +2774,7 @@
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer, DartType typeContext) {
-    inferrer.listener.variableAssign(this, fileOffset, false, _variable.type,
+    inferrer.listener.variableAssign(this, fileOffset, _variable.type,
         _variable.createBinder(inferrer), null, _variable.type);
     return super.infer(inferrer, typeContext);
   }
@@ -2844,7 +2814,7 @@
       ShadowTypeInferrer inferrer, DartType typeContext) {
     var inferredType = member?.getterType ?? const DynamicType();
     inferrer.listener
-        .propertyGet(this, fileOffset, false, null, member, inferredType);
+        .propertyGet(this, fileOffset, false, member, inferredType);
     return super.infer(inferrer, typeContext);
   }
 }
@@ -2855,13 +2825,9 @@
 /// These expressions are removed by type inference and replaced with their
 /// desugared equivalents.
 class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
-  /// The original expression that is wrapped by this synthetic expression.
-  /// Its type will be inferred.
-  final Expression original;
-
   DartType inferredType;
 
-  SyntheticExpressionJudgment(Expression desugared, {this.original})
+  SyntheticExpressionJudgment(Expression desugared)
       : super(new VariableDeclaration('_', initializer: new NullLiteral()),
             desugared);
 
@@ -2876,9 +2842,6 @@
   @override
   Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer, DartType typeContext) {
-    if (original != null) {
-      inferrer.inferExpression(original, typeContext, true);
-    }
     _replaceWithDesugared();
     inferredType = const DynamicType();
     return null;
@@ -3090,13 +3053,13 @@
       TypeInferenceListener<int, Node, int> listener,
       InterfaceType thisType,
       ShadowField field) {
-    return field.typeInferrer = new ShadowTypeInferrer._(
+    return field._typeInferrer = new ShadowTypeInferrer._(
         this, field.fileUri, listener, true, thisType, null);
   }
 
   @override
   ShadowTypeInferrer getFieldTypeInferrer(ShadowField field) {
-    return field.typeInferrer;
+    return field._typeInferrer;
   }
 }
 
@@ -3324,7 +3287,6 @@
     inferrer.listener.variableAssign(
         this,
         write.fileOffset,
-        false,
         writeContext,
         write is VariableSet
             ? (write.variable as VariableDeclarationJudgment)
@@ -3508,10 +3470,9 @@
 class UnresolvedVariableAssignmentJudgment extends SyntheticExpressionJudgment {
   final bool isCompound;
   final ExpressionJudgment rhs;
-  final bool isSyntheticLhs;
 
-  UnresolvedVariableAssignmentJudgment(kernel.Expression desugared,
-      this.isCompound, this.rhs, this.isSyntheticLhs)
+  UnresolvedVariableAssignmentJudgment(
+      kernel.Expression desugared, this.isCompound, this.rhs)
       : super(desugared);
 
   @override
@@ -3519,8 +3480,8 @@
       ShadowTypeInferrer inferrer, DartType typeContext) {
     inferrer.inferExpression(rhs, const UnknownType(), true);
     inferredType = isCompound ? const DynamicType() : rhs.inferredType;
-    inferrer.listener.variableAssign(this, fileOffset, isSyntheticLhs,
-        const DynamicType(), null, null, inferredType);
+    inferrer.listener.variableAssign(
+        this, fileOffset, const DynamicType(), null, null, inferredType);
     return super.infer(inferrer, typeContext);
   }
 }
@@ -3541,7 +3502,7 @@
     inferrer.listener.variableGet(
         this, offset, isSynthetic, false, null, const DynamicType());
     inferrer.listener.variableAssign(
-        this, fileOffset, false, const DynamicType(), null, null, inferredType);
+        this, fileOffset, const DynamicType(), null, null, inferredType);
     return super.infer(inferrer, typeContext);
   }
 }
@@ -3734,17 +3695,10 @@
 
 /// Concrete shadow object representing a named expression.
 class NamedExpressionJudgment extends NamedExpression {
-  final NamedExpressionTokens tokens;
+  NamedExpressionTokens tokens;
 
-  /// The original value that is wrapped by this synthetic named argument.
-  /// Its type will be inferred.
-  final Expression originalValue;
-
-  NamedExpressionJudgment(this.tokens, String nameLexeme, Expression value,
-      {this.originalValue})
-      : super(nameLexeme, value) {
-    originalValue?.parent = this;
-  }
+  NamedExpressionJudgment(this.tokens, String nameLexeme, Expression value)
+      : super(nameLexeme, value);
 
   ExpressionJudgment get judgment => value;
 }
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 0715e41..35f6e2a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -119,14 +119,12 @@
 
   final List<LocatedMessage> errors = <LocatedMessage>[];
 
-  final TypeBuilder dynamicType =
-      new KernelNamedTypeBuilder(null, -1, "dynamic", null);
+  final TypeBuilder dynamicType = new KernelNamedTypeBuilder("dynamic", null);
 
   final NamedTypeBuilder objectType =
-      new KernelNamedTypeBuilder(null, -1, "Object", null);
+      new KernelNamedTypeBuilder("Object", null);
 
-  final TypeBuilder bottomType =
-      new KernelNamedTypeBuilder(null, -1, "Null", null);
+  final TypeBuilder bottomType = new KernelNamedTypeBuilder("Null", null);
 
   bool get strongMode => backendTarget.strongMode;
 
@@ -219,7 +217,7 @@
     cls.implementedTypes.clear();
     cls.supertype = null;
     cls.mixedInType = null;
-    builder.supertype = new KernelNamedTypeBuilder(null, -1, "Object", null)
+    builder.supertype = new KernelNamedTypeBuilder("Object", null)
       ..bind(objectClassBuilder);
     builder.interfaces = null;
     builder.mixedInType = null;
@@ -435,7 +433,7 @@
               if (cls != objectClass) {
                 cls.supertype ??= objectClass.asRawSupertype;
                 declaration.supertype ??=
-                    new KernelNamedTypeBuilder(null, -1, "Object", null)
+                    new KernelNamedTypeBuilder("Object", null)
                       ..bind(objectClassBuilder);
               }
               if (declaration.isMixinApplication) {
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 41a0d14..017c9fc 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
@@ -11,8 +11,6 @@
 
 import '../fasta_codes.dart' show templateTypeArgumentsOnTypeVariable;
 
-import '../source/outline_listener.dart';
-
 import 'kernel_builder.dart'
     show
         KernelClassBuilder,
@@ -25,7 +23,6 @@
 
 class KernelTypeVariableBuilder
     extends TypeVariableBuilder<KernelTypeBuilder, DartType> {
-  final OutlineListener outlineListener;
   final TypeParameter actualParameter;
 
   KernelTypeVariableBuilder actualOrigin;
@@ -37,16 +34,14 @@
       [KernelTypeBuilder bound, TypeParameter actual])
       // TODO(32378): We would like to use '??' here instead, but in conjuction
       // with '..', it crashes Dart2JS.
-      : outlineListener = compilationUnit?.outlineListener,
-        actualParameter = actual != null
+      : actualParameter = actual != null
             ? (actual..fileOffset = charOffset)
             : (new TypeParameter(name, null)..fileOffset = charOffset),
         super(name, bound, compilationUnit, charOffset);
 
   KernelTypeVariableBuilder.fromKernel(
       TypeParameter parameter, KernelLibraryBuilder compilationUnit)
-      : outlineListener = null,
-        actualParameter = parameter,
+      : actualParameter = parameter,
         super(parameter.name, null, compilationUnit, parameter.fileOffset);
 
   @override
@@ -54,9 +49,6 @@
 
   TypeParameter get parameter => origin.actualParameter;
 
-  @override
-  bool get hasTarget => true;
-
   TypeParameter get target => parameter;
 
   DartType buildType(
@@ -84,8 +76,7 @@
   }
 
   KernelTypeBuilder asTypeBuilder() {
-    return new KernelNamedTypeBuilder(outlineListener, charOffset, name, null)
-      ..bind(this);
+    return new KernelNamedTypeBuilder(name, null)..bind(this);
   }
 
   void finish(LibraryBuilder library, KernelClassBuilder object,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
index 5936507..fb688d1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
@@ -28,9 +28,6 @@
 
   bool get isFinal => variable.isFinal;
 
-  @override
-  bool get hasTarget => true;
-
   VariableDeclaration get target => variable;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
index e56e209..6a15522 100644
--- a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
@@ -2,8 +2,7 @@
 // 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 'package:kernel/kernel.dart'
-    show LibraryDependency, Member, MetadataRepository, NamedNode, TreeNode;
+import 'package:kernel/kernel.dart' show Member, MetadataRepository, NamedNode;
 
 /// The collector to add target specific metadata to.
 abstract class MetadataCollector {
@@ -11,11 +10,7 @@
   /// to a component, metadata is serialized with the component.
   MetadataRepository get repository;
 
-  void setCodeStartEnd(TreeNode node, int start, int end);
-
   void setConstructorNameOffset(Member node, Object name);
 
   void setDocumentationComment(NamedNode node, String comment);
-
-  void setImportPrefixOffset(LibraryDependency node, int offset);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 13409e2..a45b739 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -64,8 +64,7 @@
       }
     }
     if (arguments != null) {
-      return new KernelNamedTypeBuilder(
-          type.outlineListener, type.charOffset, type.name, arguments)
+      return new KernelNamedTypeBuilder(type.name, arguments)
         ..bind(type.declaration);
     }
     return type;
@@ -130,8 +129,7 @@
     }
 
     if (changed) {
-      return new KernelFunctionTypeBuilder(type.outlineListener,
-          type.charOffset, returnType, variables, formals);
+      return new KernelFunctionTypeBuilder(returnType, variables, formals);
     }
 
     return type;
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index e37afdc..9c6044c 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -26,12 +26,10 @@
 
 import 'problems.dart' show internalProblem;
 
-import 'rewrite_severity.dart' as rewrite_severity;
+import 'rewrite_severity.dart' show rewriteSeverity;
 
 import 'severity.dart' show Severity;
 
-import 'source/outline_listener.dart';
-
 import 'target_implementation.dart' show TargetImplementation;
 
 import 'ticker.dart' show Ticker;
@@ -181,8 +179,6 @@
     logSummary(outlineSummaryTemplate);
   }
 
-  OutlineListener createOutlineListener(Uri fileUri) => null;
-
   void logSummary(Template<SummaryTemplate> template) {
     ticker.log((Duration elapsed, Duration sinceStart) {
       int libraryCount = 0;
@@ -243,7 +239,7 @@
   bool addMessage(Message message, int charOffset, int length, Uri fileUri,
       Severity severity,
       {bool wasHandled: false, List<LocatedMessage> context}) {
-    severity = rewriteSeverity(severity, message, fileUri);
+    severity = rewriteSeverity(severity, message.code, fileUri);
     if (severity == Severity.ignored) return false;
     String trace = """
 message: ${message.message}
@@ -271,10 +267,6 @@
     return true;
   }
 
-  Severity rewriteSeverity(Severity severity, Message message, Uri fileUri) {
-    return rewrite_severity.rewriteSeverity(severity, message.code, fileUri);
-  }
-
   Declaration getAbstractClassInstantiationError() {
     return target.getAbstractClassInstantiationError(this);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser.dart b/pkg/front_end/lib/src/fasta/parser.dart
index e5349ff..54082f1 100644
--- a/pkg/front_end/lib/src/fasta/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser.dart
@@ -33,12 +33,7 @@
 export 'parser/top_level_parser.dart' show TopLevelParser;
 
 export 'parser/util.dart'
-    show
-        endOffsetForToken,
-        lengthForToken,
-        lengthOfSpan,
-        offsetForToken,
-        optional;
+    show lengthForToken, lengthOfSpan, offsetForToken, optional;
 
 class ErrorCollectingListener extends Listener {
   final List<ParserError> recoverableErrors = <ParserError>[];
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 83d9acd..460fec9 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -240,9 +240,6 @@
   /// expressions are required.
   final bool allowedInConstantExpression;
 
-  /// Indicated whether the `isSynthetic` flag is required for the identifier.
-  final bool requiresSyntheticFlag;
-
   final Template<_MessageWithArgument<Token>> recoveryTemplate;
 
   const IdentifierContext(this._name,
@@ -252,7 +249,6 @@
       this.isContinuation: false,
       this.isScopeReference: false,
       this.isBuiltInIdentifierAllowed: true,
-      this.requiresSyntheticFlag: false,
       bool allowedInConstantExpression,
       this.recoveryTemplate: templateExpectedIdentifier})
       : this.allowedInConstantExpression =
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 078f2d6..9814c3b 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -81,8 +81,7 @@
 
 /// See [IdentifierContext.combinator].
 class CombinatorIdentifierContext extends IdentifierContext {
-  const CombinatorIdentifierContext()
-      : super('combinator', requiresSyntheticFlag: true);
+  const CombinatorIdentifierContext() : super('combinator');
 
   @override
   Token ensureIdentifier(Token token, Parser parser) {
@@ -155,12 +154,10 @@
 
 /// See [IdentifierContext.dottedName].
 class DottedNameIdentifierContext extends IdentifierContext {
-  const DottedNameIdentifierContext()
-      : super('dottedName', requiresSyntheticFlag: true);
+  const DottedNameIdentifierContext() : super('dottedName');
 
   const DottedNameIdentifierContext.continuation()
-      : super('dottedNameContinuation',
-            isContinuation: true, requiresSyntheticFlag: true);
+      : super('dottedNameContinuation', isContinuation: true);
 
   @override
   Token ensureIdentifier(Token token, Parser parser) {
diff --git a/pkg/front_end/lib/src/fasta/parser/util.dart b/pkg/front_end/lib/src/fasta/parser/util.dart
index f617749..50937cb6 100644
--- a/pkg/front_end/lib/src/fasta/parser/util.dart
+++ b/pkg/front_end/lib/src/fasta/parser/util.dart
@@ -63,12 +63,6 @@
   return token == null ? TreeNode.noOffset : token.offset;
 }
 
-/// A null-aware alternative to `token.end`.  If [token] is `null`, returns
-/// `TreeNode.noOffset`.
-int endOffsetForToken(Token token) {
-  return token == null ? TreeNode.noOffset : token.end;
-}
-
 bool isDigit(int c) => c >= 0x30 && c <= 0x39;
 
 bool isLetter(int c) => c >= 0x41 && c <= 0x5A || c >= 0x61 && c <= 0x7A;
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index f4159f2..fcab286 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -76,11 +76,6 @@
   int importExportDirectiveIndex = 0;
   int partDirectiveIndex = 0;
 
-  /// The unit currently being parsed, might be the same as [library] when
-  /// the defining unit of the library is being parsed, updated from outside
-  /// before parsing each part.
-  SourceLibraryBuilder currentUnit;
-
   ClassBuilder currentClass;
 
   /// For top-level declarations, this is the library scope. For class members,
@@ -126,8 +121,7 @@
       Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
     debugEvent("PartOf");
     if (hasName) discard(1);
-    Token metadata = pop();
-    parseMetadata(currentUnit, metadata, currentUnit.target);
+    discard(1); // Metadata.
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 1bf6d19..f094ef3 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -4,8 +4,6 @@
 
 library fasta.outline_builder;
 
-import 'dart:math' show min;
-
 import 'package:kernel/ast.dart' show ProcedureKind;
 
 import '../../scanner/token.dart' show Token;
@@ -14,7 +12,7 @@
 
 import '../builder/metadata_builder.dart' show ExpressionMetadataBuilder;
 
-import '../combinator.dart' show Combinator, CombinatorIdentifier;
+import '../combinator.dart' show Combinator;
 
 import '../fasta_codes.dart'
     show
@@ -114,14 +112,12 @@
 
   int popCharOffset() => pop();
 
-  List<CombinatorIdentifier> popIdentifierList(int count) {
+  List<String> popIdentifierList(int count) {
     if (count == 0) return null;
-    var list = new List<CombinatorIdentifier>.filled(count, null);
+    List<String> list = new List<String>.filled(count, null, growable: true);
     for (int i = count - 1; i >= 0; i--) {
-      bool isSynthetic = pop();
-      int offset = popCharOffset();
-      String name = pop();
-      list[i] = new CombinatorIdentifier(offset, name, isSynthetic);
+      popCharOffset();
+      list[i] = pop();
     }
     return list;
   }
@@ -151,50 +147,33 @@
   }
 
   @override
-  void beginMetadataStar(Token token) {
-    push(token);
-  }
-
-  @override
   void endMetadataStar(int count) {
     debugEvent("MetadataStar");
-    if (count == 0) {
-      pop();
-      push(NullValue.MetadataToken);
-      push(NullValue.Metadata);
-    } else {
-      push(popList(
-          count,
-          new List<ExpressionMetadataBuilder<TypeBuilder>>.filled(count, null,
-              growable: true)));
-    }
+    push(popList(
+            count,
+            new List<ExpressionMetadataBuilder<TypeBuilder>>.filled(count, null,
+                growable: true)) ??
+        NullValue.Metadata);
   }
 
   @override
   void handleInvalidTopLevelDeclaration(Token endToken) {
     debugEvent("InvalidTopLevelDeclaration");
     pop(); // metadata star
-    pop(); // metadataToken
   }
 
   @override
   void endHide(Token hideKeyword) {
     debugEvent("Hide");
-    List<CombinatorIdentifier> identifiers = pop();
-    List<String> names =
-        identifiers.map((identifier) => identifier.name).toList();
-    push(new Combinator.hide(
-        identifiers, names, hideKeyword.charOffset, library.fileUri));
+    List<String> names = pop();
+    push(new Combinator.hide(names, hideKeyword.charOffset, library.fileUri));
   }
 
   @override
   void endShow(Token showKeyword) {
     debugEvent("Show");
-    List<CombinatorIdentifier> identifiers = pop();
-    List<String> names =
-        identifiers.map((identifier) => identifier.name).toList();
-    push(new Combinator.show(
-        identifiers, names, showKeyword.charOffset, library.fileUri));
+    List<String> names = pop();
+    push(new Combinator.show(names, showKeyword.charOffset, library.fileUri));
   }
 
   @override
@@ -213,7 +192,6 @@
     int uriOffset = popCharOffset();
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
     library.addExport(metadata, uri, configurations, combinators,
         exportKeyword.charOffset, uriOffset);
     checkEmpty(exportKeyword.charOffset);
@@ -242,7 +220,6 @@
     int uriOffset = popCharOffset();
     String uri = pop(); // For a conditional import, this is the default URI.
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
     library.addImport(
         metadata,
         uri,
@@ -279,9 +256,7 @@
   @override
   void handleDottedName(int count, Token firstIdentifier) {
     debugEvent("DottedName");
-    push(popIdentifierList(count)
-        .map((identifier) => identifier.name)
-        .join('.'));
+    push(popIdentifierList(count).join('.'));
   }
 
   @override
@@ -300,7 +275,6 @@
     int charOffset = popCharOffset();
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
     library.addPart(metadata, uri, charOffset);
     checkEmpty(partKeyword.charOffset);
   }
@@ -324,15 +298,12 @@
     if (context == IdentifierContext.enumValueDeclaration) {
       super.handleIdentifier(token, context);
       push(token.charOffset);
-      var docComment = documentationCommentBefore(token);
-      push(docComment?.text ?? NullValue.DocumentationComment);
+      String documentationComment = getDocumentationComment(token);
+      push(documentationComment ?? NullValue.DocumentationComment);
     } else {
       super.handleIdentifier(token, context);
       push(token.charOffset);
     }
-    if (context.requiresSyntheticFlag) {
-      push(token.isSynthetic);
-    }
     if (inConstructor && context == IdentifierContext.methodDeclaration) {
       inConstructorName = true;
     }
@@ -415,11 +386,10 @@
   void endLibraryName(Token libraryKeyword, Token semicolon) {
     debugEvent("endLibraryName");
     popCharOffset();
+    String documentationComment = getDocumentationComment(libraryKeyword);
     Object name = pop();
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(libraryKeyword, metadataToken);
-    library.documentationComment = docComment?.text;
+    library.documentationComment = documentationComment;
     library.name = "${name}";
     library.metadata = metadata;
   }
@@ -483,6 +453,7 @@
   @override
   void endClassDeclaration(Token beginToken, Token endToken) {
     debugEvent("endClassDeclaration");
+    String documentationComment = getDocumentationComment(beginToken);
     List<TypeBuilder> interfaces = pop(NullValue.TypeBuilderList);
     int supertypeOffset = pop();
     TypeBuilder supertype = pop();
@@ -494,18 +465,12 @@
       supertype.typeVariables = typeVariables;
     }
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
 
     final int startCharOffset =
         metadata == null ? beginToken.charOffset : metadata.first.charOffset;
 
-    int codeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    int codeEndOffset = endToken.end;
-
     library.addClass(
-        docComment?.text,
+        documentationComment,
         metadata,
         modifiers,
         name,
@@ -515,9 +480,7 @@
         startCharOffset,
         charOffset,
         endToken.charOffset,
-        supertypeOffset,
-        codeStartOffset,
-        codeEndOffset);
+        supertypeOffset);
     checkEmpty(beginToken.charOffset);
   }
 
@@ -558,21 +521,15 @@
       modifiers |= abstractMask;
     }
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
+    String documentationComment = getDocumentationComment(beginToken);
     checkEmpty(beginToken.charOffset);
     library
         .endNestedDeclaration("#method")
         .resolveTypes(typeVariables, library);
     final int startCharOffset =
         metadata == null ? beginToken.charOffset : metadata.first.charOffset;
-
-    int codeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    int codeEndOffset = endToken.end;
-
     library.addProcedure(
-        docComment?.text,
+        documentationComment,
         metadata,
         modifiers,
         returnType,
@@ -585,8 +542,6 @@
         formalsOffset,
         endToken.charOffset,
         nativeMethodName,
-        codeStartOffset,
-        codeEndOffset,
         isTopLevel: true);
     nativeMethodName = null;
   }
@@ -744,8 +699,7 @@
     bool isConst = (modifiers & constMask) != 0;
     int varFinalOrConstOffset = pop();
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
+    String documentationComment = getDocumentationComment(beginToken);
     library
         .endNestedDeclaration("#method")
         .resolveTypes(typeVariables, library);
@@ -767,13 +721,8 @@
       }
       final int startCharOffset =
           metadata == null ? beginToken.charOffset : metadata.first.charOffset;
-
-      int codeStartOffset =
-          _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-      int codeEndOffset = endToken.end;
-
       library.addConstructor(
-          docComment?.text,
+          documentationComment,
           metadata,
           modifiers,
           returnType,
@@ -785,8 +734,6 @@
           charOffset,
           formalsOffset,
           endToken.charOffset,
-          codeStartOffset,
-          codeEndOffset,
           nativeMethodName);
     } else {
       if (isConst) {
@@ -795,13 +742,8 @@
       }
       final int startCharOffset =
           metadata == null ? beginToken.charOffset : metadata.first.charOffset;
-
-      int codeStartOffset =
-          _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-      int codeEndOffset = endToken.end;
-
       library.addProcedure(
-          docComment?.text,
+          documentationComment,
           metadata,
           modifiers,
           returnType,
@@ -814,8 +756,6 @@
           formalsOffset,
           endToken.charOffset,
           nativeMethodName,
-          codeStartOffset,
-          codeEndOffset,
           isTopLevel: false);
     }
     nativeMethodName = null;
@@ -835,6 +775,7 @@
   void endNamedMixinApplication(Token beginToken, Token classKeyword,
       Token equals, Token implementsKeyword, Token endToken) {
     debugEvent("endNamedMixinApplication");
+    String documentationComment = getDocumentationComment(beginToken);
     List<TypeBuilder> interfaces = popIfNotNull(implementsKeyword);
     TypeBuilder mixinApplication = pop();
     int modifiers = pop();
@@ -842,24 +783,8 @@
     int charOffset = pop();
     String name = pop();
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
-
-    int codeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    int codeEndOffset = endToken.end;
-
-    library.addNamedMixinApplication(
-        docComment?.text,
-        metadata,
-        name,
-        typeVariables,
-        modifiers,
-        mixinApplication,
-        interfaces,
-        charOffset,
-        codeStartOffset,
-        codeEndOffset);
+    library.addNamedMixinApplication(documentationComment, metadata, name,
+        typeVariables, modifiers, mixinApplication, interfaces, charOffset);
     checkEmpty(beginToken.charOffset);
   }
 
@@ -923,7 +848,6 @@
     TypeBuilder type = pop();
     int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
     push(library.addFormalParameter(
         metadata, modifiers, type, name, thisKeyword != null, charOffset));
   }
@@ -1054,15 +978,14 @@
 
   @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
+    String documentationComment = getDocumentationComment(enumKeyword);
     List<Object> constantNamesAndOffsets = popList(
-        count * 5, new List<Object>.filled(count * 5, null, growable: true));
+        count * 4, new List<Object>.filled(count * 4, null, growable: true));
     int charOffset = pop();
     String name = pop();
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(enumKeyword, metadataToken);
-    library.addEnum(docComment?.text, metadata, name, constantNamesAndOffsets,
-        charOffset, leftBrace?.endGroup?.charOffset);
+    library.addEnum(documentationComment, metadata, name,
+        constantNamesAndOffsets, charOffset, leftBrace?.endGroup?.charOffset);
     checkEmpty(enumKeyword.charOffset);
   }
 
@@ -1109,6 +1032,7 @@
   void endFunctionTypeAlias(
       Token typedefKeyword, Token equals, Token endToken) {
     debugEvent("endFunctionTypeAlias");
+    String documentationComment = getDocumentationComment(typedefKeyword);
     List<TypeVariableBuilder> typeVariables;
     String name;
     int charOffset;
@@ -1144,9 +1068,7 @@
       }
     }
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(typedefKeyword, metadataToken);
-    library.addFunctionTypeAlias(docComment?.text, metadata, name,
+    library.addFunctionTypeAlias(documentationComment, metadata, name,
         typeVariables, functionType, charOffset);
     checkEmpty(typedefKeyword.charOffset);
   }
@@ -1162,12 +1084,9 @@
         (covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
-    int firstFieldCodeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo,
-        firstFieldCodeStartOffset);
+    String documentationComment = getDocumentationComment(beginToken);
+    library.addFields(
+        documentationComment, metadata, modifiers, type, fieldsInfo);
     checkEmpty(beginToken.charOffset);
   }
 
@@ -1189,12 +1108,9 @@
       modifiers &= ~constMask;
     }
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
-    int firstFieldCodeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    library.addFields(docComment?.text, metadata, modifiers, type, fieldsInfo,
-        firstFieldCodeStartOffset);
+    String documentationComment = getDocumentationComment(beginToken);
+    library.addFields(
+        documentationComment, metadata, modifiers, type, fieldsInfo);
   }
 
   @override
@@ -1205,7 +1121,6 @@
     // TODO(paulberry): type variable metadata should not be ignored.  See
     // dartbug.com/28981.
     /* List<MetadataBuilder> metadata = */ pop();
-    pop(); // metadataToken
 
     push(library.addTypeVariable(name, null, charOffset));
   }
@@ -1245,7 +1160,6 @@
     int charOffset = popCharOffset();
     Object containingLibrary = pop();
     List<MetadataBuilder> metadata = pop();
-    pop(); // metadataToken
     if (hasName) {
       library.addPartOf(metadata, "$containingLibrary", null, charOffset);
     } else {
@@ -1291,15 +1205,9 @@
     Object name = pop();
     int modifiers = pop();
     List<MetadataBuilder> metadata = pop();
-    Token metadataToken = pop();
-    var docComment = documentationComment(beginToken, metadataToken);
-
-    int codeStartOffset =
-        _chooseCodeStartOffset(docComment, metadataToken, beginToken);
-    int codeEndOffset = endToken.end;
-
+    String documentationComment = getDocumentationComment(beginToken);
     library.addFactoryMethod(
-        docComment?.text,
+        documentationComment,
         metadata,
         modifiers,
         name,
@@ -1309,8 +1217,6 @@
         charOffset,
         formalsOffset,
         endToken.charOffset,
-        codeStartOffset,
-        codeEndOffset,
         nativeMethodName);
     nativeMethodName = null;
     inConstructor = false;
@@ -1364,7 +1270,6 @@
   void handleInvalidMember(Token endToken) {
     debugEvent("InvalidMember");
     pop(); // metadata star
-    pop(); // metadataToken
   }
 
   @override
@@ -1401,60 +1306,32 @@
     library.addProblem(message, charOffset, length, uri, context: context);
   }
 
-  static int _chooseCodeStartOffset(
-      _DocumentationComment docComment, Token metadataToken, Token beginToken) {
-    if (docComment != null && metadataToken != null) {
-      return min(docComment.offset, metadataToken.charOffset);
-    }
-    if (docComment != null) {
-      return docComment.offset;
-    }
-    if (metadataToken != null) {
-      return metadataToken.charOffset;
-    }
-    return beginToken.offset;
-  }
-
-  /// Return the documentation comment for the [beginToken] or [metadataToken],
-  /// or `null` if there is no preceding documentation comment in either of
-  /// these nodes.
-  static _DocumentationComment documentationComment(
-      Token beginToken, Token metadataToken) {
-    return documentationCommentBefore(beginToken) ??
-        documentationCommentBefore(metadataToken);
-  }
-
   /// Return the documentation comment for the entity that starts at the
   /// given [token], or `null` if there is no preceding documentation comment.
-  static _DocumentationComment documentationCommentBefore(Token token) {
-    Token commentToken = token?.precedingComments;
-    if (commentToken == null) return null;
+  static String getDocumentationComment(Token token) {
+    Token docToken = token.precedingComments;
+    if (docToken == null) return null;
     bool inSlash = false;
-    Token firstDocToken;
-    StringBuffer buffer;
-    while (commentToken != null) {
-      String lexeme = commentToken.lexeme;
+    var buffer = new StringBuffer();
+    while (docToken != null) {
+      String lexeme = docToken.lexeme;
       if (lexeme.startsWith('/**')) {
         inSlash = false;
-        firstDocToken = commentToken;
-        buffer = new StringBuffer();
+        buffer.clear();
         buffer.write(lexeme);
       } else if (lexeme.startsWith('///')) {
-        if (!inSlash || buffer == null) {
+        if (!inSlash) {
           inSlash = true;
-          firstDocToken = commentToken;
-          buffer = new StringBuffer();
+          buffer.clear();
         }
         if (buffer.isNotEmpty) {
           buffer.writeln();
         }
         buffer.write(lexeme);
       }
-      commentToken = commentToken.next;
+      docToken = docToken.next;
     }
-    if (buffer == null) return null;
-    return new _DocumentationComment(
-        firstDocToken.charOffset, buffer.toString());
+    return buffer.toString();
   }
 
   @override
@@ -1462,10 +1339,3 @@
     // printEvent('OutlineBuilder: $name');
   }
 }
-
-class _DocumentationComment {
-  final int offset;
-  final String text;
-
-  _DocumentationComment(this.offset, this.text);
-}
diff --git a/pkg/front_end/lib/src/fasta/source/outline_listener.dart b/pkg/front_end/lib/src/fasta/source/outline_listener.dart
deleted file mode 100644
index 0f77d6c..0000000
--- a/pkg/front_end/lib/src/fasta/source/outline_listener.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2018, 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 '../kernel/kernel_ast_api.dart' show DartType, Node;
-
-/// Callback interface used by builders to report the results of resolution
-/// in library outlines to a client.
-class OutlineListener {
-  /// Stores given resolution data at the given [offset].
-  ///
-  /// If the token for which the data is stored is synthetic, then [isSynthetic]
-  /// is set to `true`.
-  ///
-  /// [importIndex] is the index of the import directive in the library, and
-  /// is used to store import prefixes.
-  ///
-  /// [reference] is the referenced declaration - a class, a typedef, a type
-  /// parameter, etc.
-  ///
-  /// [type] is the type that was build from the [reference], for example code
-  /// `List<int>` will have a reference to `List` and type `List<int>`, i.e.
-  /// with type arguments applied.
-  void store(int offset, bool isSynthetic,
-      {int importIndex,
-      bool isNamespaceCombinatorReference,
-      Node reference,
-      DartType type}) {}
-}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index f699652..014686a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -66,8 +66,6 @@
 
 import '../problems.dart' show unhandled;
 
-import '../source/outline_listener.dart' show OutlineListener;
-
 import 'source_loader.dart' show SourceLoader;
 
 abstract class SourceLibraryBuilder<T extends TypeBuilder, R>
@@ -116,8 +114,6 @@
 
   bool canAddImplementationBuilders = false;
 
-  final OutlineListener outlineListener;
-
   SourceLibraryBuilder(SourceLoader loader, Uri fileUri, Scope scope)
       : this.fromScopes(loader, fileUri, new DeclarationBuilder<T>.library(),
             scope ?? new Scope.top());
@@ -126,7 +122,6 @@
       this.loader, this.fileUri, this.libraryDeclaration, this.importScope)
       : disableTypeInference = loader.target.disableTypeInference,
         currentDeclaration = libraryDeclaration,
-        outlineListener = loader.createOutlineListener(fileUri),
         super(
             fileUri, libraryDeclaration.toScope(importScope), new Scope.top());
 
@@ -350,9 +345,7 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      int supertypeOffset,
-      int codeStartOffset,
-      int codeEndOffset);
+      int supertypeOffset);
 
   void addNamedMixinApplication(
       String documentationComment,
@@ -362,9 +355,7 @@
       int modifiers,
       T mixinApplication,
       List<T> interfaces,
-      int charOffset,
-      int codeStartOffset,
-      int codeEndOffset);
+      int charOffset);
 
   void addField(
       String documentationComment,
@@ -373,47 +364,23 @@
       T type,
       String name,
       int charOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer);
 
-  void addFields(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      T type,
-      List<Object> fieldsInfo,
-      int firstFieldCodeStartOffset) {
+  void addFields(String documentationComment, List<MetadataBuilder> metadata,
+      int modifiers, T type, List<Object> fieldsInfo) {
     for (int i = 0; i < fieldsInfo.length; i += 4) {
       String name = fieldsInfo[i];
       int charOffset = fieldsInfo[i + 1];
       bool hasInitializer = fieldsInfo[i + 2] != null;
       Token initializerTokenForInference =
           type == null ? fieldsInfo[i + 2] : null;
-      Token beforeLast = fieldsInfo[i + 3];
       if (initializerTokenForInference != null) {
+        Token beforeLast = fieldsInfo[i + 3];
         beforeLast.setNext(new Token.eof(beforeLast.next.offset));
       }
-
-      int codeEndOffset;
-      if (beforeLast != null) {
-        codeEndOffset = beforeLast.next.offset;
-      } else {
-        codeEndOffset = charOffset + name.length;
-      }
-
-      addField(
-          documentationComment,
-          metadata,
-          modifiers,
-          type,
-          name,
-          charOffset,
-          i == 0 ? firstFieldCodeStartOffset : charOffset,
-          codeEndOffset,
-          initializerTokenForInference,
-          hasInitializer);
+      addField(documentationComment, metadata, modifiers, type, name,
+          charOffset, initializerTokenForInference, hasInitializer);
     }
   }
 
@@ -430,8 +397,6 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       String nativeMethodName);
 
   void addProcedure(
@@ -448,8 +413,6 @@
       int charOpenParenOffset,
       int charEndOffset,
       String nativeMethodName,
-      int codeStartOffset,
-      int codeEndOffset,
       {bool isTopLevel});
 
   void addEnum(
@@ -485,8 +448,6 @@
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
-      int codeStartOffset,
-      int codeEndOffset,
       String nativeMethodName);
 
   FormalParameterBuilder addFormalParameter(List<MetadataBuilder> metadata,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 646eeef..a354e63 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -45,8 +45,6 @@
         NamedTypeBuilder,
         TypeBuilder;
 
-import '../combinator.dart';
-
 import '../deprecated_problems.dart' show deprecated_inputError;
 
 import '../export.dart' show Export;
@@ -104,8 +102,6 @@
 
 import 'outline_builder.dart' show OutlineBuilder;
 
-import 'outline_listener.dart' show OutlineListener;
-
 import 'source_class_builder.dart' show SourceClassBuilder;
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
@@ -213,13 +209,9 @@
       // time we suppress lexical errors.
       Token tokens = await tokenize(library, suppressLexicalErrors: true);
       if (tokens == null) return;
-
       DietListener listener = createDietListener(library);
       DietParser parser = new DietParser(listener);
-
-      listener.currentUnit = library;
       parser.parseUnit(tokens);
-
       for (SourceLibraryBuilder part in library.parts) {
         if (part.partOfLibrary != library) {
           // Part was included in multiple libraries. Skip it here.
@@ -227,7 +219,6 @@
         }
         Token tokens = await tokenize(part);
         if (tokens != null) {
-          listener.currentUnit = part;
           listener.uri = part.fileUri;
           listener.partDirectiveIndex = 0;
           parser.parseUnit(tokens);
@@ -348,21 +339,6 @@
       // and can lead to memory leaks.
       exportee.exporters.clear();
     }
-    for (var library in builders.values) {
-      if (library is SourceLibraryBuilder) {
-        OutlineListener outlineListener = library.outlineListener;
-        if (outlineListener != null) {
-          for (var import in library.imports) {
-            storeCombinatorIdentifiersResolution(
-                outlineListener, import.imported, import.combinators);
-          }
-          for (var export in library.exports) {
-            storeCombinatorIdentifiersResolution(
-                outlineListener, export.exported, export.combinators);
-          }
-        }
-      }
-    }
     ticker.logMs("Computed library scopes");
     // debugPrintExports();
   }
@@ -973,19 +949,4 @@
     hierarchy = null;
     typeInferenceEngine = null;
   }
-
-  void storeCombinatorIdentifiersResolution(OutlineListener outlineListener,
-      LibraryBuilder consumed, List<Combinator> combinators) {
-    if (combinators != null) {
-      for (var combinator in combinators) {
-        for (var identifier in combinator.identifiers) {
-          var declaration = consumed.exportScope.local[identifier.name];
-          declaration ??= consumed.exportScope.setters[identifier.name];
-          outlineListener.store(identifier.offset, identifier.isSynthetic,
-              isNamespaceCombinatorReference: true,
-              reference: declaration?.target);
-        }
-      }
-    }
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 154b20a..c0a7db0 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -52,7 +52,6 @@
   IdentifierList,
   Initializers,
   Metadata,
-  MetadataToken,
   Modifiers,
   ParameterDefaultValue,
   Prefix,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 1a05738..e6d1901 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -2,10 +2,9 @@
 // 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 '../fasta_codes.dart' show LocatedMessage, Message;
+import 'package:kernel/ast.dart' show Arguments, Expression, FunctionType;
 
-import '../kernel/kernel_ast_api.dart'
-    show ArgumentsJudgment, Expression, FunctionType;
+import '../fasta_codes.dart' show LocatedMessage, Message;
 
 abstract class InferenceHelper {
   Expression wrapInCompileTimeError(Expression expression, Message message);
@@ -14,7 +13,7 @@
       {List<LocatedMessage> context});
 
   LocatedMessage checkArgumentsForType(
-      FunctionType function, ArgumentsJudgment arguments, int offset);
+      FunctionType function, Arguments arguments, int offset);
 
   void addProblem(Message message, int charOffset, int length,
       {List<LocatedMessage> context});
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index b3c28bb..68a2f7a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -545,13 +545,8 @@
       void thenStatement,
       void elseStatement);
 
-  void indexAssign(
-      ExpressionJudgment judgment,
-      Location location,
-      DartType receiverType,
-      Reference writeMember,
-      Reference combiner,
-      DartType inferredType);
+  void indexAssign(ExpressionJudgment judgment, Location location,
+      Reference writeMember, Reference combiner, DartType inferredType);
 
   void intLiteral(ExpressionJudgment judgment, Location location,
       IntLiteralTokens tokens, num value, DartType inferredType);
@@ -614,7 +609,6 @@
   void methodInvocation(
       ExpressionJudgment judgment,
       Location resultOffset,
-      DartType receiverType,
       List<DartType> argumentsTypes,
       bool isImplicitCall,
       Reference interfaceMember,
@@ -643,20 +637,13 @@
   void propertyAssign(
       ExpressionJudgment judgment,
       Location location,
-      bool isSyntheticLhs,
-      DartType receiverType,
       Reference writeMember,
       DartType writeContext,
       Reference combiner,
       DartType inferredType);
 
-  void propertyGet(
-      ExpressionJudgment judgment,
-      Location location,
-      bool forSyntheticToken,
-      DartType receiverType,
-      Reference member,
-      DartType inferredType);
+  void propertyGet(ExpressionJudgment judgment, Location location,
+      bool forSyntheticToken, Reference member, DartType inferredType);
 
   void propertyGetCall(
       ExpressionJudgment judgment, Location location, DartType inferredType);
@@ -760,7 +747,6 @@
   void variableAssign(
       ExpressionJudgment judgment,
       Location location,
-      bool isSyntheticLhs,
       DartType writeContext,
       covariant Object writeVariableBinder,
       Reference combiner,
@@ -964,8 +950,8 @@
       void elseStatement) {}
 
   @override
-  void indexAssign(ExpressionJudgment judgment, location, receiverType,
-      writeMember, combiner, DartType inferredType) {}
+  void indexAssign(ExpressionJudgment judgment, location, writeMember, combiner,
+      DartType inferredType) {}
 
   @override
   void intLiteral(ExpressionJudgment judgment, location,
@@ -1030,7 +1016,6 @@
   void methodInvocation(
       ExpressionJudgment judgment,
       resultOffset,
-      DartType receiverType,
       List<DartType> argumentsTypes,
       bool isImplicitCall,
       interfaceMember,
@@ -1061,19 +1046,12 @@
       NullLiteralTokens tokens, bool isSynthetic, DartType inferredType) {}
 
   @override
-  void propertyAssign(
-      ExpressionJudgment judgment,
-      location,
-      bool isSyntheticLhs,
-      receiverType,
-      writeMember,
-      DartType writeContext,
-      combiner,
-      DartType inferredType) {}
+  void propertyAssign(ExpressionJudgment judgment, location, writeMember,
+      DartType writeContext, combiner, DartType inferredType) {}
 
   @override
   void propertyGet(ExpressionJudgment judgment, location,
-      bool forSyntheticToken, receiverType, member, DartType inferredType) {}
+      bool forSyntheticToken, member, DartType inferredType) {}
 
   @override
   void propertyGetCall(
@@ -1192,7 +1170,6 @@
   void variableAssign(
       ExpressionJudgment judgment,
       location,
-      bool isSyntheticLhs,
       DartType writeContext,
       covariant void writeVariableBinder,
       combiner,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 6bd3c86..0094a71 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1685,7 +1685,6 @@
       listener.methodInvocation(
           expression,
           resultOffset,
-          receiverType,
           arguments.types,
           isImplicitCall,
           getRealTarget(interfaceMember),
@@ -1760,7 +1759,7 @@
       listener.propertyGetCall(expression, expression.fileOffset, inferredType);
     } else {
       listener.propertyGet(expression, expression.fileOffset, forSyntheticToken,
-          receiverType, interfaceMember, inferredType);
+          interfaceMember, inferredType);
     }
     expression.inferredType = inferredType;
   }
@@ -1965,14 +1964,13 @@
     return new InterfaceType(class_, <DartType>[type ?? const DynamicType()]);
   }
 
-  void _forEachArgument(ArgumentsJudgment arguments,
-      void callback(String name, Expression expression)) {
+  void _forEachArgument(
+      Arguments arguments, void callback(String name, Expression expression)) {
     for (var expression in arguments.positional) {
       callback(null, expression);
     }
-    for (var namedExpression in arguments.namedJudgments) {
-      callback(namedExpression.name,
-          namedExpression.originalValue ?? namedExpression.value);
+    for (var namedExpression in arguments.named) {
+      callback(namedExpression.name, namedExpression.value);
     }
   }
 
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index eaac01d..fdcc60e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -48,6 +48,8 @@
 ConflictsWithTypeVariable/example: Fail
 ConstAfterFactory/script1: Fail
 ConstAndCovariant/script2: Fail
+ConstAndFinal/declaration3: Fail
+ConstAndFinal/declaration4: Fail
 ConstAndVar/script1: Fail
 ConstConstructorInSubclassOfMixinApplication/example: Fail
 ConstConstructorNonFinalField/example: Fail
@@ -327,7 +329,6 @@
 ThisOrSuperAccessInFieldInitializer/example: Fail
 TooFewArguments/example: Fail
 TooManyArguments/example: Fail
-TooManyArgumentsCouldBeNamed/example: Fail
 TopLevelOperator/script1: Fail
 TopLevelOperator/script2: Fail
 TopLevelOperator/script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index a1be91c..49ac4bb 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -460,9 +460,11 @@
   template: "Members can't be declared to be both 'const' and 'final'."
   tip: "Try removing either the 'const' or 'final' keyword."
   analyzerCode: CONST_AND_FINAL
-  script:
+  declaration:
     - "class C { static const final int x = 5; }"
     - "class C { static final const int x = 5; }"
+    - "const final int x = 5;"
+    - "final const int x = 5;"
 
 ConstAndVar:
   template: "Members can't be declared to be both 'const' and 'var'."
@@ -1243,12 +1245,6 @@
   severity: ERROR_LEGACY_WARNING
   analyzerCode: EXTRA_POSITIONAL_ARGUMENTS
 
-TooManyArgumentsCouldBeNamed:
-  template: "Too many positional arguments: #count allowed, but #count2 found."
-  tip: "Try removing the extra positional arguments or specifying the name for named arguments."
-  severity: ERROR_LEGACY_WARNING
-  analyzerCode: EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED
-
 NoSuchNamedParameter:
   template: "No named parameter with the name '#name'."
   severity: ERROR_LEGACY_WARNING
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 9de0d3f..4beec7d 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -182,17 +182,17 @@
         " getter: $uri::myGetter, setter: $uri::mySetter,"
         " receiverVariable: null, indexVariable: null)",
         new KernelIndexedAccessGenerator.internal(
-            helper, token, token, expression, index, getter, setter));
+            helper, token, expression, index, getter, setter));
     check(
         "ThisIndexedAccessGenerator(offset: 4, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter, indexVariable: null)",
         new KernelThisIndexedAccessGenerator(
-            helper, token, token, index, getter, setter));
+            helper, token, index, getter, setter));
     check(
         "SuperIndexedAccessGenerator(offset: 4, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter, indexVariable: null)",
         new KernelSuperIndexedAccessGenerator(
-            helper, token, token, index, getter, setter));
+            helper, token, index, getter, setter));
     check(
         "StaticAccessGenerator(offset: 4, readTarget: $uri::myGetter,"
         " writeTarget: $uri::mySetter)",
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 6e155d9..9b12575 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -225,22 +225,22 @@
 // pkg/front_end/testcases/rasta/super.dart:147:12: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     super.m(87);
-//            ^^^^
+//            ^
 //
 // pkg/front_end/testcases/rasta/super.dart:148:16: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     use(super.m(87));
-//                ^^^^
+//                ^
 //
 // pkg/front_end/testcases/rasta/super.dart:149:12: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     super.n(87);
-//            ^^^^
+//            ^
 //
 // pkg/front_end/testcases/rasta/super.dart:150:16: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     use(super.n(87));
-//                ^^^^
+//                ^
 //
 // pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
index 71e52ba..01ccbc1 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
@@ -5,7 +5,7 @@
 static method bad() → dynamic {
   for (core::int i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
   for (int i = i;; false) {}
-           ^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
+           ^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect
index 71e52ba..01ccbc1 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 static method bad() → dynamic {
   for (core::int i = let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
   for (int i = i;; false) {}
-           ^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
+           ^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
index 50d3af2..689db8c 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -11,7 +11,7 @@
 static method bad() → dynamic {
   for (core::int i = (let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
   for (int i = i;; false) {}
-           ^" in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
+           ^" in let final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
index 0cffebe..7db28e0 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 static method bad() → dynamic {
   for (core::int i = (let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
   for (int i = i;; false) {}
-           ^" in let final<BottomType> #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
+           ^" in let final<BottomType> #t2 = let<BottomType> _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in null) as{TypeError} core::int; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
index c8a8ea6..11b7715 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -3,11 +3,11 @@
 // pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
 // Try removing the extra positional arguments.
 //   new A.foo(1, 2);
-//            ^^^^^^
+//            ^
 //
 // pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
 //   new A().foo();
-//              ^^
+//              ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index 66896c4..a923b10 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -203,12 +203,12 @@
 // pkg/front_end/testcases/super_rasta_copy.dart:139:12: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     super.m(87);
-//            ^^^^
+//            ^
 //
 // pkg/front_end/testcases/super_rasta_copy.dart:140:16: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //     use(super.m(87));
-//                ^^^^
+//                ^
 //
 // pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
 // Try to initialize the field in the declaration or in every constructor.
