diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 116bb969dc74..68f9124ed081 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -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 { Fooxxxxxa 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) + } } diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java index ea6834e5695e..f2c6299df4aa 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/DocumentImpl.java @@ -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) { diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java index 993dda9c0535..943b3da7fd09 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/event/DocumentEventImpl.java @@ -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 { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index c96a22c7911a..a8e13c97b80b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -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; } }