anchor.diff:  ```
   ''';
   
  -bool _isMutated(
  -        VariableDeclaration variable, CompilationUnit compilationUnit) =>
  -    DartTypeUtilities
  -        .traverseNodesInDFS(compilationUnit)
  -        .any((n) =>
  -            (n is AssignmentExpression &&
  -                DartTypeUtilities
  -                        .getCanonicalElementFromIdentifier(n.leftHandSide) ==
  -                    variable.element) ||
  -            (n is PrefixExpression &&
  -                DartTypeUtilities
  -                        .getCanonicalElementFromIdentifier(n.operand) ==
  -                    variable.element) ||
  -            (n is PostfixExpression &&
  -                DartTypeUtilities
  -                        .getCanonicalElementFromIdentifier(n.operand) ==
  -                    variable.element));
  -
   class PreferFinalFields extends LintRule {
  -  _Visitor _visitor;
  -
     PreferFinalFields()
         : super(
               name: 'prefer_final_fields',
               description: _desc,
               details: _details,
  -            group: Group.style) {
  -    _visitor = new _Visitor(this);
  -  }
  +            group: Group.style);
   
     @override
  -  AstVisitor getVisitor() => _visitor;
  +  AstVisitor getVisitor() => new _Visitor(this);
   }
   
   class _Visitor extends SimpleAstVisitor {
     final LintRule rule;
  +  final Set<Element> _mutatedElements = new HashSet<Element>();
  +
     _Visitor(this.rule);
  +
  +  @override
  +  void visitCompilationUnit(CompilationUnit node) {
  +    void recurse(node) {
  +      if (node is AstNode) {
  +        if (node is AssignmentExpression) {
  +          _mutatedElements.add(DartTypeUtilities
  +              .getCanonicalElementFromIdentifier(node.leftHandSide));
  +        } else if (node is PrefixExpression) {
  +          _mutatedElements.add(DartTypeUtilities
  +              .getCanonicalElementFromIdentifier(node.operand));
  +        } else if (node is PostfixExpression) {
  +          _mutatedElements.add(DartTypeUtilities
  +              .getCanonicalElementFromIdentifier(node.operand));
  +        }
  +        node.childEntities.forEach(recurse);
  +      }
  +    }
  +
  +    recurse(node);
  +  }
   
     @override
     void visitFieldDeclaration(FieldDeclaration node) {
       final fields = node.fields;
       if (fields.isFinal || fields.isConst) {
  -      return;
  -    }
  -
  -    CompilationUnit compilationUnit =
  -        node.getAncestor((a) => a is CompilationUnit);
  -    if (compilationUnit == null) {
         return;
       }
   
  
positive.code:         return;
        }
  
        final isMutated = _isMutated(variable, compilationUnit);
  
        if (isMutated) {
          return;
        }
  
        rule.reportLint(variable);
      });
    }
  }
  
negative.code: // for details. All rights reserved. Use of this source code is governed by a
  // BSD-style license that can be found in the LICENSE file.
  
  import 'dart:collection';
  
  import 'package:analyzer/dart/ast/ast.dart';
  import 'package:analyzer/dart/ast/standard_resolution_map.dart';
  import 'package:analyzer/dart/ast/visitor.dart';
  import 'package:analyzer/dart/element/element.dart';
  import 'package:linter/src/analyzer.dart';
  import 'package:linter/src/util/dart_type_utilities.dart';
  
  