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

Unified Diff: lib/src/checker/resolver.dart

Issue 1311863005: Infer parameter types on overrides (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Infer on untyped default optional params as well Created 5 years, 4 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 | « lib/runtime/dart/js.js ('k') | test/checker/checker_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/checker/resolver.dart
diff --git a/lib/src/checker/resolver.dart b/lib/src/checker/resolver.dart
index b4954453288a42725160dd232a8e7a4d27e01c5c..655540c5216331750291c93cec8ddb2473fdbc49 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 (type != null && !type.returnType.isDynamic) {
+ if (methodElement is! MethodElement &&
+ methodElement is! PropertyAccessorElement) return;
+
+ var enclosingElement = methodElement.enclosingElement as ClassElement;
+ FunctionType type = null;
+
+ // Infer the return type if omitted
+ if (methodElement.returnType.isDynamic && method.returnType == null) {
+ type = searchTypeFor(enclosingElement.type, methodElement);
+ if (type == null) return;
+ if (!type.returnType.isDynamic) {
methodElement.returnType = type.returnType;
}
}
+
+ // Infer parameter types if omitted
+ 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 DefaultFormalParameter) parameter = parameter.parameter;
+ if (parameter is SimpleFormalParameter && parameter.type == null) {
+ type = type ?? searchTypeFor(enclosingElement.type, methodElement);
+ if (type == null) return;
+ if (type.parameters.length > i && !type.parameters[i].type.isDynamic) {
+ parameter.element.type = type.parameters[i].type;
+ }
+ }
+ }
}
void _inferVariableFromInitializer(Iterable<VariableDeclaration> variables) {
« no previous file with comments | « lib/runtime/dart/js.js ('k') | test/checker/checker_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698