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