| Index: lib/src/checker/checker.dart
|
| diff --git a/lib/src/checker/checker.dart b/lib/src/checker/checker.dart
|
| index 296e646e45693e82e81194d04c4c75ad70b73167..46b909ab86f19e5f0fa82433114c257ee6836a63 100644
|
| --- a/lib/src/checker/checker.dart
|
| +++ b/lib/src/checker/checker.dart
|
| @@ -333,27 +333,27 @@ class _OverrideChecker {
|
|
|
| /// Checks the body of functions and properties.
|
| class CodeChecker extends RecursiveAstVisitor {
|
| - final TypeRules _rules;
|
| - final AnalysisErrorListener _reporter;
|
| + final TypeRules rules;
|
| + final AnalysisErrorListener reporter;
|
| final _OverrideChecker _overrideChecker;
|
| bool _failure = false;
|
| bool get failure => _failure || _overrideChecker._failure;
|
|
|
| CodeChecker(TypeRules rules, AnalysisErrorListener reporter,
|
| StrongModeOptions options)
|
| - : _rules = rules,
|
| - _reporter = reporter,
|
| + : rules = rules,
|
| + reporter = reporter,
|
| _overrideChecker = new _OverrideChecker(rules, reporter, options);
|
|
|
| @override
|
| void visitCompilationUnit(CompilationUnit unit) {
|
| void report(Expression expr) {
|
| - _reporter.onError(new MissingTypeError(expr).toAnalysisError());
|
| + reporter.onError(new MissingTypeError(expr).toAnalysisError());
|
| }
|
| - var callback = _rules.reportMissingType;
|
| - _rules.reportMissingType = report;
|
| + var callback = rules.reportMissingType;
|
| + rules.reportMissingType = report;
|
| unit.visitChildren(this);
|
| - _rules.reportMissingType = callback;
|
| + rules.reportMissingType = callback;
|
| }
|
|
|
| @override
|
| @@ -374,7 +374,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| if (token.type != TokenType.EQ) {
|
| _checkCompoundAssignment(node);
|
| } else {
|
| - DartType staticType = _rules.getStaticType(node.leftHandSide);
|
| + DartType staticType = rules.getStaticType(node.leftHandSide);
|
| checkAssignment(node.rightHandSide, staticType);
|
| }
|
| node.visitChildren(this);
|
| @@ -397,7 +397,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| @override
|
| void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
|
| var field = node.fieldName;
|
| - DartType staticType = _rules.elementType(field.staticElement);
|
| + DartType staticType = rules.elementType(field.staticElement);
|
| checkAssignment(node.expression, staticType);
|
| node.visitChildren(this);
|
| }
|
| @@ -406,7 +406,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| void visitForEachStatement(ForEachStatement node) {
|
| // Check that the expression is an Iterable.
|
| var expr = node.iterable;
|
| - var iterableType = _rules.provider.iterableType;
|
| + var iterableType = rules.provider.iterableType;
|
| var loopVariable = node.identifier != null
|
| ? node.identifier
|
| : node.loopVariable.identifier;
|
| @@ -453,7 +453,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| @override
|
| void visitListLiteral(ListLiteral node) {
|
| - var type = _rules.provider.dynamicType;
|
| + var type = rules.provider.dynamicType;
|
| if (node.typeArguments != null) {
|
| var targs = node.typeArguments.arguments;
|
| if (targs.length > 0) type = targs[0].type;
|
| @@ -467,8 +467,8 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| @override
|
| void visitMapLiteral(MapLiteral node) {
|
| - var ktype = _rules.provider.dynamicType;
|
| - var vtype = _rules.provider.dynamicType;
|
| + var ktype = rules.provider.dynamicType;
|
| + var vtype = rules.provider.dynamicType;
|
| if (node.typeArguments != null) {
|
| var targs = node.typeArguments.arguments;
|
| if (targs.length > 0) ktype = targs[0].type;
|
| @@ -500,8 +500,8 @@ class CodeChecker extends RecursiveAstVisitor {
|
| // TODO(vsm): When can this happen?
|
| assert(element != null);
|
| }
|
| - DartType expectedType = _rules.elementType(element);
|
| - if (expectedType == null) expectedType = _rules.provider.dynamicType;
|
| + DartType expectedType = rules.elementType(element);
|
| + if (expectedType == null) expectedType = rules.provider.dynamicType;
|
| checkArgument(arg, expectedType);
|
| }
|
| }
|
| @@ -517,19 +517,19 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| void checkFunctionApplication(
|
| Expression node, Expression f, ArgumentList list) {
|
| - if (_rules.isDynamicCall(f)) {
|
| + if (rules.isDynamicCall(f)) {
|
| // If f is Function and this is a method invocation, we should have
|
| // gotten an analyzer error, so no need to issue another error.
|
| _recordDynamicInvoke(node, f);
|
| } else {
|
| - checkArgumentList(list, _rules.getTypeAsCaller(f));
|
| + checkArgumentList(list, rules.getTypeAsCaller(f));
|
| }
|
| }
|
|
|
| @override
|
| visitMethodInvocation(MethodInvocation node) {
|
| var target = node.realTarget;
|
| - if (_rules.isDynamicTarget(target)) {
|
| + if (rules.isDynamicTarget(target)) {
|
| _recordDynamicInvoke(node, target);
|
|
|
| // Mark the tear-off as being dynamic, too. This lets us distinguish
|
| @@ -582,14 +582,14 @@ class CodeChecker extends RecursiveAstVisitor {
|
| FunctionType functionType;
|
| var parent = body.parent;
|
| if (parent is Declaration) {
|
| - functionType = _rules.elementType(parent.element);
|
| + functionType = rules.elementType(parent.element);
|
| } else {
|
| assert(parent is FunctionExpression);
|
| - functionType = _rules.getStaticType(parent);
|
| + functionType = rules.getStaticType(parent);
|
| }
|
|
|
| var type = functionType.returnType;
|
| - var provider = _rules.provider;
|
| + var provider = rules.provider;
|
|
|
| InterfaceType expectedType = null;
|
| if (body.isAsynchronous) {
|
| @@ -671,14 +671,14 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| @override
|
| void visitAwaitExpression(AwaitExpression node) {
|
| - checkAssignment(node.expression, _rules.provider.futureDynamicType);
|
| + checkAssignment(node.expression, rules.provider.futureDynamicType);
|
| node.visitChildren(this);
|
| }
|
|
|
| @override
|
| void visitPropertyAccess(PropertyAccess node) {
|
| var target = node.realTarget;
|
| - if (_rules.isDynamicTarget(target)) {
|
| + if (rules.isDynamicTarget(target)) {
|
| _recordDynamicInvoke(node, target);
|
| }
|
| node.visitChildren(this);
|
| @@ -687,7 +687,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| @override
|
| void visitPrefixedIdentifier(PrefixedIdentifier node) {
|
| final target = node.prefix;
|
| - if (_rules.isDynamicTarget(target)) {
|
| + if (rules.isDynamicTarget(target)) {
|
| _recordDynamicInvoke(node, target);
|
| }
|
| node.visitChildren(this);
|
| @@ -697,13 +697,13 @@ class CodeChecker extends RecursiveAstVisitor {
|
| void visitDefaultFormalParameter(DefaultFormalParameter node) {
|
| // Check that defaults have the proper subtype.
|
| var parameter = node.parameter;
|
| - var parameterType = _rules.elementType(parameter.element);
|
| + var parameterType = rules.elementType(parameter.element);
|
| assert(parameterType != null);
|
| var defaultValue = node.defaultValue;
|
| if (defaultValue == null) {
|
| - if (_rules.maybeNonNullableType(parameterType)) {
|
| + if (rules.maybeNonNullableType(parameterType)) {
|
| var staticInfo = new InvalidVariableDeclaration(
|
| - _rules, node.identifier, parameterType);
|
| + rules, node.identifier, parameterType);
|
| _recordMessage(staticInfo);
|
| }
|
| } else {
|
| @@ -718,13 +718,13 @@ class CodeChecker extends RecursiveAstVisitor {
|
| var element = node.element;
|
| var typeName = node.type;
|
| if (typeName != null) {
|
| - var type = _rules.elementType(element);
|
| + var type = rules.elementType(element);
|
| var fieldElement =
|
| node.identifier.staticElement as FieldFormalParameterElement;
|
| - var fieldType = _rules.elementType(fieldElement.field);
|
| - if (!_rules.isSubTypeOf(type, fieldType)) {
|
| + var fieldType = rules.elementType(fieldElement.field);
|
| + if (!rules.isSubTypeOf(type, fieldType)) {
|
| var staticInfo =
|
| - new InvalidParameterDeclaration(_rules, node, fieldType);
|
| + new InvalidParameterDeclaration(rules, node, fieldType);
|
| _recordMessage(staticInfo);
|
| }
|
| }
|
| @@ -736,7 +736,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| var arguments = node.argumentList;
|
| var element = node.staticElement;
|
| if (element != null) {
|
| - var type = _rules.elementType(node.staticElement);
|
| + var type = rules.elementType(node.staticElement);
|
| checkArgumentList(arguments, type);
|
| } else {
|
| _recordMessage(new MissingTypeError(node));
|
| @@ -757,7 +757,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| var initializer = variable.initializer;
|
| if (initializer != null) {
|
| checkAssignment(initializer, dartType);
|
| - } else if (_rules.maybeNonNullableType(dartType)) {
|
| + } else if (rules.maybeNonNullableType(dartType)) {
|
| var element = variable.element;
|
| if (element is FieldElement && !element.isStatic) {
|
| // Initialized - possibly implicitly - during construction.
|
| @@ -767,7 +767,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| // report a static error (must fail) or warning (can fail).
|
| } else {
|
| var staticInfo =
|
| - new InvalidVariableDeclaration(_rules, variable, dartType);
|
| + new InvalidVariableDeclaration(rules, variable, dartType);
|
| _recordMessage(staticInfo);
|
| }
|
| }
|
| @@ -778,7 +778,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| void _checkRuntimeTypeCheck(AstNode node, TypeName typeName) {
|
| var type = getType(typeName);
|
| - if (!_rules.isGroundType(type)) {
|
| + if (!rules.isGroundType(type)) {
|
| _recordMessage(new InvalidRuntimeCheckError(node, type));
|
| }
|
| }
|
| @@ -818,7 +818,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| if (op.isUserDefinableOperator ||
|
| op.type == TokenType.PLUS_PLUS ||
|
| op.type == TokenType.MINUS_MINUS) {
|
| - if (_rules.isDynamicTarget(node.operand)) {
|
| + if (rules.isDynamicTarget(node.operand)) {
|
| _recordDynamicInvoke(node, node.operand);
|
| }
|
| // For ++ and --, even if it is not dynamic, we still need to check
|
| @@ -831,7 +831,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| void visitBinaryExpression(BinaryExpression node) {
|
| var op = node.operator;
|
| if (op.isUserDefinableOperator) {
|
| - if (_rules.isDynamicTarget(node.leftOperand)) {
|
| + if (rules.isDynamicTarget(node.leftOperand)) {
|
| // Dynamic invocation
|
| // TODO(vsm): Move this logic to the resolver?
|
| if (op.type != TokenType.EQ_EQ && op.type != TokenType.BANG_EQ) {
|
| @@ -877,7 +877,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| @override
|
| void visitIndexExpression(IndexExpression node) {
|
| var target = node.realTarget;
|
| - if (_rules.isDynamicTarget(target)) {
|
| + if (rules.isDynamicTarget(target)) {
|
| _recordDynamicInvoke(node, target);
|
| } else {
|
| var element = node.staticElement;
|
| @@ -896,20 +896,20 @@ class CodeChecker extends RecursiveAstVisitor {
|
| }
|
|
|
| DartType getType(TypeName name) {
|
| - return (name == null) ? _rules.provider.dynamicType : name.type;
|
| + return (name == null) ? rules.provider.dynamicType : name.type;
|
| }
|
|
|
| /// Analyzer checks boolean conversions, but we need to check too, because
|
| /// it uses the default assignability rules that allow `dynamic` and `Object`
|
| /// to be assigned to bool with no message.
|
| void checkBoolean(Expression expr) =>
|
| - checkAssignment(expr, _rules.provider.boolType);
|
| + checkAssignment(expr, rules.provider.boolType);
|
|
|
| void checkAssignment(Expression expr, DartType type) {
|
| if (expr is ParenthesizedExpression) {
|
| checkAssignment(expr.expression, type);
|
| } else {
|
| - _recordMessage(_rules.checkAssignment(expr, type));
|
| + _recordMessage(rules.checkAssignment(expr, type));
|
| }
|
| }
|
|
|
| @@ -928,11 +928,11 @@ class CodeChecker extends RecursiveAstVisitor {
|
| case TokenType.STAR_EQ:
|
| case TokenType.TILDE_SLASH_EQ:
|
| case TokenType.PERCENT_EQ:
|
| - if (_rules.isIntType(t1) && _rules.isIntType(t2)) return t1;
|
| - if (_rules.isDoubleType(t1) && _rules.isDoubleType(t2)) return t1;
|
| + if (rules.isIntType(t1) && rules.isIntType(t2)) return t1;
|
| + if (rules.isDoubleType(t1) && rules.isDoubleType(t2)) return t1;
|
| // This particular combo is not spelled out in the spec, but all
|
| // implementations and analyzer seem to follow this.
|
| - if (_rules.isDoubleType(t1) && _rules.isIntType(t2)) return t1;
|
| + if (rules.isDoubleType(t1) && rules.isIntType(t2)) return t1;
|
| }
|
| return normalReturnType;
|
| }
|
| @@ -955,24 +955,24 @@ class CodeChecker extends RecursiveAstVisitor {
|
|
|
| // Check the lhs type
|
| var staticInfo;
|
| - var rhsType = _rules.getStaticType(expr.rightHandSide);
|
| - var lhsType = _rules.getStaticType(expr.leftHandSide);
|
| + var rhsType = rules.getStaticType(expr.rightHandSide);
|
| + var lhsType = rules.getStaticType(expr.leftHandSide);
|
| var returnType = _specializedBinaryReturnType(
|
| op, lhsType, rhsType, functionType.returnType);
|
|
|
| - if (!_rules.isSubTypeOf(returnType, lhsType)) {
|
| - final numType = _rules.provider.numType;
|
| + if (!rules.isSubTypeOf(returnType, lhsType)) {
|
| + final numType = rules.provider.numType;
|
| // Try to fix up the numerical case if possible.
|
| - if (_rules.isSubTypeOf(lhsType, numType) &&
|
| - _rules.isSubTypeOf(lhsType, rhsType)) {
|
| + if (rules.isSubTypeOf(lhsType, numType) &&
|
| + rules.isSubTypeOf(lhsType, rhsType)) {
|
| // This is also slightly different from spec, but allows us to keep
|
| // compound operators in the int += num and num += dynamic cases.
|
| staticInfo = DownCast.create(
|
| - _rules, expr.rightHandSide, Coercion.cast(rhsType, lhsType));
|
| + rules, expr.rightHandSide, Coercion.cast(rhsType, lhsType));
|
| rhsType = lhsType;
|
| } else {
|
| // Static type error
|
| - staticInfo = new StaticTypeError(_rules, expr, lhsType);
|
| + staticInfo = new StaticTypeError(rules, expr, lhsType);
|
| }
|
| _recordMessage(staticInfo);
|
| }
|
| @@ -980,14 +980,14 @@ class CodeChecker extends RecursiveAstVisitor {
|
| // Check the rhs type
|
| if (staticInfo is! CoercionInfo) {
|
| var paramType = paramTypes.first;
|
| - staticInfo = _rules.checkAssignment(expr.rightHandSide, paramType);
|
| + staticInfo = rules.checkAssignment(expr.rightHandSide, paramType);
|
| _recordMessage(staticInfo);
|
| }
|
| }
|
| }
|
|
|
| void _recordDynamicInvoke(AstNode node, AstNode target) {
|
| - _reporter.onError(new DynamicInvoke(_rules, node).toAnalysisError());
|
| + reporter.onError(new DynamicInvoke(rules, node).toAnalysisError());
|
| // TODO(jmesserly): we may eventually want to record if the whole operation
|
| // (node) was dynamic, rather than the target, but this is an easier fit
|
| // with what we used to do.
|
| @@ -998,7 +998,7 @@ class CodeChecker extends RecursiveAstVisitor {
|
| if (info == null) return;
|
| var error = info.toAnalysisError();
|
| if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) _failure = true;
|
| - _reporter.onError(error);
|
| + reporter.onError(error);
|
|
|
| if (info is CoercionInfo) {
|
| assert(CoercionInfo.get(info.node) == null);
|
|
|