void (PsiVariable variable, PsiVariable builderVariable, PsiReferenceExpression ref, CommentTracker ct) { PsiElement parent = PsiUtil.skipParenthesizedExprUp(ref.getParent()); if(parent instanceof PsiAssignmentExpression assignment) { if(PsiUtil.skipParenthesizedExprDown(assignment.getLExpression()) == ref) { replaceInAssignment(variable, builderVariable, assignment, ct); return; } else { // ref is r-value if(assignment.getOperationTokenType().equals(JavaTokenType.PLUSEQ)) return; } } if (variable != builderVariable) { ExpressionUtils.bindReferenceTo(ref, Objects.requireNonNull(builderVariable.getName())); } PsiMethodCallExpression methodCallExpression = ExpressionUtils.getCallForQualifier(ref); if(methodCallExpression != null) { replaceInCallQualifier(builderVariable, methodCallExpression, ct); return; } if(parent instanceof PsiExpressionList && parent.getParent() instanceof PsiMethodCallExpression) { PsiExpression[] expressions = ((PsiExpressionList)parent).getExpressions(); if(expressions.length == 1 && expressions[0] == ref) { PsiMethodCallExpression call = (PsiMethodCallExpression)parent.getParent(); if(canAcceptBuilderInsteadOfString(call)) { return; } } } if(parent instanceof PsiBinaryExpression binOp) { if(ExpressionUtils.getValueComparedWithNull(binOp) != null) { return; } } if(parent instanceof PsiPolyadicExpression && ((PsiPolyadicExpression)parent).getOperationTokenType().equals(JavaTokenType.PLUS)) { PsiExpression[] operands = ((PsiPolyadicExpression)parent).getOperands(); for (PsiExpression operand : operands) { if (operand == ref) break; if (TypeUtils.isJavaLangString(operand.getType())) return; } if (operands.length > 1 && operands[0] == ref && TypeUtils.isJavaLangString(operands[1].getType())) return; } @NonNls String text = builderVariable.getName() + ".toString()"; if (myNullables.contains(ref) && !isNotNullContext(ref)) { text = builderVariable.getName() + "==null?null:" + text; if (parent instanceof PsiExpression) { text = "(" + text + ")"; } } ct.replace(ref, text); }