PsiElement (@NotNull final PsiElement oldExpression, @NotNull final PsiElement newExpression) { final Pair<PsiElement, TextRange> data = oldExpression.getUserData(SELECTION_BREAKS_AST_NODE); if (data != null) { final PsiElement element = data.first; final TextRange textRange = data.second; final String parentText = element.getText(); final String prefix = parentText.substring(0, textRange.getStartOffset()); final String suffix = parentText.substring(textRange.getEndOffset(), element.getTextLength()); final PyElementGenerator generator = PyElementGenerator.getInstance(oldExpression.getProject()); final LanguageLevel languageLevel = LanguageLevel.forElement(oldExpression); if (element instanceof PyStringLiteralExpression) { return replaceSubstringInStringLiteral((PyStringLiteralExpression)element, newExpression, textRange); } final PyElement newElement = generator.createFromText(languageLevel, PyElement.class, prefix + newExpression.getText() + suffix); return element.replace(newElement); } else { return oldExpression.replace(newExpression); } }