void (@NotNull Project project, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) { PsiForStatement statement = PsiTreeUtil.getParentOfType(element, PsiForStatement.class); if (statement == null) return; CountingLoop loop = CountingLoop.from(statement); if (loop == null) return; PsiMethodCallExpression call = findAppendCall(statement); if (call == null) return; PsiExpression builder = call.getMethodExpression().getQualifierExpression(); if (builder == null) return; PsiExpression arg = call.getArgumentList().getExpressions()[0]; PsiExpression from, to; if (loop.isDescending()) { from = loop.getBound(); to = loop.getInitializer(); } else { from = loop.getInitializer(); to = loop.getBound(); } CommentTracker ct = new CommentTracker(); String repeatQualifier = getRepeatQualifier(arg, ct); String countText = getCountText(from, to, loop.isIncluding(), ct); if (myAddMathMax) { countText = CommonClassNames.JAVA_LANG_MATH + ".max(0," + countText + ")"; } String replacement = repeatQualifier + ".repeat(" + countText + ")"; ct.replace(arg, replacement); PsiExpressionStatement result = (PsiExpressionStatement)ct.replaceAndRestoreComments(statement, call.getParent()); if (myAddMathMax) { PsiMethodCallExpression appendCall = (PsiMethodCallExpression)result.getExpression(); PsiMethodCallExpression repeatCall = (PsiMethodCallExpression)appendCall.getArgumentList().getExpressions()[0]; PsiMethodCallExpression maxCall = (PsiMethodCallExpression)repeatCall.getArgumentList().getExpressions()[0]; PsiExpression count = maxCall.getArgumentList().getExpressions()[1]; LongRangeSet range = CommonDataflow.getExpressionRange(count); if (range != null && !range.isEmpty() && range.min() >= 0) { maxCall.replace(count); } } }