private TypeDfaState updateVariableType(@NotNull TypeDfaState state,
                                          @NotNull Instruction instruction,
                                          int descriptorId,
                                          @NotNull Supplier<DFAType> computation) {
    if (descriptorId == 0) {
      return state;
    }
    if (!myFlowInfo.getInterestingInstructions().contains(instruction)) {
      return state.withRemovedBinding(descriptorId);
    }

    DFAType type = myCache.getCachedInferredType(descriptorId, instruction);
    if (type == null) {
      if (myFlowInfo.getAcyclicInstructions().contains(instruction)) {
        type = computation.get();
      }
      else {
        type = runWithoutCaching(state, computation);
      }
    }

    return state.withNewType(descriptorId, type);
  }
private TypeDfaState updateVariableType(@NotNull TypeDfaState state,
                                          @NotNull Instruction instruction,
                                          int descriptorId,
                                          @NotNull Supplier<DFAType> computation)