boolean (DfaVariableValue from, DfaVariableValue to) { assert from != to; if (from.getDependentVariables().isEmpty()) return true; List<DfaVariableValue> vars = new ArrayList<>(myVariableTypes.keySet()); for (DfaVariableValue var : vars) { DfaVariableValue target = replaceQualifier(var, from, to); if (target != var) { DfType fromType = myVariableTypes.remove(var); if (fromType != null) { DfType toType = myVariableTypes.get(target); if (toType == null) { toType = fromType; } else { toType = fromType.meet(toType); if (toType == DfType.BOTTOM) return false; } recordVariableType(target, toType); } } } for (int valueId : myIdToEqClassesIndices.keySet().toIntArray()) { DfaValue value = myFactory.getValue(valueId); DfaVariableValue var = ObjectUtils.tryCast(value, DfaVariableValue.class); if (var == null || var.getQualifier() != from) continue; DfaVariableValue target = var.withQualifier(to); if (!uniteClasses(var, target)) return false; removeEquivalence(var); } return true; }