cancellability when indexing todos in plain text files (IDEA-180644)

This commit is contained in:
Maxim.Mossienko
2017-10-17 21:45:38 +02:00
parent 3a36a84808
commit 1a363db37c
2 changed files with 47 additions and 1 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.java.index
import com.intellij.ide.todo.TodoConfiguration
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.WriteAction
import com.intellij.openapi.command.WriteCommandAction
@@ -27,6 +28,9 @@ import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileTypes.PlainTextFileType
import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.util.ProgressIndicatorBase
import com.intellij.openapi.roots.ContentIterator
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.io.FileUtil
@@ -45,6 +49,7 @@ import com.intellij.psi.impl.PsiManagerEx
import com.intellij.psi.impl.cache.impl.id.IdIndex
import com.intellij.psi.impl.cache.impl.id.IdIndexEntry
import com.intellij.psi.impl.cache.impl.id.IdIndexImpl
import com.intellij.psi.impl.cache.impl.todo.TodoIndex
import com.intellij.psi.impl.file.impl.FileManagerImpl
import com.intellij.psi.impl.java.stubs.index.JavaStubIndexKeys
import com.intellij.psi.impl.source.JavaFileElementType
@@ -54,11 +59,14 @@ import com.intellij.psi.search.EverythingGlobalScope
import com.intellij.psi.search.FilenameIndex
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.PsiSearchHelper
import com.intellij.psi.search.TodoAttributesUtil
import com.intellij.psi.search.TodoPattern
import com.intellij.psi.stubs.SerializedStubTree
import com.intellij.psi.stubs.StubIndex
import com.intellij.psi.stubs.StubIndexImpl
import com.intellij.psi.stubs.StubUpdatingIndex
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.LightVirtualFile
import com.intellij.testFramework.PlatformTestUtil
import com.intellij.testFramework.PsiTestUtil
import com.intellij.testFramework.SkipSlowTestLocally
@@ -67,6 +75,7 @@ import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
import com.intellij.util.FileContentUtil
import com.intellij.util.IncorrectOperationException
import com.intellij.util.Processor
import com.intellij.util.TimeoutUtil
import com.intellij.util.indexing.*
import com.intellij.util.indexing.impl.MapIndexStorage
import com.intellij.util.indexing.impl.MapReduceIndex
@@ -75,6 +84,8 @@ import com.siyeh.ig.JavaOverridingMethodUtil
import groovy.transform.CompileStatic
import org.jetbrains.annotations.NotNull
import java.util.concurrent.CountDownLatch
/**
* @author Eugene Zhuravlev
* @since Dec 12, 2007
@@ -809,4 +820,38 @@ class IndexTest extends JavaCodeInsightFixtureTestCase {
assert !JavaOverridingMethodUtil.getOverridingMethodsIfCheapEnough(runnable.methods[0], projectScope, { true }).findFirst().present
assert StubIndex.instance.getElements(JavaStubIndexKeys.METHODS, 'run', project, projectScope, PsiMethod).empty
}
void "test text todo indexing checks for cancellation"() {
TodoPattern pattern = new TodoPattern("(x+x+)+y", TodoAttributesUtil.createDefault(), true)
TodoPattern[] oldPatterns = TodoConfiguration.getInstance().getTodoPatterns()
TodoPattern[] newPatterns = [pattern]
TodoConfiguration.getInstance().setTodoPatterns(newPatterns)
FileBasedIndex.instance.ensureUpToDate(TodoIndex.NAME, project, GlobalSearchScope.allScope(project))
myFixture.addFileToProject("Foo.txt", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
try {
final CountDownLatch progressStarted = new CountDownLatch(1)
final ProgressIndicatorBase progressIndicatorBase = new ProgressIndicatorBase()
boolean[] canceled = [false]
ApplicationManager.application.executeOnPooledThread({
progressStarted.await()
TimeoutUtil.sleep(1000)
progressIndicatorBase.cancel()
TimeoutUtil.sleep(500)
assertTrue(canceled[0])
});
ProgressManager.getInstance().runProcess({
try {
progressStarted.countDown();
FileBasedIndex.instance.ensureUpToDate(TodoIndex.NAME, project, GlobalSearchScope.allScope(project))
}
catch (ProcessCanceledException ignore) {
canceled[0] = true
}
}, progressIndicatorBase);
} finally {
TodoConfiguration.getInstance().setTodoPatterns(oldPatterns);
}
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl.cache.impl.todo;
import com.intellij.patterns.StringPattern;
import com.intellij.psi.impl.cache.impl.IndexPatternUtil;
import com.intellij.psi.impl.cache.impl.OccurrenceConsumer;
import com.intellij.psi.search.IndexPattern;
@@ -41,7 +42,7 @@ public class PlainTextTodoIndexer extends VersionedTodoIndexer {
for (IndexPattern indexPattern : indexPatterns) {
Pattern pattern = indexPattern.getOptimizedIndexingPattern();
if (pattern != null) {
Matcher matcher = pattern.matcher(chars);
Matcher matcher = pattern.matcher(StringPattern.newBombedCharSequence(chars));
while (matcher.find()) {
if (matcher.start() != matcher.end()) {
occurrenceConsumer.incTodoOccurrence(indexPattern);