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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart

Issue 11472022: Reject constructor names that conflict with members. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years 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: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 6202dfbfc0ff289dd21c009501a80c13ed5b19a9..6e52485218e7478c23893f7e6d59794ec58dcfee 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -492,12 +492,41 @@ class ResolverTask extends CompilerTask {
MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS.error([mismatchedFlags]),
Diagnostic.ERROR);
}
+ checkConstructorNameHack(holder, member);
}
checkAbstractField(member);
checkValidOverride(member, cls.lookupSuperMember(member.name));
});
}
+ // TODO(ahe): Remove this method. It is only needed while we store
+ // constructor names as ClassName$id. Once we start storing
+ // constructors as just id, this will be caught by the general
+ // mechanism for duplicate members.
ngeoffray 2012/12/08 13:53:32 What makes it difficult to implement this today?
+ /// Check that a constructor name does not conflict with a member.
+ void checkConstructorNameHack(ClassElement holder, FunctionElement member) {
ngeoffray 2012/12/08 13:53:32 assert that member.getEnclosingClass() == holder?
+ // If the name of the constructor is the same as the name of the
+ // class, there cannot be a problem.
+ if (member.name == holder.name) return;
+
+ SourceString name =
+ Elements.deconstructConstructorName(member.name, holder);
+
+ // If the name could not be deconstructed, this is is from a
ngeoffray 2012/12/08 13:53:32 is is from a ... -> is a ...
+ // factory method from a deprecated interface implementation.
+ if (name == null) return;
+
+ Element otherMember = holder.lookupLocalMember(name);
+ if (otherMember != null) {
+ compiler.onDeprecatedFeature(member, 'conflicting constructor');
ngeoffray 2012/12/08 13:53:32 Something looks strange. Why are you implementing
+ compiler.reportMessage(
+ compiler.spanFromElement(otherMember),
+ MessageKind.GENERIC.error(['This member conflicts with a'
+ ' constructor.']),
+ Diagnostic.INFO);
+ }
+ }
+
void checkAbstractField(Element member) {
// Only check for getters. The test can only fail if there is both a setter
// and a getter with the same name, and we only need to check each abstract

Powered by Google App Engine
This is Rietveld 408576698