| Index: pkg/analyzer/lib/src/generated/resolver.dart
|
| diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
|
| index 35616c6ae255120dd5716a7f07536e9b4cd9703c..30f07e256998987416e7ea500fb265d080434417 100644
|
| --- a/pkg/analyzer/lib/src/generated/resolver.dart
|
| +++ b/pkg/analyzer/lib/src/generated/resolver.dart
|
| @@ -3044,6 +3044,9 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
|
| setter.variable = variable;
|
| setter.setter = true;
|
| setter.static = true;
|
| + if (node.returnType == null) {
|
| + setter.hasImplicitReturnType = true;
|
| + }
|
| variable.setter = setter;
|
| variable.final2 = false;
|
| _currentHolder.addAccessor(setter);
|
| @@ -3270,6 +3273,9 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
|
| setter.abstract = node.isAbstract;
|
| setter.setter = true;
|
| setter.static = isStatic;
|
| + if (node.returnType == null) {
|
| + setter.hasImplicitReturnType = true;
|
| + }
|
| field.setter = setter;
|
| field.final2 = false;
|
| _currentHolder.addAccessor(setter);
|
| @@ -11758,6 +11764,11 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| bool _hasReferenceToSuper = false;
|
|
|
| /**
|
| + * True if we're analyzing in strong mode.
|
| + */
|
| + bool _strongMode;
|
| +
|
| + /**
|
| * Initialize a newly created visitor to resolve the nodes in an AST node.
|
| *
|
| * [definingLibrary] is the element for the library containing the node being
|
| @@ -11779,6 +11790,7 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| nameScope: nameScope) {
|
| _dynamicType = typeProvider.dynamicType;
|
| _undefinedType = typeProvider.undefinedType;
|
| + _strongMode = definingLibrary.context.analysisOptions.strongMode;
|
| }
|
|
|
| @override
|
| @@ -12019,6 +12031,7 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| }
|
| element.returnType = _computeReturnType(node.returnType);
|
| element.type = new FunctionTypeImpl(element);
|
| + _inferSetterReturnType(element);
|
| return null;
|
| }
|
|
|
| @@ -12067,6 +12080,7 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| }
|
| element.returnType = _computeReturnType(node.returnType);
|
| element.type = new FunctionTypeImpl(element);
|
| + _inferSetterReturnType(element);
|
| if (element is PropertyAccessorElement) {
|
| PropertyAccessorElement accessor = element as PropertyAccessorElement;
|
| PropertyInducingElementImpl variable =
|
| @@ -12595,6 +12609,20 @@ class TypeResolverVisitor extends ScopedVisitor {
|
| return type;
|
| }
|
|
|
| + /**
|
| + * In strong mode we infer "void" as the setter return type (as void is the
|
| + * only legal return type for a setter). This allows us to give better
|
| + * errors later if an invalid type is returned.
|
| + */
|
| + void _inferSetterReturnType(ExecutableElementImpl element) {
|
| + if (_strongMode &&
|
| + element is PropertyAccessorElementImpl &&
|
| + element.isSetter &&
|
| + element.hasImplicitReturnType) {
|
| + element.returnType = VoidTypeImpl.instance;
|
| + }
|
| + }
|
| +
|
| DartType _instantiateType(DartType type, List<DartType> typeArguments) {
|
| if (type is InterfaceTypeImpl) {
|
| return type.substitute4(typeArguments);
|
|
|