anchor.diff:    HashMap<Source, ChangeNoticeImpl> _pendingNotices = new HashMap<Source, ChangeNoticeImpl>();
   
     /**
  -   * A set containing information about the tasks that have been performed since the last change
  -   * notification. Used to detect infinite loops in [performAnalysisTask].
  -   */
  -  LinkedHashSet<String> _recentTasks = new LinkedHashSet<String>();
  -
  -  /**
  -   * A flag indicating whether we have already reported an infinite loop in
  -   * [performAnalysisTask].
  -   */
  -  bool _reportedLoop = false;
  -
  -  /**
      * The object used to synchronize access to all of the caches. The rules related to the use of
      * this lock object are
      * * no analysis work is done while holding the lock, and
  
positive.code:       return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null, -1);
      }
      String taskDescription = task.toString();
      //    if (!reportedLoop && !recentTasks.add(taskDescription)) {
      //      reportedLoop = true;
      //      @SuppressWarnings("resource")
      //      PrintStringWriter writer = new PrintStringWriter();
      //      writer.print("Performing repeated task: ");
      //      writer.println(taskDescription);
      //      for (String description : recentTasks) {
      //        writer.print("  ");
      //        writer.println(description);
      //      }
      //      logInformation(writer.toString());
      //    }
      _notifyAboutToPerformTask(taskDescription);
      if (_TRACE_PERFORM_TASK) {
        print(taskDescription);
  
negative.code:     if (changeSet.isEmpty) {
        return;
      }
      //
      // First, compute the list of sources that have been removed.
      //
  