@Override
  public @NotNull DfType getQualifierConstraintFromValue(@NotNull DfaMemoryState state, @NotNull DfaValue value) {
    if (!PsiTypesUtil.isGetClass(myGetter)) return DfType.TOP;
    DfType type = state.getDfType(value);
    DfType constraint = DfType.TOP;
    PsiType cls = type.getConstantOfType(PsiType.class);
    if (cls != null) {
      constraint = TypeConstraints.exact(cls).asDfType();
    }
    else if (type instanceof DfAntiConstantType) {
      constraint = StreamEx.of(((DfAntiConstantType<?>)type).getNotValues()).select(PsiType.class)
        .map(t -> TypeConstraints.exact(t).tryNegate())
        .nonNull()
        .reduce(TypeConstraint::meet).orElse(TypeConstraints.TOP).asDfType();
    }
    if (value instanceof DfaVariableValue && ((DfaVariableValue)value).getDescriptor().equals(this)) {
      DfaVariableValue qualifier = ((DfaVariableValue)value).getQualifier();
      if (qualifier != null) {
        constraint = constraint.meet(TypeConstraint.fromDfType(state.getDfType(qualifier)).asDfType());
      }
    }
    return constraint;
  }
@Override
  public @NotNull DfType getQualifierConstraintFromValue(@NotNull DfaMemoryState state, @NotNull DfaValue value)