@Override public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) {
    startElement(expression);

    final PsiExpression qualifierExpression = expression.getQualifierExpression();
    if (qualifierExpression != null) {
      if (!(expression.resolve() instanceof PsiMember member) || !member.hasModifierProperty(PsiModifier.STATIC)) {
        qualifierExpression.accept(this);
        addInstruction(new PopInstruction());
      }
    }

    // complex assignments (e.g. "|=") are both reading and writing
    boolean writing = PsiUtil.isAccessedForWriting(expression) && !PsiUtil.isAccessedForReading(expression);
    DfaValue value = JavaDfaValueFactory.getExpressionDfaValue(myFactory, expression);
    addInstruction(new JvmPushInstruction(value == null ? myFactory.getUnknown() : value,
                                          writing ? null : new JavaExpressionAnchor(expression),
                                          writing));
    addNullCheck(expression);

    finishElement(expression);
  }
@Override public void visitReferenceExpression(@NotNull PsiReferenceExpression expression)