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

Unified Diff: compiler/java/com/google/dart/compiler/resolver/Resolver.java

Issue 10885031: Issue 3968. Support for redirecting factory constructors (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 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: compiler/java/com/google/dart/compiler/resolver/Resolver.java
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 767202d929d236d3b2b85d7d60a8c037d2f3f9bf..e6c915476996f56a99363f333358667af25dfc85 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -654,6 +654,7 @@ public class Resolver {
&& !Elements.isNonFactoryConstructor(member)
&& !member.getModifiers().isAbstract()
&& !member.getModifiers().isExternal()
+ && node.getRedirectedTypeName() == null
&& !isInterface) {
onError(functionNode, ResolverErrorCode.METHOD_MUST_HAVE_BODY);
}
@@ -664,6 +665,33 @@ public class Resolver {
resolveInitializers(node, initializedFields);
}
+ // resolve redirecting factory constructor
+ {
+ DartTypeNode rcTypeName = node.getRedirectedTypeName();
+ if (rcTypeName != null) {
+ InterfaceType rcType = (InterfaceType) resolveType(rcTypeName, true, true,
+ TypeErrorCode.NO_SUCH_TYPE, ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
+ switch (TypeKind.of(rcType)) {
+ case INTERFACE:
+ Element element = recordType(rcTypeName, rcType);
+ DartIdentifier rcName = node.getRedirectedConstructorName();
+ if (rcName != null) {
+ element = ((ClassElement) element).lookupConstructor(rcName.getName());
+ switch (ElementKind.of(element)) {
+ case CONSTRUCTOR:
+ recordElement(rcName, element);
+ if (member.getModifiers().isConstant() && !element.getModifiers().isConstant()) {
+ onError(rcName,
+ ResolverErrorCode.REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_CONST);
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
context = previousContext;
innermostFunction = currentMethod = null;
enclosingElement = previousEnclosingElement;

Powered by Google App Engine
This is Rietveld 408576698