private @NotNull QualifierStatus calculate(@NotNull DfaValue qualifier) {
      final DfType dfType = getDfType(qualifier);
      if (dfType.isImmutableQualifier()) return QualifierStatus.SHOULD_NOT_FLUSH;
      if (dfType.isLocal()) {
        return myQualifiersToFlush != null && myQualifiersToFlush.contains(qualifier) ?
               QualifierStatus.SHOULD_FLUSH_ALWAYS : QualifierStatus.SHOULD_NOT_FLUSH;
      }
      if (myQualifiersToFlush == null) return QualifierStatus.SHOULD_FLUSH_ALWAYS;
      boolean flushCalls = false;
      for (final DfaValue qualifierToFlush : myQualifiersToFlush) {
        final RelationType relation = getRelation(qualifier, qualifierToFlush);
        if (relation == RelationType.EQ) return QualifierStatus.SHOULD_FLUSH_ALWAYS;
        final DfType typeToFlush = getDfType(qualifierToFlush);
        if (typeToFlush.isLocal()) continue;
        // Calls may refer to changed object indirectly (unless it's local)
        flushCalls = true;
        if (relation != null) continue;
        if (dfType.mayAlias(typeToFlush)) return QualifierStatus.SHOULD_FLUSH_ALWAYS;
      }
      return flushCalls ? QualifierStatus.SHOULD_FLUSH_CALLS : QualifierStatus.SHOULD_NOT_FLUSH;
    }
private @NotNull QualifierStatus calculate(@NotNull DfaValue qualifier)