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

Unified Diff: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java

Issue 11549014: Issue 7278. Report static warnings for redirecting factory constructors (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
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: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index e1790bf76d69ee56db249d91ed9a599397df3d32..1f2e102ee58ad4d3f551000a68190be3ef89cc10 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -2096,7 +2096,7 @@ public class TypeAnalyzer implements DartCompilationPhase {
DartTypeNode returnTypeNode = node.getFunction().getReturnTypeNode();
if (modifiers.isFactory()
&& ElementKind.of(methodElement).equals(ElementKind.CONSTRUCTOR)) {
- analyzeFactory(node.getName(), (ConstructorElement) methodElement);
+ analyzeFactory(node, node.getName(), (ConstructorElement) methodElement);
} else if (modifiers.isSetter()) {
if (returnTypeNode != null && returnTypeNode.getType() != voidType) {
typeError(returnTypeNode, TypeErrorCode.SETTER_RETURN_TYPE, methodElement.getName());
@@ -2187,7 +2187,8 @@ public class TypeAnalyzer implements DartCompilationPhase {
return superTypes;
}
- private void analyzeFactory(DartExpression name, final ConstructorElement methodElement) {
+ private void analyzeFactory(DartMethodDefinition node, DartExpression name,
+ final ConstructorElement methodElement) {
ASTVisitor<Void> visitor = new ASTVisitor<Void>() {
@Override
public Void visitParameterizedTypeNode(DartParameterizedTypeNode node) {
@@ -2207,6 +2208,25 @@ public class TypeAnalyzer implements DartCompilationPhase {
}
};
name.accept(visitor);
+ // redirecting factory constructor
+ if (methodElement instanceof ConstructorElement) {
+ ConstructorElement constructorElement = (ConstructorElement) methodElement;
+ ConstructorElement targetElement = constructorElement.getRedirectingFactoryConstructor();
+ if (targetElement != null) {
+ ClassElement targetEnclosingClass = (ClassElement) targetElement.getEnclosingElement();
+ Type sourceMethodType = methodElement.getType();
+ Type targetMethodType = targetElement.getType();
+ InterfaceType targetClassType = (InterfaceType) node.getRedirectedTypeName().getType();
+ targetMethodType = targetMethodType.subst(targetClassType.getArguments(),
+ targetEnclosingClass.getTypeParameters());
+ if (!types.isSubtype(targetMethodType, sourceMethodType)) {
+ DartNode errorNode = node.getRedirectedConstructorName() != null
+ ? node.getRedirectedConstructorName() : node.getRedirectedTypeName();
+ typeError(errorNode, TypeErrorCode.REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_SUBTYPE,
+ targetMethodType, sourceMethodType);
+ }
+ }
+ }
}
@Override

Powered by Google App Engine
This is Rietveld 408576698