| Index: pkg/front_end/lib/src/fasta/builder/class_builder.dart
 | 
| 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 a6e892aeda295e0a3b0b72f2edbb8d0a9710b164..6cbecb53381ccacb3a42be09234794c967ab64c5 100644
 | 
| --- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
 | 
| +++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
 | 
| @@ -15,12 +15,12 @@ import 'builder.dart'
 | 
|          MetadataBuilder,
 | 
|          MixinApplicationBuilder,
 | 
|          NamedTypeBuilder,
 | 
| +        Scope,
 | 
| +        ScopeBuilder,
 | 
|          TypeBuilder,
 | 
|          TypeDeclarationBuilder,
 | 
|          TypeVariableBuilder;
 | 
|  
 | 
| -import '../scope.dart' show AccessErrorBuilder, AmbiguousBuilder, Scope;
 | 
| -
 | 
|  abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|      extends TypeDeclarationBuilder<T, R> {
 | 
|    final List<TypeVariableBuilder> typeVariables;
 | 
| @@ -29,7 +29,13 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|  
 | 
|    List<T> interfaces;
 | 
|  
 | 
| -  final Map<String, Builder> members;
 | 
| +  final Scope scope;
 | 
| +
 | 
| +  final Scope constructors;
 | 
| +
 | 
| +  final ScopeBuilder scopeBuilder;
 | 
| +
 | 
| +  final ScopeBuilder constructorScopeBuilder;
 | 
|  
 | 
|    ClassBuilder(
 | 
|        List<MetadataBuilder> metadata,
 | 
| @@ -38,10 +44,13 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|        this.typeVariables,
 | 
|        this.supertype,
 | 
|        this.interfaces,
 | 
| -      this.members,
 | 
| +      this.scope,
 | 
| +      this.constructors,
 | 
|        LibraryBuilder parent,
 | 
|        int charOffset)
 | 
| -      : super(metadata, modifiers, name, parent, charOffset);
 | 
| +      : scopeBuilder = new ScopeBuilder(scope),
 | 
| +        constructorScopeBuilder = new ScopeBuilder(constructors),
 | 
| +        super(metadata, modifiers, name, parent, charOffset);
 | 
|  
 | 
|    /// Returns true if this class is the result of applying a mixin to its
 | 
|    /// superclass.
 | 
| @@ -51,10 +60,6 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|  
 | 
|    List<ConstructorReferenceBuilder> get constructorReferences => null;
 | 
|  
 | 
| -  Map<String, Builder> get constructors;
 | 
| -
 | 
| -  Map<String, Builder> get membersInScope => members;
 | 
| -
 | 
|    LibraryBuilder get library {
 | 
|      LibraryBuilder library = parent;
 | 
|      return library.partOfLibrary ?? library;
 | 
| @@ -63,70 +68,23 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|    @override
 | 
|    int resolveConstructors(LibraryBuilder library) {
 | 
|      if (constructorReferences == null) return 0;
 | 
| -    Scope scope = computeInstanceScope(library.scope);
 | 
|      for (ConstructorReferenceBuilder ref in constructorReferences) {
 | 
|        ref.resolveIn(scope);
 | 
|      }
 | 
|      return constructorReferences.length;
 | 
|    }
 | 
|  
 | 
| -  Scope computeInstanceScope(Scope parent) {
 | 
| -    if (typeVariables != null) {
 | 
| -      Map<String, Builder> local = <String, Builder>{};
 | 
| -      for (TypeVariableBuilder t in typeVariables) {
 | 
| -        local[t.name] = t;
 | 
| -      }
 | 
| -      parent = new Scope(local, null, parent, isModifiable: false);
 | 
| -    }
 | 
| -    return new Scope(membersInScope, null, parent, isModifiable: false);
 | 
| -  }
 | 
| -
 | 
|    /// Used to lookup a static member of this class.
 | 
|    Builder findStaticBuilder(String name, int charOffset, Uri fileUri,
 | 
|        {bool isSetter: false}) {
 | 
| -    Builder builder = members[name];
 | 
| -    if (builder?.next != null) {
 | 
| -      Builder getterBuilder;
 | 
| -      Builder setterBuilder;
 | 
| -      Builder current = builder;
 | 
| -      while (current != null) {
 | 
| -        if (current.isGetter && getterBuilder == null) {
 | 
| -          getterBuilder = current;
 | 
| -        } else if (current.isSetter && setterBuilder == null) {
 | 
| -          setterBuilder = current;
 | 
| -        } else {
 | 
| -          return new AmbiguousBuilder(name, builder, charOffset, fileUri);
 | 
| -        }
 | 
| -        current = current.next;
 | 
| -      }
 | 
| -      if (getterBuilder?.isInstanceMember ?? false) {
 | 
| -        getterBuilder = null;
 | 
| -      }
 | 
| -      if (setterBuilder?.isInstanceMember ?? false) {
 | 
| -        setterBuilder = null;
 | 
| -      }
 | 
| -      builder = isSetter ? setterBuilder : getterBuilder;
 | 
| -      if (builder == null) {
 | 
| -        if (isSetter && getterBuilder != null) {
 | 
| -          return new AccessErrorBuilder(
 | 
| -              name, getterBuilder, charOffset, fileUri);
 | 
| -        } else if (!isSetter && setterBuilder != null) {
 | 
| -          return new AccessErrorBuilder(
 | 
| -              name, setterBuilder, charOffset, fileUri);
 | 
| -        }
 | 
| -      }
 | 
| -    }
 | 
| -    if (builder == null) {
 | 
| -      return null;
 | 
| -    } else if (isSetter && builder.isGetter) {
 | 
| -      return null;
 | 
| -    } else {
 | 
| -      return builder.isInstanceMember ? null : builder;
 | 
| -    }
 | 
| +    Builder builder = isSetter
 | 
| +        ? scope.lookupSetter(name, charOffset, fileUri, isInstanceScope: false)
 | 
| +        : scope.lookup(name, charOffset, fileUri, isInstanceScope: false);
 | 
| +    return builder;
 | 
|    }
 | 
|  
 | 
|    Builder findConstructorOrFactory(String name, int charOffset, Uri uri) {
 | 
| -    return constructors[name];
 | 
| +    return constructors.lookup(name, charOffset, uri);
 | 
|    }
 | 
|  
 | 
|    /// Returns a map which maps the type variables of [superclass] to their
 | 
| @@ -193,14 +151,14 @@ abstract class ClassBuilder<T extends TypeBuilder, R>
 | 
|    }
 | 
|  
 | 
|    void forEach(void f(String name, MemberBuilder builder)) {
 | 
| -    members.forEach(f);
 | 
| +    scope.forEach(f);
 | 
|    }
 | 
|  
 | 
|    /// Don't use for scope lookup. Only use when an element is known to exist
 | 
|    /// (and isn't a setter).
 | 
|    MemberBuilder operator [](String name) {
 | 
|      // TODO(ahe): Rename this to getLocalMember.
 | 
| -    return members[name] ?? internalError("Not found: '$name'.");
 | 
| +    return scope.local[name] ?? internalError("Not found: '$name'.");
 | 
|    }
 | 
|  
 | 
|    void addCompileTimeError(int charOffset, String message) {
 | 
| 
 |