boolean (Editor editor, int caretOffset, DataContext dataContext, EditorActionHandler originalHandler, PsiFile file) { Project project = CommonDataKeys.PROJECT.getData(dataContext); if (project == null) return false; GroovyCodeStyleSettings codeStyleSettings = GroovyCodeStyleSettings.getInstance(editor); if (!codeStyleSettings.USE_FLYING_GEESE_BRACES) return false; PsiElement element = file.findElementAt(caretOffset); if (element != null && element.getNode().getElementType() == TokenType.WHITE_SPACE) { element = GeeseUtil.getNextNonWhitespaceToken(element); } if (element == null || !GeeseUtil.isClosureRBrace(element)) return false; element = GeeseUtil.getNextNonWhitespaceToken(element); if (element == null || element.getNode().getElementType() != GroovyTokenTypes.mNLS || StringUtil.countChars(element.getText(), '\n') > 1) { return false; } element = GeeseUtil.getNextNonWhitespaceToken(element); if (element == null || !GeeseUtil.isClosureRBrace(element)) return false; Document document = editor.getDocument(); PsiDocumentManager.getInstance(project).commitDocument(document); int toRemove = element.getTextRange().getStartOffset(); document.deleteString(caretOffset + 1, toRemove); originalHandler.execute(editor, editor.getCaretModel().getCurrentCaret(), dataContext); String text = document.getText(); int nextLineFeed = text.indexOf('\n', caretOffset + 1); if (nextLineFeed == -1) nextLineFeed = text.length(); CodeStyleManager.getInstance(project).reformatText(file, caretOffset, nextLineFeed); return true; }