void () { final PsiFile file = getPsiFile(); if (file != null) { CodeStyleManager style = CodeStyleManager.getInstance(myProject); for (TemplateOptionalProcessor processor : DumbService.getDumbAwareExtensions(myProject, TemplateOptionalProcessor.EP_NAME)) { try { processor.processText(myProject, getTemplate(), getDocument(), myTemplateRange, getEditor()); } catch (IncorrectOperationException e) { LOG.error(e); } } PsiDocumentManager.getInstance(myProject).doPostponedOperationsAndUnblockDocument(getDocument()); // for Python, we need to indent the template even if reformatting is enabled, because otherwise indents would be broken // and reformat wouldn't be able to fix them if (getTemplate().isToIndent()) { if (!myTemplateIndented) { LOG.assertTrue(myTemplateRange.isValid(), presentTemplate(getTemplate())); smartIndent(myTemplateRange.getStartOffset(), myTemplateRange.getEndOffset()); myTemplateIndented = true; } } if (getTemplate().isToReformat()) { try { int endSegmentNumber = getFinalSegmentNumber(); PsiDocumentManager.getInstance(myProject).commitDocument(getDocument()); RangeMarker dummyAdjustLineMarkerRange = null; int endVarOffset = -1; if (endSegmentNumber >= 0) { endVarOffset = getSegments().getSegmentStart(endSegmentNumber); TextRange range = myLiveTemplateProcessor.insertNewLineIndentMarker(file, getDocument(), endVarOffset); if (range != null) dummyAdjustLineMarkerRange = getDocument().createRangeMarker(range); } int reformatStartOffset = myTemplateRange.getStartOffset(); int reformatEndOffset = myTemplateRange.getEndOffset(); if (dummyAdjustLineMarkerRange == null && endVarOffset >= 0) { // There is a possible case that indent marker element was not inserted (e.g. because there is no blank line // at the target offset). However, we want to reformat white space adjacent to the current template (if any). PsiElement whiteSpaceElement = myLiveTemplateProcessor.findWhiteSpaceNode(file, endVarOffset); if (whiteSpaceElement != null) { TextRange whiteSpaceRange = whiteSpaceElement.getTextRange(); if (whiteSpaceElement.getContainingFile() != null) { // Support injected white space nodes. whiteSpaceRange = InjectedLanguageManager.getInstance(file.getProject()).injectedToHost(whiteSpaceElement, whiteSpaceRange); } reformatStartOffset = Math.min(reformatStartOffset, whiteSpaceRange.getStartOffset()); reformatEndOffset = Math.max(reformatEndOffset, whiteSpaceRange.getEndOffset()); } } style.reformatText(file, reformatStartOffset, reformatEndOffset); unblockDocument(); if (dummyAdjustLineMarkerRange != null && dummyAdjustLineMarkerRange.isValid()) { //[ven] TODO: [max] correct javadoc reformatting to eliminate isValid() check!!! getSegments().replaceSegmentAt(endSegmentNumber, dummyAdjustLineMarkerRange.getStartOffset(), dummyAdjustLineMarkerRange.getEndOffset()); getDocument().deleteString(dummyAdjustLineMarkerRange.getStartOffset(), dummyAdjustLineMarkerRange.getEndOffset()); PsiDocumentManager.getInstance(myProject).commitDocument(getDocument()); } if (endSegmentNumber >= 0) { final int offset = getSegments().getSegmentStart(endSegmentNumber); final int lineStart = getDocument().getLineStartOffset(getDocument().getLineNumber(offset)); // if $END$ is at line start, put it at correct indentation if (getDocument().getCharsSequence().subSequence(lineStart, offset).toString().trim().isEmpty()) { final int adjustedOffset = style.adjustLineIndent(file, offset); getSegments().replaceSegmentAt(endSegmentNumber, adjustedOffset, adjustedOffset); } } } catch (IncorrectOperationException e) { LOG.error(e); } } } }