| 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);
 | 
| 
 |