DfaInstructionState[] (@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()); } } if (!(psi instanceof PsiField field) || !field.hasModifierProperty(PsiModifier.VOLATILE)) { 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); return nextStates(interpreter, stateBefore); }