void (@NotNull ActionContext context, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) { PsiPolyadicExpression concatenation = getEnclosingLiteralConcatenation(element); if (concatenation == null) return; List<PsiExpression> args = new ArrayList<>(); final String formatString = StringUtil.escapeStringCharacters(PsiConcatenationUtil.buildUnescapedFormatString(concatenation, false, args)); Project project = context.project(); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); PsiMethodCallExpression call = (PsiMethodCallExpression) factory.createExpressionFromText("java.text.MessageFormat.format()", concatenation); PsiExpressionList argumentList = call.getArgumentList(); boolean textBlocks = ContainerUtil.exists(concatenation.getOperands(), operand -> operand instanceof PsiLiteralExpression literal && literal.isTextBlock()); final String expressionText; if (textBlocks) { expressionText = Arrays.stream(formatString.split("\n")) .map(s -> PsiLiteralUtil.escapeTextBlockCharacters(s)) .collect(Collectors.joining("\n", "\"\"\"\n", "\"\"\"")); } else { expressionText = "\"" + formatString + "\""; } PsiExpression formatArgument = factory.createExpressionFromText(expressionText, null); argumentList.add(formatArgument); if (PsiUtil.isLanguageLevel5OrHigher(context.file())) { for (PsiExpression arg : args) { argumentList.add(arg); } } else { final PsiNewExpression arrayArg = (PsiNewExpression)factory.createExpressionFromText("new java.lang.Object[]{}", null); final PsiArrayInitializerExpression arrayInitializer = arrayArg.getArrayInitializer(); assert arrayInitializer != null; for (PsiExpression arg : args) { arrayInitializer.add(arg); } argumentList.add(arrayArg); } call = (PsiMethodCallExpression) JavaCodeStyleManager.getInstance(project).shortenClassReferences(call); call = (PsiMethodCallExpression) CodeStyleManager.getInstance(project).reformat(call); new CommentTracker().replaceAndRestoreComments(concatenation, call); }