Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(776)

Unified Diff: pkg/front_end/lib/src/fasta/source/source_class_builder.dart

Issue 2788153002: Create separate scopes for constructors, setters, and other members. (Closed)
Patch Set: One more flaky standalone/io test. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/front_end/lib/src/fasta/source/source_class_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index de5cb0fced645bf99e11b41c32bac560520038fa..81f8a0b55d3ce8829c004ca8a3a5e8c254da5a64 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -21,7 +21,7 @@ import '../kernel/kernel_builder.dart'
KernelTypeVariableBuilder,
LibraryBuilder,
MetadataBuilder,
- ProcedureBuilder,
+ Scope,
TypeVariableBuilder,
compareProcedures;
@@ -42,11 +42,6 @@ Class initializeClass(
class SourceClassBuilder extends KernelClassBuilder {
final Class cls;
- @override
- final Map<String, Builder> constructors;
-
- final Map<String, Builder> membersInScope;
-
final List<ConstructorReferenceBuilder> constructorReferences;
final KernelTypeBuilder mixedInType;
@@ -58,17 +53,16 @@ class SourceClassBuilder extends KernelClassBuilder {
List<TypeVariableBuilder> typeVariables,
KernelTypeBuilder supertype,
List<KernelTypeBuilder> interfaces,
- Map<String, Builder> members,
+ Scope scope,
+ Scope constructors,
LibraryBuilder parent,
this.constructorReferences,
int charOffset,
[Class cls,
this.mixedInType])
: cls = initializeClass(cls, name, parent, charOffset),
- membersInScope = computeMembersInScope(members),
- constructors = computeConstructors(members),
super(metadata, modifiers, name, typeVariables, supertype, interfaces,
- members, parent, charOffset);
+ scope, constructors, parent, charOffset);
int resolveTypes(LibraryBuilder library) {
int count = 0;
@@ -83,24 +77,23 @@ class SourceClassBuilder extends KernelClassBuilder {
}
Class build(KernelLibraryBuilder library) {
- void buildBuilder(Builder builder) {
- if (builder is KernelFieldBuilder) {
- // TODO(ahe): It would be nice to have a common interface for the build
- // method to avoid duplicating these two cases.
- cls.addMember(builder.build(library));
- } else if (builder is KernelFunctionBuilder) {
- cls.addMember(builder.build(library));
- } else {
- internalError("Unhandled builder: ${builder.runtimeType}");
- }
- }
-
- members.forEach((String name, Builder builder) {
+ void buildBuilders(String name, Builder builder) {
do {
- buildBuilder(builder);
+ if (builder is KernelFieldBuilder) {
+ // TODO(ahe): It would be nice to have a common interface for the
+ // build method to avoid duplicating these two cases.
+ cls.addMember(builder.build(library));
+ } else if (builder is KernelFunctionBuilder) {
+ cls.addMember(builder.build(library));
+ } else {
+ internalError("Unhandled builder: ${builder.runtimeType}");
+ }
builder = builder.next;
} while (builder != null);
- });
+ }
+
+ scope.forEach(buildBuilders);
+ constructors.forEach(buildBuilders);
cls.supertype = supertype?.buildSupertype(library);
cls.mixedInType = mixedInType?.buildSupertype(library);
// TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
@@ -116,6 +109,32 @@ class SourceClassBuilder extends KernelClassBuilder {
}
}
+ constructors.forEach((String name, Builder constructor) {
+ Builder member = scopeBuilder[name];
+ if (member == null) return;
+ // TODO(ahe): charOffset is missing.
+ addCompileTimeError(
+ constructor.charOffset, "Conflicts with member '${name}'.");
+ if (constructor.isFactory) {
+ addCompileTimeError(member.charOffset,
+ "Conflicts with factory '${this.name}.${name}'.");
+ } else {
+ addCompileTimeError(member.charOffset,
+ "Conflicts with constructor '${this.name}.${name}'.");
+ }
+ });
+
+ scope.setters.forEach((String name, Builder setter) {
+ Builder member = scopeBuilder[name];
+ if (member == null || !member.isField || member.isFinal) return;
+ // TODO(ahe): charOffset is missing.
+ var report = member.isInstanceMember != setter.isInstanceMember
+ ? addWarning
+ : addCompileTimeError;
+ report(setter.charOffset, "Conflicts with member '${name}'.");
+ report(member.charOffset, "Conflicts with setter '${name}'.");
+ });
+
cls.procedures.sort(compareProcedures);
return cls;
}
@@ -125,29 +144,7 @@ class SourceClassBuilder extends KernelClassBuilder {
cls.constructors.add(constructor);
constructor.parent = cls;
DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this);
- memberBuilder.next = constructors[name];
- constructors[name] = memberBuilder;
+ memberBuilder.next = constructorScopeBuilder[name];
+ constructorScopeBuilder.addMember(name, memberBuilder);
}
}
-
-Map<String, Builder> computeMembersInScope(Map<String, Builder> members) {
- Map<String, Builder> membersInScope = <String, Builder>{};
- members.forEach((String name, Builder builder) {
- if (builder is ProcedureBuilder) {
- if (builder.isConstructor || builder.isFactory) return;
- }
- membersInScope[name] = builder;
- });
- return membersInScope;
-}
-
-Map<String, Builder> computeConstructors(Map<String, Builder> members) {
- Map<String, Builder> constructors = <String, Builder>{};
- members.forEach((String name, Builder builder) {
- if (builder is ProcedureBuilder &&
- (builder.isConstructor || builder.isFactory)) {
- constructors[name] = builder;
- }
- });
- return constructors;
-}
« no previous file with comments | « pkg/front_end/lib/src/fasta/source/diet_listener.dart ('k') | pkg/front_end/lib/src/fasta/source/source_library_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698