PsiElement (PyStringLiteralExpression oldExpression, Pair<String, String> quotes, String prefix, String suffix, PyExpression formatValue, String newText) { // 'foo%(x)s' % {'x': x} -> '%(s)s%(x)s' % {'x': x, 's': s} // TODO: Support the dict() function final PyElementGenerator generator = PyElementGenerator.getInstance(oldExpression.getProject()); final LanguageLevel languageLevel = LanguageLevel.forElement(oldExpression); final String newLiteralText = prefix + "%(" + newText + ")s" + suffix; final PyStringLiteralExpression newLiteralExpression = generator.createStringLiteralAlreadyEscaped(newLiteralText); oldExpression.replace(newLiteralExpression); final PyDictLiteralExpression dict = (PyDictLiteralExpression)formatValue; final StringBuilder builder = new StringBuilder(); builder.append("{"); final PyKeyValueExpression[] elements = dict.getElements(); builder.append(StringUtil.join(elements, expression -> expression.getText(), ",")); if (elements.length > 0) { builder.append(","); } builder.append(quotes.getSecond()); builder.append(newText); builder.append(quotes.getSecond()); builder.append(":"); final int pos = builder.toString().length(); builder.append(newText); builder.append("}"); final PyExpression newDictLiteral = generator.createExpressionFromText(languageLevel, builder.toString()); final PsiElement newElement = formatValue.replace(newDictLiteral); return newElement.findElementAt(pos); }