Index: pkg/analyzer/lib/src/task/strong_mode.dart |
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart |
index 208521f061f47cae0a054108792b76974e723f67..ea3559ded41723b04473d827b2846b5cf84f8a05 100644 |
--- a/pkg/analyzer/lib/src/task/strong_mode.dart |
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart |
@@ -263,6 +263,11 @@ class InstanceMemberInferrer { |
classElement.fields.forEach(_inferField); |
classElement.accessors.forEach(_inferExecutable); |
classElement.methods.forEach(_inferExecutable); |
+ // |
+ // Infer initializing formal parameter types. This must happen after |
+ // field types are inferred. |
+ // |
+ classElement.constructors.forEach(_inferConstructorFieldFormals); |
classElement.hasBeenInferred = true; |
} finally { |
elementsBeingInferred.remove(classElement); |
@@ -441,6 +446,21 @@ class InstanceMemberInferrer { |
ExecutableElement element, List<ExecutableElement> elements) { |
return elements.every((e) => e.kind == element.kind); |
} |
+ |
+ void _inferConstructorFieldFormals(ConstructorElement element) { |
+ for (ParameterElement p in element.parameters) { |
+ if (p is FieldFormalParameterElement) { |
+ _inferFieldFormalParameter(p); |
+ } |
+ } |
+ } |
+ |
+ void _inferFieldFormalParameter(FieldFormalParameterElement element) { |
+ FieldElement field = element.field; |
+ if (field != null && element.hasImplicitType) { |
+ (element as FieldFormalParameterElementImpl).type = field.type; |
+ } |
+ } |
} |
/** |