private void replaceReferences(
     String varName, InputId inputId, ReferenceCollection newSourceCollection) {
   ReferenceCollection combined = new ReferenceCollection();
   List<Reference> combinedRefs = combined.references;
   ReferenceCollection oldCollection = refMap.get(varName);
   refMap.put(varName, combined);
   if (oldCollection == null) {
     combinedRefs.addAll(newSourceCollection.references);
     return;
   }
   // otherwise replace previous references that are from sourceName
   SourceRefRange range = findSourceRefRange(oldCollection.references, inputId);
   combinedRefs.addAll(range.refsBefore());
   combinedRefs.addAll(newSourceCollection.references);
   combinedRefs.addAll(range.refsAfter());
 }
  private void removeScriptReferences(InputId inputId) {
    Preconditions.checkNotNull(inputId);

    if (!inputOrder.containsKey(inputId)) {
      return; // Input did not exist when last computed, so skip
    }
    // TODO(bashir): If this is too slow it is not too difficult to make it
    // faster with keeping an index for variables accessed in sourceName.
    for (ReferenceCollection collection : refMap.values()) {
      if (collection == null) {
        continue;
      }
      List<Reference> oldRefs = collection.references;
      SourceRefRange range = findSourceRefRange(oldRefs, inputId);
      List<Reference> newRefs = new ArrayList<>(range.refsBefore());
      newRefs.addAll(range.refsAfter());
      collection.references = newRefs;
    }
  }