| Index: pkg/front_end/lib/src/fasta/builder/scope.dart | 
| diff --git a/pkg/front_end/lib/src/fasta/builder/scope.dart b/pkg/front_end/lib/src/fasta/builder/scope.dart | 
| index 60e4f9df796c23a62401fa05c64f9f64ca8276a1..2fe432982ec4967adb96df71a4679cf0306fe0a4 100644 | 
| --- a/pkg/front_end/lib/src/fasta/builder/scope.dart | 
| +++ b/pkg/front_end/lib/src/fasta/builder/scope.dart | 
| @@ -37,7 +37,7 @@ class Scope { | 
| return lookupAmbiguous(name, builder, false, charOffset, fileUri); | 
| } | 
| return builder.isSetter | 
| -          ? new AccessErrorBuilder(builder, charOffset, fileUri) | 
| +          ? new AccessErrorBuilder(name, builder, charOffset, fileUri) | 
| : builder; | 
| } else { | 
| return parent?.lookup(name, charOffset, fileUri); | 
| @@ -52,14 +52,14 @@ class Scope { | 
| } | 
| if (builder.isField) { | 
| if (builder.isFinal) { | 
| -          return new AccessErrorBuilder(builder, charOffset, fileUri); | 
| +          return new AccessErrorBuilder(name, builder, charOffset, fileUri); | 
| } else { | 
| return builder; | 
| } | 
| } else if (builder.isSetter) { | 
| return builder; | 
| } else { | 
| -        return new AccessErrorBuilder(builder, charOffset, fileUri); | 
| +        return new AccessErrorBuilder(name, builder, charOffset, fileUri); | 
| } | 
| } else { | 
| return parent?.lookupSetter(name, charOffset, fileUri); | 
| @@ -81,7 +81,7 @@ class Scope { | 
| } else if (current.isSetter && setterBuilder == null) { | 
| setterBuilder = current; | 
| } else { | 
| -        return new AmbiguousBuilder(builder, charOffset, fileUri); | 
| +        return new AmbiguousBuilder(name, builder, charOffset, fileUri); | 
| } | 
| current = current.next; | 
| } | 
| @@ -133,16 +133,32 @@ class Scope { | 
| } | 
| } | 
|  | 
| -class AccessErrorBuilder extends Builder { | 
| +abstract class ProblemBuilder extends Builder { | 
| +  final String name; | 
| + | 
| final Builder builder; | 
|  | 
| -  AccessErrorBuilder(this.builder, int charOffset, Uri fileUri) | 
| +  ProblemBuilder(this.name, this.builder, int charOffset, Uri fileUri) | 
| : super(null, charOffset, fileUri); | 
|  | 
| -  Builder get parent => builder; | 
| - | 
| get target => null; | 
|  | 
| +  bool get hasProblem => true; | 
| + | 
| +  String get message; | 
| + | 
| +  @override | 
| +  String get fullNameForErrors => name; | 
| +} | 
| + | 
| +/// Represents a [builder] that's being accessed incorrectly. For example, an | 
| +/// attempt to write to a final field, or to read from a setter. | 
| +class AccessErrorBuilder extends ProblemBuilder { | 
| +  AccessErrorBuilder(String name, Builder builder, int charOffset, Uri fileUri) | 
| +      : super(name, builder, charOffset, fileUri); | 
| + | 
| +  Builder get parent => builder; | 
| + | 
| bool get isFinal => builder.isFinal; | 
|  | 
| bool get isField => builder.isField; | 
| @@ -163,16 +179,12 @@ class AccessErrorBuilder extends Builder { | 
|  | 
| bool get isLocal => builder.isLocal; | 
|  | 
| -  bool get hasProblem => true; | 
| +  String get message => "Access error: '$name'."; | 
| } | 
|  | 
| -class AmbiguousBuilder extends Builder { | 
| -  final Builder builder; | 
| +class AmbiguousBuilder extends ProblemBuilder { | 
| +  AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri) | 
| +      : super(name, builder, charOffset, fileUri); | 
|  | 
| -  AmbiguousBuilder(this.builder, int charOffset, Uri fileUri) | 
| -      : super(null, charOffset, fileUri); | 
| - | 
| -  get target => null; | 
| - | 
| -  bool get hasProblem => true; | 
| +  String get message => "Duplicated named: '$name'."; | 
| } | 
|  |