| 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) {
|
|
|