void (@NotNull final GrAssignmentExpression expression) { final GrExpression lValue = expression.getLValue(); final GrExpression rValue = expression.getRValue(); PsiElement realLValue = PsiUtil.skipParentheses(lValue, false); if (realLValue instanceof GrReferenceExpression && rValue != null) { GroovyResolveResult resolveResult = ((GrReferenceExpression)realLValue).advancedResolve(); PsiElement resolved = resolveResult.getElement(); if (resolved instanceof GrVariable && context.analyzedVars.toWrap((GrVariable)resolved)) { //write assignment to wrapped local var writeAssignmentWithRefSetter((GrExpression)realLValue, expression); return; } else if (resolved instanceof PsiMethod && resolveResult.isInvokedOnProperty()) { //write assignment via setter writeAssignmentWithSetter(((GrReferenceExpression)realLValue).getQualifier(), (PsiMethod)resolved, expression); return; } else if (resolved == null || resolved instanceof GrBindingVariable) { //write unresolved reference assignment via setter GroovyObject.setProperty(String name, Object value) final GrExpression qualifier = ((GrReferenceExpression)realLValue).getQualifier(); final PsiType type = PsiImplUtil.getQualifierType((GrReferenceExpression)realLValue); final GrExpression[] args = { factory.createExpressionFromText("\"" + ((GrReferenceExpression)realLValue).getReferenceName() + "\""), getRValue(expression) }; GroovyResolveResult[] candidates = type != null ? ResolveUtil.getMethodCandidates(type, "setProperty", expression, args[0].getType(), args[1].getType()) : GroovyResolveResult.EMPTY_ARRAY; final PsiMethod method = PsiImplUtil.extractUniqueElement(candidates); if (method != null) { writeAssignmentWithSetter(qualifier, method, args, GrNamedArgument.EMPTY_ARRAY, GrClosableBlock.EMPTY_ARRAY, PsiSubstitutor.EMPTY, expression); return; } } } else if (realLValue instanceof GrIndexProperty) { //qualifier[args] = rValue //write assignment via qualifier.putAt(Args, Value) method final GroovyResolveResult result = advancedResolve(((GrIndexProperty)realLValue), false); final PsiElement resolved = result.getElement(); if (resolved instanceof PsiMethod) { final GrExpression[] args = ((GrIndexProperty)realLValue).getArgumentList().getExpressionArguments(); writeAssignmentWithSetter(((GrIndexProperty)realLValue).getInvokedExpression(), (PsiMethod)resolved, ArrayUtil.append(args, getRValue(expression)), GrNamedArgument.EMPTY_ARRAY, GrClosableBlock.EMPTY_ARRAY, result.getSubstitutor(), expression); return; } } final PsiType lType = GenerationUtil.getDeclaredType(lValue, context); if (!expression.isOperatorAssignment()) { //write simple assignment lValue.accept(this); builder.append(" = "); if (rValue != null) { final PsiType rType = GenerationUtil.getDeclaredType(rValue, context); GenerationUtil.wrapInCastIfNeeded(builder, GenerationUtil.getNotNullType(expression, lType), rType, expression, context, new StatementWriter() { @Override public void writeStatement(StringBuilder builder, ExpressionContext context) { rValue.accept(ExpressionGenerator.this); } }); } } else { //write assignment such as +=, -=, etc final GroovyResolveResult resolveResult = PsiImplUtil.extractUniqueResult(PsiUtilKt.multiResolve(expression)); final PsiElement resolved = resolveResult.getElement(); if (resolved instanceof PsiMethod && !shouldNotReplaceOperatorWithMethod(lValue.getType(), rValue, expression.getOperationTokenType())) { lValue.accept(this); builder.append(" = "); final PsiType rType = GenerationUtil.getDeclaredType((PsiMethod)resolved, resolveResult.getSubstitutor(), context); GenerationUtil.wrapInCastIfNeeded(builder, GenerationUtil.getNotNullType(expression, lType), rType, expression, context, new StatementWriter() { @Override public void writeStatement(StringBuilder builder, ExpressionContext context) { invokeMethodOn( ((PsiMethod)resolved), (GrExpression)lValue.copy(), rValue == null ? GrExpression.EMPTY_ARRAY : new GrExpression[]{rValue}, GrNamedArgument.EMPTY_ARRAY, GrClosableBlock.EMPTY_ARRAY, resolveResult.getSubstitutor(), expression ); } }); } else { writeSimpleBinaryExpression(expression.getOperationToken(), lValue, rValue); } } }