void (@NotNull PsiAssignmentExpression expression) { startElement(expression); PsiExpression rExpr = expression.getRExpression(); myStartStatementStack.pushStatement(rExpr == null ? expression : rExpr, false); myEndStatementStack.pushStatement(rExpr == null ? expression : rExpr, false); int pc = myCurrentFlow.getSize(); PsiExpression lExpr = PsiUtil.skipParenthesizedExprDown(expression.getLExpression()); if (lExpr instanceof PsiReferenceExpression) { if (!myImplicitCompactConstructorAssignments.isEmpty()) { PsiElement target = ((PsiReferenceExpression)lExpr).resolve(); if (target instanceof PsiField) { myImplicitCompactConstructorAssignments.remove(target); } } PsiVariable variable = getUsedVariable((PsiReferenceExpression)lExpr); if (variable != null) { if (myAssignmentTargetsAreElements) { startElement(lExpr); } PsiExpression qualifier = ((PsiReferenceExpression)lExpr).getQualifierExpression(); if (qualifier != null) { qualifier.accept(this); } if (expression.getOperationTokenType() != JavaTokenType.EQ) { generateReadInstruction(variable); } if (rExpr != null) { rExpr.accept(this); } generateWriteInstruction(variable); if (myAssignmentTargetsAreElements) finishElement(lExpr); } else { if (rExpr != null) { rExpr.accept(this); } lExpr.accept(this); //? } } else if (lExpr != null) { lExpr.accept(this); if (rExpr != null) { rExpr.accept(this); } } //each statement should contain at least one instruction in order to getElement(offset) work if (pc == myCurrentFlow.getSize()) emitEmptyInstruction(); myStartStatementStack.popStatement(); myEndStatementStack.popStatement(); finishElement(expression); }