PsiElement (PyStringLiteralExpression oldExpression, PsiElement newExpression, TextRange textRange, String prefix, String suffix, PyTupleExpression tupleFormatValue, List<SubstitutionChunk> substitutions) { // 'foo%s' % (x,) -> '%s%s' % (s, x) final String newLiteralText = prefix + "%s" + suffix; final PyElementGenerator generator = PyElementGenerator.getInstance(oldExpression.getProject()); final PyStringLiteralExpression newLiteralExpression = generator.createStringLiteralAlreadyEscaped(newLiteralText); oldExpression.replace(newLiteralExpression); final PyExpression[] members = tupleFormatValue.getElements(); final int n = members.length; final int i = MathUtil.clamp(getPositionInRanges(substitutionsToRanges(substitutions), textRange), 0, n); final boolean last = i == n; final PsiElement trailingComma = PyPsiUtils.getNextComma(members[n - 1]); if (trailingComma != null) { trailingComma.delete(); } final PyExpression before = last ? null : members[i]; PyUtil.addListNode(tupleFormatValue, newExpression, before != null ? before.getNode() : null, i == 0 || !last, last, !last); return newExpression; }