| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.task.strong_mode; | 5 library analyzer.src.task.strong_mode; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/visitor.dart'; | 10 import 'package:analyzer/dart/ast/visitor.dart'; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 | 107 |
| 108 /** | 108 /** |
| 109 * Return `true` if the list of [elements] contains only methods. | 109 * Return `true` if the list of [elements] contains only methods. |
| 110 */ | 110 */ |
| 111 bool _allSameElementKind( | 111 bool _allSameElementKind( |
| 112 ExecutableElement element, List<ExecutableElement> elements) { | 112 ExecutableElement element, List<ExecutableElement> elements) { |
| 113 return elements.every((e) => e.kind == element.kind); | 113 return elements.every((e) => e.kind == element.kind); |
| 114 } | 114 } |
| 115 | 115 |
| 116 /** | 116 /** |
| 117 * Compute the inferred type for the given property accessor [element]. The | 117 * Compute the inferred type for the given property [accessor]. The returned |
| 118 * returned value is never `null`, but might be an error, and/or have the | 118 * value is never `null`, but might be an error, and/or have the `null` type. |
| 119 * `null` type. | |
| 120 */ | 119 */ |
| 121 _FieldOverrideInferenceResult _computeFieldOverrideType( | 120 _FieldOverrideInferenceResult _computeFieldOverrideType( |
| 122 ExecutableElement element) { | 121 PropertyAccessorElement accessor) { |
| 123 String name = element.displayName; | 122 String name = accessor.displayName; |
| 124 | 123 |
| 125 var overriddenElements = <ExecutableElement>[]; | 124 var overriddenElements = <ExecutableElement>[]; |
| 126 overriddenElements.addAll( | 125 overriddenElements.addAll( |
| 127 inheritanceManager.lookupOverrides(element.enclosingElement, name)); | 126 inheritanceManager.lookupOverrides(accessor.enclosingElement, name)); |
| 128 overriddenElements.addAll( | 127 if (overriddenElements.isEmpty || !accessor.variable.isFinal) { |
| 129 inheritanceManager.lookupOverrides(element.enclosingElement, '$name=')); | 128 List<ExecutableElement> overriddenSetters = inheritanceManager |
| 129 .lookupOverrides(accessor.enclosingElement, '$name='); |
| 130 overriddenElements.addAll(overriddenSetters); |
| 131 } |
| 130 | 132 |
| 131 bool isCovariant = false; | 133 bool isCovariant = false; |
| 132 DartType impliedType; | 134 DartType impliedType; |
| 133 for (ExecutableElement overriddenElement in overriddenElements) { | 135 for (ExecutableElement overriddenElement in overriddenElements) { |
| 134 FunctionType overriddenType = | 136 FunctionType overriddenType = |
| 135 _toOverriddenFunctionType(element, overriddenElement); | 137 _toOverriddenFunctionType(accessor, overriddenElement); |
| 136 if (overriddenType == null) { | 138 if (overriddenType == null) { |
| 137 return new _FieldOverrideInferenceResult(false, null, true); | 139 return new _FieldOverrideInferenceResult(false, null, true); |
| 138 } | 140 } |
| 139 | 141 |
| 140 DartType type; | 142 DartType type; |
| 141 if (overriddenElement.kind == ElementKind.GETTER) { | 143 if (overriddenElement.kind == ElementKind.GETTER) { |
| 142 type = overriddenType.returnType; | 144 type = overriddenType.returnType; |
| 143 } else if (overriddenElement.kind == ElementKind.SETTER) { | 145 } else if (overriddenElement.kind == ElementKind.SETTER) { |
| 144 if (overriddenType.parameters.length == 1) { | 146 if (overriddenType.parameters.length == 1) { |
| 145 ParameterElement parameter = overriddenType.parameters[0]; | 147 ParameterElement parameter = overriddenType.parameters[0]; |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 AstNode parent = node.parent; | 612 AstNode parent = node.parent; |
| 611 if (parent is PropertyAccess && parent.propertyName == node || | 613 if (parent is PropertyAccess && parent.propertyName == node || |
| 612 parent is PrefixedIdentifier && parent.identifier == node) { | 614 parent is PrefixedIdentifier && parent.identifier == node) { |
| 613 isValid = false; | 615 isValid = false; |
| 614 } | 616 } |
| 615 } else if (element is PropertyAccessorElement && !element.isStatic) { | 617 } else if (element is PropertyAccessorElement && !element.isStatic) { |
| 616 isValid = false; | 618 isValid = false; |
| 617 } | 619 } |
| 618 } | 620 } |
| 619 } | 621 } |
| OLD | NEW |