| 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);
|
|
|