Index: lib/src/checker/resolver.dart |
diff --git a/lib/src/checker/resolver.dart b/lib/src/checker/resolver.dart |
index b4954453288a42725160dd232a8e7a4d27e01c5c..698e2f836cabfc3000a93c00ea9e136a671c90a2 100644 |
--- a/lib/src/checker/resolver.dart |
+++ b/lib/src/checker/resolver.dart |
@@ -168,10 +168,10 @@ class LibraryResolverWithInference extends LibraryResolver { |
.forEach((f) => _inferFieldTypeFromOverride(f, pending)); |
if (pending.isNotEmpty) _inferVariableFromInitializer(pending); |
- // Infer return-types from overrides |
+ // Infer return-types and param-types from overrides |
cls.members |
.where((m) => m is MethodDeclaration && !m.isStatic) |
- .forEach(_inferMethodReturnTypeFromOverride); |
+ .forEach(_inferMethodTypesFromOverride); |
} else { |
_inferVariableFromInitializer(cls.members |
.where(_isInstanceField) |
@@ -231,18 +231,38 @@ class LibraryResolverWithInference extends LibraryResolver { |
} |
} |
- void _inferMethodReturnTypeFromOverride(MethodDeclaration method) { |
+ void _inferMethodTypesFromOverride(MethodDeclaration method) { |
var methodElement = method.element; |
- if ((methodElement is MethodElement || |
- methodElement is PropertyAccessorElement) && |
- methodElement.returnType.isDynamic && |
- method.returnType == null) { |
- var enclosingElement = methodElement.enclosingElement as ClassElement; |
- var type = searchTypeFor(enclosingElement.type, methodElement); |
+ if (methodElement is! MethodElement && |
+ methodElement is! PropertyAccessorElement) return; |
+ |
+ var enclosingElement = methodElement.enclosingElement as ClassElement; |
+ FunctionType type = |
+ null; // searchTypeFor(enclosingElement.type, methodElement); |
+ |
+ // Infer the return type if omitted |
+ if (methodElement.returnType.isDynamic && method.returnType == null) { |
+ type = searchTypeFor(enclosingElement.type, methodElement); |
if (type != null && !type.returnType.isDynamic) { |
methodElement.returnType = type.returnType; |
} |
} |
+ |
+ // Infer parameter types if omitted |
Brian Wilkerson
2015/08/25 14:06:29
In the ported version of the code we get all of th
vsm
2015/08/25 15:43:47
Perhaps we should do equality for params as well t
Brian Wilkerson
2015/08/25 15:54:51
For the return type we'd need a greatest lower bou
Leaf
2015/08/25 17:03:50
I think equality is fine for now. For return type
|
+ if (method.parameters == null) return; |
+ var parameters = method.parameters.parameters; |
+ var length = parameters.length; |
+ for (int i = 0; i < length; ++i) { |
+ var parameter = parameters[i]; |
+ if (parameter is SimpleFormalParameter && parameter.type == null) { |
+ type = type ?? searchTypeFor(enclosingElement.type, methodElement); |
Brian Wilkerson
2015/08/25 14:06:29
I can't say I'm fond of the lazy initialization te
vsm
2015/08/25 15:43:47
Yes, it looks like a fairly expensive operation th
|
+ if (type != null && |
+ type.parameters.length > i && |
+ !type.parameters[i].type.isDynamic) { |
+ parameter.element.type = type.parameters[i].type; |
+ } |
+ } |
+ } |
} |
void _inferVariableFromInitializer(Iterable<VariableDeclaration> variables) { |