QualifierStatus (@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; }