public void perform(final boolean generatePrivate) { final Runnable runnable = new Runnable() { public void run() { final DocumentEx document = (DocumentEx) myEditor.getDocument(); int exprOffset = myExprMarker.getStartOffset(); final int lineOffset = getLineOffset(document, exprOffset); if (generatePrivate) { final Collection<RangeMarker> leftGreedyMarker = ContainerUtil.newArrayList(); final Collection<RangeMarker> emptyMarkers = ContainerUtil.newArrayList(); for (RangeHighlighter rangeHighlighter : myEditor.getMarkupModel().getAllHighlighters()) { collectRangeMarker(rangeHighlighter, lineOffset, leftGreedyMarker, emptyMarkers); } document.processRangeMarkers( new Processor<RangeMarker>() { @Override public boolean process(RangeMarker rangeMarker) { collectRangeMarker(rangeMarker, lineOffset, leftGreedyMarker, emptyMarkers); return true; } }); setLeftGreedy(leftGreedyMarker, false); setRightGreedy(emptyMarkers, true); // workaround for shifting empty ranges to the left document.insertString(lineOffset, " "); document.insertString(lineOffset, PRIVATE); document.deleteString( lineOffset + PRIVATE.length(), lineOffset + PRIVATE.length() + 1); setLeftGreedy(leftGreedyMarker, true); setRightGreedy(emptyMarkers, false); } else { int idx = document.getText().indexOf(PRIVATE, lineOffset); if (idx > -1 && idx < exprOffset) { document.deleteString(idx, idx + PRIVATE.length()); } } PsiDocumentManager.getInstance(myProject).commitDocument(document); } }; final LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(myEditor); if (lookup != null) { lookup.performGuardedChange(runnable); } else { runnable.run(); } }