Index: pkg/analyzer/lib/src/task/strong/checker.dart |
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart |
index ac2f6ef780b889b883f68d6231aaee6cd4c62a88..0fd6f26590745d1b76e8192ede98376a7a3e9e42 100644 |
--- a/pkg/analyzer/lib/src/task/strong/checker.dart |
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart |
@@ -14,21 +14,13 @@ import 'package:analyzer/dart/ast/visitor.dart'; |
import 'package:analyzer/dart/element/element.dart'; |
import 'package:analyzer/dart/element/type.dart'; |
import 'package:analyzer/src/dart/element/type.dart'; |
+import 'package:analyzer/src/error/codes.dart' show StrongModeCode; |
import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl; |
-import 'package:analyzer/src/generated/error.dart' show StrongModeCode; |
import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; |
import 'package:analyzer/src/generated/type_system.dart'; |
import 'ast_properties.dart'; |
-bool isKnownFunction(Expression expression) { |
- var element = _getKnownElement(expression); |
- // First class functions and static methods, where we know the original |
- // declaration, will have an exact type, so we know a downcast will fail. |
- return element is FunctionElement || |
- element is MethodElement && element.isStatic; |
-} |
- |
/// Given an [expression] and a corresponding [typeSystem] and [typeProvider], |
/// gets the known static type of the expression. |
/// |
@@ -50,9 +42,20 @@ DartType getDefiniteType( |
return type; |
} |
-bool _hasStrictArrow(Expression expression) { |
+bool isKnownFunction(Expression expression) { |
var element = _getKnownElement(expression); |
- return element is FunctionElement || element is MethodElement; |
+ // First class functions and static methods, where we know the original |
+ // declaration, will have an exact type, so we know a downcast will fail. |
+ return element is FunctionElement || |
+ element is MethodElement && element.isStatic; |
+} |
+ |
+DartType _elementType(Element e) { |
+ if (e == null) { |
+ // Malformed code - just return dynamic. |
+ return DynamicTypeImpl.instance; |
+ } |
+ return (e as dynamic).type; |
} |
Element _getKnownElement(Expression expression) { |
@@ -69,16 +72,8 @@ Element _getKnownElement(Expression expression) { |
return null; |
} |
-DartType _elementType(Element e) { |
- if (e == null) { |
- // Malformed code - just return dynamic. |
- return DynamicTypeImpl.instance; |
- } |
- return (e as dynamic).type; |
-} |
- |
-// Return the field on type corresponding to member, or null if none |
-// exists or the "field" is actually a getter/setter. |
+/// Return the field on type corresponding to member, or null if none |
+/// exists or the "field" is actually a getter/setter. |
PropertyInducingElement _getMemberField( |
InterfaceType type, PropertyAccessorElement member) { |
String memberName = member.name; |
@@ -109,6 +104,11 @@ PropertyInducingElement _getMemberField( |
FunctionType _getMemberType(InterfaceType type, ExecutableElement member) => |
_memberTypeGetter(member)(type); |
+bool _hasStrictArrow(Expression expression) { |
+ var element = _getKnownElement(expression); |
+ return element is FunctionElement || element is MethodElement; |
+} |
+ |
_MemberTypeGetter _memberTypeGetter(ExecutableElement member) { |
String memberName = member.name; |
final isGetter = member is PropertyAccessorElement && member.isGetter; |
@@ -640,6 +640,20 @@ class CodeChecker extends RecursiveAstVisitor { |
} |
@override |
+ Object visitVariableDeclaration(VariableDeclaration node) { |
+ if (!node.isConst && |
+ !node.isFinal && |
+ node.initializer == null && |
+ rules.isNonNullableType(node?.element?.type)) { |
+ _recordMessage( |
+ node, |
+ StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED, |
+ [node.name, node?.element?.type]); |
+ } |
+ return super.visitVariableDeclaration(node); |
+ } |
+ |
+ @override |
void visitVariableDeclarationList(VariableDeclarationList node) { |
TypeName type = node.type; |
if (type == null) { |
@@ -658,20 +672,6 @@ class CodeChecker extends RecursiveAstVisitor { |
} |
@override |
- Object visitVariableDeclaration(VariableDeclaration node) { |
- if (!node.isConst && |
- !node.isFinal && |
- node.initializer == null && |
- rules.isNonNullableType(node?.element?.type)) { |
- _recordMessage( |
- node, |
- StaticTypeWarningCode.NON_NULLABLE_FIELD_NOT_INITIALIZED, |
- [node.name, node?.element?.type]); |
- } |
- return super.visitVariableDeclaration(node); |
- } |
- |
- @override |
void visitWhileStatement(WhileStatement node) { |
checkBoolean(node.condition); |
node.visitChildren(this); |
@@ -877,10 +877,11 @@ class CodeChecker extends RecursiveAstVisitor { |
/// Checks if the assignment is valid with respect to non-nullable types. |
/// Returns `false` if a nullable expression is assigned to a variable of |
/// non-nullable type and `true` otherwise. |
- bool _checkNonNullAssignment(Expression expression, DartType to, DartType from) { |
+ bool _checkNonNullAssignment( |
+ Expression expression, DartType to, DartType from) { |
if (rules.isNonNullableType(to) && rules.isNullableType(from)) { |
- _recordMessage(expression, StaticTypeWarningCode.INVALID_ASSIGNMENT, |
- [from, to]); |
+ _recordMessage( |
+ expression, StaticTypeWarningCode.INVALID_ASSIGNMENT, [from, to]); |
return false; |
} |
return true; |
@@ -923,6 +924,9 @@ class CodeChecker extends RecursiveAstVisitor { |
} |
} |
+ DartType _getDefiniteType(Expression expr) => |
+ getDefiniteType(expr, rules, typeProvider); |
+ |
/// Gets the expected return type of the given function [body], either from |
/// a normal return/yield, or from a yield*. |
DartType _getExpectedReturnType(FunctionBody body, {bool yieldStar: false}) { |
@@ -977,9 +981,6 @@ class CodeChecker extends RecursiveAstVisitor { |
} |
} |
- DartType _getDefiniteType(Expression expr) => |
- getDefiniteType(expr, rules, typeProvider); |
- |
/// Given an expression, return its type assuming it is |
/// in the caller position of a call (that is, accounting |
/// for the possibility of a call method). Returns null |