public void saveInCache(@NotNull TIntObjectHashMap<T> details) {
   UIUtil.invokeAndWaitIfNeeded(
       (Runnable)
           () ->
               details.forEachEntry(
                   (key, value) -> {
                     myCache.put(key, value);
                     return true;
                   }));
 }
 public ContextRelevantStaticMethod(
     final PsiMethod psiMethod, @Nullable final TIntObjectHashMap<PsiVariable> parameters) {
   this.psiMethod = psiMethod;
   if (parameters == null) {
     this.parameters = null;
   } else {
     this.parameters = new TIntObjectHashMap<>(parameters.size());
     parameters.forEachEntry(
         new TIntObjectProcedure<PsiVariable>() {
           @SuppressWarnings("ConstantConditions")
           @Override
           public boolean execute(final int pos, final PsiVariable var) {
             ContextRelevantStaticMethod.this.parameters.put(
                 pos, new VariableSubLookupElement(var));
             return true;
           }
         });
   }
 }
  private void checkForCycles() {
    final TIntObjectHashMap<TIntHashSet> transitivePredecessors =
        new TIntObjectHashMap<TIntHashSet>();

    myRegisteredPassFactories.forEachEntry(
        new TIntObjectProcedure<PassConfig>() {
          @Override
          public boolean execute(int passId, PassConfig config) {
            TIntHashSet allPredecessors = new TIntHashSet(config.completionPredecessorIds);
            allPredecessors.addAll(config.startingPredecessorIds);
            transitivePredecessors.put(passId, allPredecessors);
            allPredecessors.forEach(
                new TIntProcedure() {
                  @Override
                  public boolean execute(int predecessorId) {
                    PassConfig predecessor = myRegisteredPassFactories.get(predecessorId);
                    if (predecessor == null) return true;
                    TIntHashSet transitives = transitivePredecessors.get(predecessorId);
                    if (transitives == null) {
                      transitives = new TIntHashSet();
                      transitivePredecessors.put(predecessorId, transitives);
                    }
                    transitives.addAll(predecessor.completionPredecessorIds);
                    transitives.addAll(predecessor.startingPredecessorIds);
                    return true;
                  }
                });
            return true;
          }
        });
    transitivePredecessors.forEachKey(
        new TIntProcedure() {
          @Override
          public boolean execute(int passId) {
            if (transitivePredecessors.get(passId).contains(passId)) {
              throw new IllegalArgumentException(
                  "There is a cycle introduced involving pass "
                      + myRegisteredPassFactories.get(passId).passFactory);
            }
            return true;
          }
        });
  }
  private void storeIds(@NotNull ConcurrentIntObjectMap<int[]> fileToForwardIds) {
    int forwardSize = 0;
    int backwardSize = 0;
    final TIntObjectHashMap<TIntArrayList> fileToBackwardIds =
        new TIntObjectHashMap<TIntArrayList>(fileToForwardIds.size());
    for (ConcurrentIntObjectMap.IntEntry<int[]> entry : fileToForwardIds.entries()) {
      int fileId = entry.getKey();
      int[] forwardIds = entry.getValue();
      forwardSize += forwardIds.length;
      for (int forwardId : forwardIds) {
        TIntArrayList backIds = fileToBackwardIds.get(forwardId);
        if (backIds == null) {
          backIds = new TIntArrayList();
          fileToBackwardIds.put(forwardId, backIds);
        }
        backIds.add(fileId);
        backwardSize++;
      }
    }
    log("backwardSize = " + backwardSize);
    log("forwardSize = " + forwardSize);
    log("fileToForwardIds.size() = " + fileToForwardIds.size());
    log("fileToBackwardIds.size() = " + fileToBackwardIds.size());
    assert forwardSize == backwardSize;

    // wrap in read action so that sudden quit (in write action) would not interrupt us
    myApplication.runReadAction(
        () -> {
          if (!myApplication.isDisposed()) {
            fileToBackwardIds.forEachEntry(
                new TIntObjectProcedure<TIntArrayList>() {
                  @Override
                  public boolean execute(int fileId, TIntArrayList backIds) {
                    storage.addAll(fileId, backIds.toNativeArray());
                    return true;
                  }
                });
          }
        });
  }
 @Override
 public String toString() {
   @NonNls final StringBuilder s = new StringBuilder();
   s.append("defensivelyMarked = ").append(defensivelyMarked);
   s.append("; wolfPassFinfished = ").append(wolfPassFinished);
   s.append("; errorFound = ").append(errorFound);
   s.append("; dirtyScopes: (");
   dirtyScopes.forEachEntry(
       new TIntObjectProcedure<RangeMarker>() {
         @Override
         public boolean execute(int passId, RangeMarker rangeMarker) {
           s.append(" pass: "******" -> ")
               .append(rangeMarker == WHOLE_FILE_DIRTY_MARKER ? "Whole file" : rangeMarker)
               .append(";");
           return true;
         }
       });
   s.append(")");
   return s.toString();
 }
 public void putAll(final TIntObjectHashMap<V> map) {
   map.forEachEntry(this.PUT_ALL_PROC);
 }