undo doesn't suffer from autopopup intervention, again

This commit is contained in:
peter
2011-07-12 18:10:11 +02:00
parent a5e4d4472d
commit 47a6fc0a41
3 changed files with 31 additions and 14 deletions
@@ -873,5 +873,14 @@ class LiveComplete {
assert myFixture.editor.document.text.contains('ArrStoExce.')
}
public void testAutopopupTypingUndo() {
myFixture.configureByText "a.java", "class Foo {{ <caret> }}"
def editor;
edt { editor = FileEditorManager.getInstance(project).openFile(myFixture.file.virtualFile, false)[0] }
type 'aioobeeee'
edt { UndoManager.getInstance(project).undo(editor) }
assert !myFixture.editor.document.text.contains('aioo')
}
}
@@ -457,26 +457,31 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
final boolean hasModifiers,
final int invocationCount) {
final PsiFile originalFile = initContext.getFile();
final PsiFile fileCopy;
AccessToken token = WriteAction.start();
try {
fileCopy = createFileCopy(originalFile);
}
finally {
token.finish();
}
final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy);
final PsiFile[] fileCopy = {null};
CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() {
@Override
public void run() {
AccessToken token = WriteAction.start();
try {
fileCopy[0] = createFileCopy(originalFile);
}
finally {
token.finish();
}
}
});
final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy[0]);
final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject());
final int hostStartOffset = injectedLanguageManager.injectedToHost(fileCopy, initContext.getStartOffset());
final int hostStartOffset = injectedLanguageManager.injectedToHost(fileCopy[0], initContext.getStartOffset());
final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(initContext.getEditor());
final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument());
final OffsetMap original = initContext.getOffsetMap();
for (final OffsetKey key : new ArrayList<OffsetKey>(original.keySet())) {
hostMap.addOffset(key, injectedLanguageManager.injectedToHost(fileCopy, original.getOffset(key)));
hostMap.addOffset(key, injectedLanguageManager.injectedToHost(fileCopy[0], original.getOffset(key)));
}
final Document document = fileCopy.getViewProvider().getDocument();
final Document document = fileCopy[0].getViewProvider().getDocument();
assert document != null : "no document";
CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() {
@@ -485,7 +490,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
patchFileCopy(initContext, fileCopy, document);
patchFileCopy(initContext, fileCopy[0], document);
}
});
}
@@ -60,6 +60,7 @@ import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.actionSystem.DocCommandGroupId;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.ex.DocumentEx;
@@ -676,9 +677,11 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}
}
CommandProcessor.getInstance().setCurrentCommandGroupId(myEditor.getDocument());
actionManager.getTypedAction().actionPerformed(getEditor(), c, getEditorDataContext());
}
}, null, null);
}, null, DocCommandGroupId.noneGroupId(myEditor.getDocument()));
}
});
}