@Nullable
  @Override
  public Value getJdiValueForDfaVariable(@NotNull StackFrameProxyEx proxy,
                                         @NotNull DfaVariableValue var,
                                         @NotNull PsiElement anchor) throws EvaluateException {
    if (var.getQualifier() != null) {
      VariableDescriptor descriptor = var.getDescriptor();
      if (descriptor instanceof SpecialField) {
        // Special fields facts are applied from qualifiers
        return null;
      }
      Value qualifierValue = getJdiValueForDfaVariable(proxy, var.getQualifier(), anchor);
      if (qualifierValue == null) return null;
      PsiElement element = descriptor.getPsiElement();
      if (element instanceof PsiField && qualifierValue instanceof ObjectReference) {
        ReferenceType type = ((ObjectReference)qualifierValue).referenceType();
        PsiClass psiClass = ((PsiField)element).getContainingClass();
        if (psiClass != null && type.name().equals(JVMNameUtil.getClassVMName(psiClass))) {
          Field field = type.fieldByName(((PsiField)element).getName());
          if (field != null) {
            return DfaAssistProvider.wrap(((ObjectReference)qualifierValue).getValue(field));
          }
        }
      }
      if (descriptor instanceof ArrayElementDescriptor && qualifierValue instanceof ArrayReference) {
        int index = ((ArrayElementDescriptor)descriptor).getIndex();
        int length = ((ArrayReference)qualifierValue).length();
        if (index >= 0 && index < length) {
          return DfaAssistProvider.wrap(((ArrayReference)qualifierValue).getValue(index));
        }
      }
      return null;
    }
    PsiElement psi = var.getPsiVariable();
    if (psi instanceof PsiClass) {
      // this; probably qualified
      PsiClass currentClass = PsiTreeUtil.getParentOfType(anchor, PsiClass.class);
      return CaptureTraverser.create((PsiClass)psi, currentClass, true).traverse(proxy.thisObject());
    }
    if (psi instanceof PsiLocalVariable || psi instanceof PsiParameter) {
      String varName = ((PsiVariable)psi).getName();
      if (PsiResolveHelper.getInstance(psi.getProject()).resolveReferencedVariable(varName, anchor) != psi) {
        // Another variable with the same name could be tracked by DFA in different code branch but not visible at current code location
        return null;
      }
      LocalVariableProxy variable = proxy.visibleVariableByName(varName);
      if (variable != null) {
        return DfaAssistProvider.wrap(proxy.getVariableValue(variable));
      }
      PsiClass currentClass = PsiTreeUtil.getParentOfType(anchor, PsiClass.class);
      PsiClass varClass = PsiTreeUtil.getParentOfType(psi, PsiClass.class);
      ObjectReference thisRef = CaptureTraverser.create(varClass, currentClass, false)
        .oneLevelLess().traverse(proxy.thisObject());
      if (thisRef != null) {
        ReferenceType type = thisRef.referenceType();
        if (type instanceof ClassType && type.isPrepared()) {
          Field field = type.fieldByName("val$" + varName);
          if (field != null) {
            return DfaAssistProvider.wrap(thisRef.getValue(field));
          }
        }
      }
    }
    if (psi instanceof PsiField && ((PsiField)psi).hasModifierProperty(PsiModifier.STATIC)) {
      PsiClass psiClass = ((PsiField)psi).getContainingClass();
      if (psiClass != null) {
        String name = psiClass.getQualifiedName();
        if (name != null) {
          ReferenceType type = ContainerUtil.getOnlyItem(proxy.getVirtualMachine().classesByName(name));
          if (type != null && type.isPrepared()) {
            Field field = type.fieldByName(((PsiField)psi).getName());
            if (field != null && field.isStatic()) {
              return DfaAssistProvider.wrap(type.getValue(field));
            }
          }
        }
      }
    }
    return null;
  }
@Nullable
  @Override
  public Value getJdiValueForDfaVariable(@NotNull StackFrameProxyEx proxy,
                                         @NotNull DfaVariableValue var,
                                         @NotNull PsiElement anchor)