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

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

Issue 8351013: Correct method override checks to conform to the spec.wq (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 9 years, 2 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
« no previous file with comments | « no previous file | compiler/java/com/google/dart/compiler/type/Types.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
===================================================================
--- compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java (revision 638)
+++ compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java (working copy)
@@ -170,7 +170,7 @@
private final Type nullType;
private final InterfaceType functionType;
private final InterfaceType dynamicIteratorType;
-
+
/**
* Keeps track of the number of nested catches, used to detect re-throws
* outside of any catch block.
@@ -611,6 +611,11 @@
private Type nonVoidTypeOf(DartNode node) {
Type type = typeOf(node);
+ if(type == null) {
+ throw new AssertionError("unexpected type for:"
+ + node.getClass().getName() + ":" + node.toString()
+ + " parent:" + node.getParent().getClass().getName());
+ }
if (type.getKind().equals(TypeKind.VOID)) {
return typeError(node, DartCompilerErrorCode.VOID);
}
@@ -806,7 +811,7 @@
if (node.introducesVariable()) {
variableType = typeOf(node.getVariableStatement());
} else {
- variableType = typeOf(node.getIdentifier());
+ variableType = typeOf(node.getIdentifier());
}
DartExpression iterableExpression = node.getIterable();
Type iterableType = typeOf(iterableExpression);
@@ -814,10 +819,10 @@
if (iteratorMember != null) {
if (TypeKind.of(iteratorMember.getType()) == TypeKind.FUNCTION) {
FunctionType iteratorMethod = (FunctionType) iteratorMember.getType();
- InterfaceType asInstanceOf = types.asInstanceOf(iteratorMethod.getReturnType(),
+ InterfaceType asInstanceOf = types.asInstanceOf(iteratorMethod.getReturnType(),
dynamicIteratorType.getElement());
if (asInstanceOf != null) {
- checkAssignable(iterableExpression, variableType, asInstanceOf.getArguments().get(0));
+ checkAssignable(iterableExpression, variableType, asInstanceOf.getArguments().get(0));
} else {
InterfaceType expectedIteratorType = dynamicIteratorType.subst(
Arrays.asList(variableType), dynamicIteratorType.getElement().getTypeParameters());
@@ -830,7 +835,7 @@
typeError(iterableExpression, DartCompilerErrorCode.FOR_IN_WITH_ITERATOR_FIELD);
}
}
-
+
return typeAsVoid(node);
}
@@ -1609,7 +1614,13 @@
private void checkOverride(DartExpression node, Element member, Element superElement) {
String name = member.getName();
Type superMember = typeAsMemberOf(superElement, currentClass);
- if (!types.isAssignable(superMember, member.getType())) {
+ if (member.getKind() == ElementKind.METHOD && superElement.getKind() == ElementKind.METHOD) {
+ if (!types.isSubtype(member.getType(), superMember)) {
+ typeError(node, DartCompilerErrorCode.CANNOT_OVERRIDE_TYPED_MEMBER,
+ name, superElement.getEnclosingElement().getName(),
+ member.getType(), superMember);
+ }
+ } else if (!types.isAssignable(superMember, member.getType())) {
typeError(node, DartCompilerErrorCode.CANNOT_OVERRIDE_TYPED_MEMBER,
name, superElement.getEnclosingElement().getName(),
member.getType(), superMember);
« no previous file with comments | « no previous file | compiler/java/com/google/dart/compiler/type/Types.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698