@Override
  public DfaInstructionState[] accept(@NotNull DataFlowInterpreter interpreter, @NotNull DfaMemoryState stateBefore) {
    DfaValue dfaSource = stateBefore.pop();
    DfaValue dfaDest = stateBefore.pop();

    if (!(dfaDest instanceof DfaVariableValue) && myAssignedValue != null) {
      // It's possible that dfaDest on the stack is cleared to DfaTypeValue due to variable flush
      // (e.g. during StateMerger#mergeByFacts), so we try to restore the original destination.
      dfaDest = myAssignedValue;
    }
    interpreter.getListener().beforeAssignment(dfaSource, dfaDest, stateBefore, getDfaAnchor());
    if (dfaSource == dfaDest) {
      stateBefore.push(dfaDest);
      return nextStates(interpreter, stateBefore);
    }
    if (!(dfaDest instanceof DfaVariableValue destVar && destVar.getPsiVariable() instanceof PsiLocalVariable &&
          dfaSource instanceof DfaVariableValue sourceVar &&
          (ControlFlow.isTempVariable(sourceVar) || (sourceVar).getDescriptor().isCall()))) {
      JavaDfaHelpers.dropLocality(dfaSource, stateBefore);
    }

    if (dfaDest instanceof DfaVariableValue var) {
      PsiElement psi = var.getPsiVariable();
      if (dfaSource instanceof DfaTypeValue &&
          ((psi instanceof PsiField field && field.hasModifierProperty(PsiModifier.STATIC)) ||
           (var.getQualifier() != null && !stateBefore.getDfType(var.getQualifier()).isLocal()))) {
        DfType dfType = dfaSource.getDfType();
        if (dfType instanceof DfReferenceType refType) {
          dfaSource = dfaSource.getFactory().fromDfType(refType.dropLocality());
        }
      }
      stateBefore.setVarValue(var, dfaSource);
      if (DfaNullability.fromDfType(var.getInherentType()) == DfaNullability.NULLABLE &&
          DfaNullability.fromDfType(stateBefore.getDfType(var)) == DfaNullability.UNKNOWN && isVariableInitializer()) {
        stateBefore.meetDfType(var, DfaNullability.NULLABLE.asDfType());
      }
    }

    pushResult(interpreter, stateBefore, dfaDest instanceof DfaVariableValue ? dfaDest : dfaSource);
    return nextStates(interpreter, stateBefore);
  }
@Override
  public DfaInstructionState[] accept(@NotNull DataFlowInterpreter interpreter, @NotNull DfaMemoryState stateBefore)