Chromium Code Reviews| 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) { |