protected boolean meetVariableType(@NotNull DfaVariableValue var, @NotNull DfType originalType, @NotNull DfType newType) {
    recordVariableType(var, newType);
    for (Map.Entry<DerivedVariableDescriptor, DfType> entry : newType.getDerivedValues().entrySet()) {
      if (!meetDfType(entry.getKey().createValue(getFactory(), var), entry.getValue())) {
        return false;
      }
    }
    for (Map.Entry<DfaVariableValue, DfType> entry : new ArrayList<>(myVariableTypes.entrySet())) {
      DfaVariableValue knownVar = entry.getKey();
      if (knownVar.getQualifier() == var) {
        if (!meetDfType(knownVar, knownVar.getDescriptor().restrictFromState(var, this))) {
          return false;
        }
      }
    }
    if (!updateDependentVariables(var, newType)) return false;
    if (!correctRelatedValues(var, newType)) return false;
    if (newType instanceof DfConstantType && !propagateConstant(var, (DfConstantType<?>)newType)) return false;
    return true;
  }
protected boolean meetVariableType(@NotNull DfaVariableValue var, @NotNull DfType originalType, @NotNull DfType newType)