completion copy should be reparsed incrementally even for big files (IDEA-129815)

This commit is contained in:
peter
2015-06-26 11:27:56 +02:00
parent 93afef25f4
commit 004654b214
4 changed files with 24 additions and 3 deletions
@@ -23,10 +23,12 @@ import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiMethod
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import com.intellij.psi.codeStyle.CommonCodeStyleSettings
import com.intellij.psi.impl.PsiDocumentManagerBase
import com.siyeh.ig.style.UnqualifiedFieldAccessInspection
public class NormalCompletionTest extends LightFixtureCompletionTestCase {
@@ -1515,4 +1517,23 @@ class Bar {
}
public void testIndentingForSwitchCase() { doTest() }
public void testIncrementalCopyReparse() {
((PsiDocumentManagerBase)PsiDocumentManager.getInstance(project)).disableBackgroundCommit(testRootDisposable)
myFixture.configureByText('a.java', 'class Fooxxxxxxxxxx { Fooxxxxx<caret>a f;\n' + 'public void foo() {}\n' * 10000 + '}')
def items = myFixture.completeBasic()
PsiClass c1 = items[0].object
assert !c1.physical
assert CompletionUtil.getOriginalElement(c1)
getLookup().hide()
myFixture.type('x')
items = myFixture.completeBasic()
PsiClass c2 = items[0].object
assert !c2.physical
assert CompletionUtil.getOriginalElement(c2)
assert c1.is(c2)
}
}
@@ -499,7 +499,7 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
@Override
public void replaceString(int startOffset, int endOffset, @NotNull CharSequence s) {
replaceString(startOffset, endOffset, s, LocalTimeCounter.currentTime(), startOffset == 0 && endOffset == getTextLength());
replaceString(startOffset, endOffset, s, LocalTimeCounter.currentTime(), false);
}
private void replaceString(int startOffset, int endOffset, @NotNull CharSequence s, final long newModificationStamp, boolean wholeTextReplaced) {
@@ -152,7 +152,7 @@ public class DocumentEventImpl extends DocumentEvent {
@Override
public boolean isWholeTextReplaced() {
return myIsWholeDocReplaced;
return myIsWholeDocReplaced || super.isWholeTextReplaced();
}
public int translateLineViaDiff(int line) throws FilesTooBigForDiffException {
@@ -777,7 +777,7 @@ public class CodeCompletionHandlerBase {
Document originalDocument = file.getViewProvider().getDocument();
assert originalDocument != null;
assert originalDocument.getTextLength() == file.getTextLength() : originalDocument;
document.setText(originalDocument.getImmutableCharSequence());
document.replaceString(0, document.getTextLength(), originalDocument.getImmutableCharSequence());
return copy;
}
}