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

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

Issue 8786002: Check that interface constructors and default class constructors are compatible. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Check that types of constructors parameters are identical Created 9 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 248eb4532fce331887a0859f0e01bba53e1f609c..6ec0645eee0e00113015e07b0d74953b949fba3c 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -5,6 +5,7 @@
package com.google.dart.compiler.type;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
import com.google.dart.compiler.DartCompilationError;
@@ -727,10 +728,49 @@ public class TypeAnalyzer implements DartCompilationPhase {
validateTypeNode(node.getDefaultClass(), true);
}
visit(node.getMembers());
+ checkInterfaceConstructors(element);
setCurrentClass(null);
return type;
}
+ /**
+ * Checks that interface constructors have corresponding methods in default class.
+ */
+ private void checkInterfaceConstructors(ClassElement interfaceElement) {
+ // If no default class, do nothing.
+ if (interfaceElement.getDefaultClass() == null) {
+ return;
+ }
+ // Analyze all constructors.
+ String interfaceClassName = interfaceElement.getName();
+ String defaultClassName = interfaceElement.getDefaultClass().getElement().getName();
+ for (ConstructorElement interfaceConstructor : interfaceElement.getConstructors()) {
+ ConstructorElement defaultConstructor = interfaceConstructor.getDefaultConstructor();
+ if (defaultConstructor != null) {
+ // TODO(scheglov)
+ // It is a compile-time error if kI and kF do not have identical type parameters
+ // TODO /end
+ // Validate types of required and optional parameters.
+ {
+ List<String> interfaceTypes = Elements.getParameterTypeNames(interfaceConstructor);
+ List<String> defaultTypes = Elements.getParameterTypeNames(defaultConstructor);
+ if (interfaceTypes.size() == defaultTypes.size()
+ && !interfaceTypes.equals(defaultTypes)) {
+ onError(
+ interfaceConstructor.getNode(),
+ TypeErrorCode.FACTORY_CONSTRUCTOR_TYPES,
+ Elements.getRawMethodName(interfaceConstructor),
+ interfaceClassName,
+ Joiner.on(",").join(interfaceTypes),
+ Elements.getRawMethodName(defaultConstructor),
+ defaultClassName,
+ Joiner.on(",").join(defaultTypes));
+ }
+ }
+ }
+ }
+ }
+
private List<Element> findUnimplementedMembers(ClassElement element) {
if (element.isInterface()) {
element.getNode().accept(new AbstractMethodFinder(element.getType()));

Powered by Google App Engine
This is Rietveld 408576698