From 1a363db37ccf4eada8351c7ce53e5400fbe08d3f Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 17 Oct 2017 21:43:43 +0200 Subject: [PATCH] cancellability when indexing todos in plain text files (IDEA-180644) --- .../com/intellij/java/index/IndexTest.groovy | 45 +++++++++++++++++++ .../cache/impl/todo/PlainTextTodoIndexer.java | 3 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy b/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy index 34eeb3dfe368..de30908020c4 100644 --- a/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/index/IndexTest.groovy @@ -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); + } + } } diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/PlainTextTodoIndexer.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/PlainTextTodoIndexer.java index d88c927d7dc7..6eeb1d7c3a1f 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/PlainTextTodoIndexer.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/PlainTextTodoIndexer.java @@ -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);