boolean (@NotNull PsiFile file, List<TextRange> ranges) { PsiFile fileToProcess = ensureValid(file); if (fileToProcess == null) { LOG.warn("Invalid file " + file.getName() + ", skipping reformat"); return false; } CodeFormatterFacade.FORMATTING_CANCELLED_FLAG.set(false); try { Document document = PsiDocumentManager.getInstance(myProject).getDocument(fileToProcess); final LayoutCodeInfoCollector infoCollector = getInfoCollector(); LOG.assertTrue(infoCollector == null || document != null); CharSequence before = document == null ? null : document.getImmutableCharSequence(); if (!isSecondReformatDisabled()) { KeptLineFeedsCollector.setup(fileToProcess); } try { CodeStyleManager.getInstance(myProject).reformatText(fileToProcess, ranges); } catch (ProcessCanceledException pce) { if (before != null) { document.setText(before); } if (infoCollector != null) { infoCollector.setReformatCodeNotification(CodeInsightBundle.message("hint.text.formatting.canceled")); } return false; } finally { List<Segment> segments = KeptLineFeedsCollector.getLineFeedsAndCleanup(); if (!segments.isEmpty() && infoCollector != null) { infoCollector.setSecondFormatNotification(CodeInsightBundle.message("hint.text.custom.line.breaks.are.preserved")); setDoNotKeepLineBreaks(fileToProcess); } else { fileToProcess.putUserData(SECOND_FORMAT_KEY, null); } } if (infoCollector != null) { prepareUserNotificationMessage(document, before); } return !CodeFormatterFacade.FORMATTING_CANCELLED_FLAG.get(); } catch (IncorrectOperationException e) { LOG.error(e); return false; } finally { myRanges.clear(); } }