diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/cache/impl/IdCacheTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/cache/impl/IdCacheTest.java index bb43aac5a141..df764a72bb7b 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/cache/impl/IdCacheTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/cache/impl/IdCacheTest.java @@ -12,6 +12,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.TodoCacheManager; import com.intellij.psi.impl.cache.impl.id.IdIndex; import com.intellij.psi.impl.cache.impl.todo.TodoIndex; import com.intellij.psi.search.GlobalSearchScope; @@ -49,7 +50,7 @@ public class IdCacheTest extends CodeInsightTestCase{ } public void testBuildCache() throws Exception { - checkCache(CacheManager.SERVICE.getInstance(myProject)); + checkCache(CacheManager.SERVICE.getInstance(myProject), TodoCacheManager.SERVICE.getInstance(myProject)); } public void testLoadCacheNoTodo() throws Exception { @@ -62,7 +63,7 @@ public class IdCacheTest extends CodeInsightTestCase{ public void testUpdateCache1() throws Exception { myRootDir.createChildData(null, "4.java"); Thread.sleep(1000); - checkCache(CacheManager.SERVICE.getInstance(myProject)); + checkCache(CacheManager.SERVICE.getInstance(myProject), TodoCacheManager.SERVICE.getInstance(myProject)); } public void testUpdateCache2() throws Exception { @@ -73,6 +74,7 @@ public class IdCacheTest extends CodeInsightTestCase{ FileDocumentManager.getInstance().saveAllDocuments(); final CacheManager cache = CacheManager.SERVICE.getInstance(myProject); + final TodoCacheManager todocache = TodoCacheManager.SERVICE.getInstance(myProject); final GlobalSearchScope scope = GlobalSearchScope.projectScope(myProject); checkResult(new String[] {"1.java"}, convert(cache.getFilesWithWord("xxx", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{}, convert(cache.getFilesWithWord("a", UsageSearchContext.ANY, scope, false))); @@ -81,10 +83,10 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache.getFilesWithWord("d", UsageSearchContext.ANY,scope, false))); checkResult(new String[]{"3.java"}, convert(cache.getFilesWithWord("e", UsageSearchContext.ANY,scope, false))); - checkResult(new String[]{"3.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"3.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } public void testUpdateCache3() throws Exception { @@ -92,6 +94,7 @@ public class IdCacheTest extends CodeInsightTestCase{ child.delete(null); final CacheManager cache2 = CacheManager.SERVICE.getInstance(myProject); + final TodoCacheManager todocache2 = TodoCacheManager.SERVICE.getInstance(myProject); final GlobalSearchScope scope = GlobalSearchScope.projectScope(myProject); checkResult(ArrayUtil.EMPTY_STRING_ARRAY, convert(cache2.getFilesWithWord("xxx", UsageSearchContext.ANY, scope, false))); checkResult(ArrayUtil.EMPTY_STRING_ARRAY, convert(cache2.getFilesWithWord("a", UsageSearchContext.ANY, scope, false))); @@ -100,9 +103,9 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache2.getFilesWithWord("d", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"3.java"}, convert(cache2.getFilesWithWord("e", UsageSearchContext.ANY, scope, false))); - checkResult(new String[]{"3.java"}, convert(cache2.getFilesWithTodoItems())); - assertEquals(0, cache2.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache2.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"3.java"}, convert(todocache2.getFilesWithTodoItems())); + assertEquals(0, todocache2.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache2.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } public void testUpdateCacheNoTodo() throws Exception { @@ -118,11 +121,11 @@ public class IdCacheTest extends CodeInsightTestCase{ TodoConfiguration.getInstance().setTodoPatterns(new TodoPattern[]{pattern}); try{ - final CacheManager cache = CacheManager.SERVICE.getInstance(myProject); - checkResult(new String[]{"2.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(1, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + final TodoCacheManager todocache = TodoCacheManager.SERVICE.getInstance(myProject); + checkResult(new String[]{"2.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(1, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } finally{ TodoConfiguration.getInstance().setTodoPatterns(oldPatterns); @@ -131,11 +134,12 @@ public class IdCacheTest extends CodeInsightTestCase{ public void testFileModification() throws Exception { final CacheManager cache = CacheManager.SERVICE.getInstance(myProject); - checkCache(cache); + final TodoCacheManager todocache = TodoCacheManager.SERVICE.getInstance(myProject); + checkCache(cache, todocache); VirtualFile child = myRootDir.findChild("1.java"); - checkCache(cache); + checkCache(cache, todocache); VfsUtil.saveText(child, "xxx"); PsiDocumentManager.getInstance(myProject).commitAllDocuments(); @@ -148,15 +152,16 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache.getFilesWithWord("d", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"3.java"}, convert(cache.getFilesWithWord("e", UsageSearchContext.ANY, scope, false))); - checkResult(new String[]{"3.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"3.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } public void testFileDeletion() throws Exception { final CacheManager cache = CacheManager.SERVICE.getInstance(myProject); - checkCache(cache); + final TodoCacheManager todocache = TodoCacheManager.SERVICE.getInstance(myProject); + checkCache(cache, todocache); VirtualFile child = myRootDir.findChild("1.java"); child.delete(null); @@ -169,14 +174,15 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache.getFilesWithWord("d", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"3.java"}, convert(cache.getFilesWithWord("e", UsageSearchContext.ANY, scope, false))); - checkResult(new String[]{"3.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"3.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } public void testFileCreation() throws Exception { final CacheManager cache = CacheManager.SERVICE.getInstance(myProject); - checkCache(cache); + final TodoCacheManager todocache = TodoCacheManager.SERVICE.getInstance(myProject); + checkCache(cache, todocache); VirtualFile child = myRootDir.createChildData(null, "4.java"); VfsUtil.saveText(child, "xxx //todo"); @@ -190,11 +196,11 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache.getFilesWithWord("d", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"3.java"}, convert(cache.getFilesWithWord("e", UsageSearchContext.ANY, scope, false))); - checkResult(new String[]{"1.java", "3.java", "4.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(1, cache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(1, cache.getTodoCount(myRootDir.findChild("4.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"1.java", "3.java", "4.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(1, todocache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(1, todocache.getTodoCount(myRootDir.findChild("4.java"), TodoIndexPatternProvider.getInstance())); } public void testCrash() throws Exception { @@ -203,7 +209,7 @@ public class IdCacheTest extends CodeInsightTestCase{ System.gc(); } - private void checkCache(CacheManager cache) { + private void checkCache(CacheManager cache, TodoCacheManager todocache) { final GlobalSearchScope scope = GlobalSearchScope.projectScope(myProject); checkResult(ArrayUtil.EMPTY_STRING_ARRAY, convert(cache.getFilesWithWord("xxx", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"1.java"}, convert(cache.getFilesWithWord("a", UsageSearchContext.ANY, scope, false))); @@ -212,10 +218,10 @@ public class IdCacheTest extends CodeInsightTestCase{ checkResult(new String[]{"2.java", "3.java"}, convert(cache.getFilesWithWord("d", UsageSearchContext.ANY, scope, false))); checkResult(new String[]{"3.java"}, convert(cache.getFilesWithWord("e", UsageSearchContext.ANY, scope, false))); - checkResult(new String[]{"1.java", "3.java"}, convert(cache.getFilesWithTodoItems())); - assertEquals(1, cache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(0, cache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); - assertEquals(2, cache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); + checkResult(new String[]{"1.java", "3.java"}, convert(todocache.getFilesWithTodoItems())); + assertEquals(1, todocache.getTodoCount(myRootDir.findChild("1.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(0, todocache.getTodoCount(myRootDir.findChild("2.java"), TodoIndexPatternProvider.getInstance())); + assertEquals(2, todocache.getTodoCount(myRootDir.findChild("3.java"), TodoIndexPatternProvider.getInstance())); } private static VirtualFile[] convert(PsiFile[] psiFiles) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java index 5773600672f6..54a3bf5ce979 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,11 +18,8 @@ package com.intellij.psi.impl.cache; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.IndexPattern; -import com.intellij.psi.search.IndexPatternProvider; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -37,22 +34,6 @@ public interface CacheManager { } @NotNull PsiFile[] getFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); - boolean processFilesWithWord(@NotNull Processor processor,@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); - - /** - * @return all VirtualFile's that contain todo-items under project roots - */ - @NotNull PsiFile[] getFilesWithTodoItems(); - - /** - * @return -1 if it's not known - */ - int getTodoCount(@NotNull VirtualFile file, final IndexPatternProvider patternProvider); - - /** - * @return -1 if it's not known - */ - int getTodoCount(@NotNull VirtualFile file, IndexPattern pattern); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java new file mode 100644 index 000000000000..cd84cc568e5e --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.impl.cache; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.IndexPattern; +import com.intellij.psi.search.IndexPatternProvider; +import org.jetbrains.annotations.NotNull; + +public interface TodoCacheManager { + class SERVICE { + private SERVICE() { + } + + public static TodoCacheManager getInstance(Project project) { + return ServiceManager.getService(project, TodoCacheManager.class); + } + } + + + /** + * @return all VirtualFile's that contain todo-items under project roots + */ + @NotNull + PsiFile[] getFilesWithTodoItems(); + + /** + * @return -1 if it's not known + */ + int getTodoCount(@NotNull VirtualFile file, IndexPatternProvider patternProvider); + + /** + * @return -1 if it's not known + */ + int getTodoCount(@NotNull VirtualFile file, IndexPattern pattern); +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java index 689b68b7725d..3c29d11d47d0 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package com.intellij.psi.impl.cache.impl; -import com.intellij.injected.editor.VirtualFileWindow; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadActionProcessor; import com.intellij.openapi.diagnostic.Logger; @@ -25,8 +24,6 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; @@ -34,18 +31,14 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.impl.cache.CacheManager; 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.todo.TodoIndex; -import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.IndexPattern; -import com.intellij.psi.search.IndexPatternProvider; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * @author Eugene Zhuravlev @@ -142,71 +135,4 @@ public class IndexCacheManagerImpl implements CacheManager{ } return true; } - - @Override - @NotNull - public PsiFile[] getFilesWithTodoItems() { - if (myProject.isDefault()) { - return PsiFile.EMPTY_ARRAY; - } - final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); - final Set allFiles = new HashSet(); - final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); - for (IndexPattern indexPattern : IndexPatternUtil.getIndexPatterns()) { - final Collection files = fileBasedIndex.getContainingFiles( - TodoIndex.NAME, - new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), GlobalSearchScope.allScope(myProject)); - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - for (VirtualFile file : files) { - if (projectFileIndex.isInContent(file)) { - final PsiFile psiFile = myPsiManager.findFile(file); - if (psiFile != null) { - allFiles.add(psiFile); - } - } - } - } - }); - } - return allFiles.isEmpty() ? PsiFile.EMPTY_ARRAY : PsiUtilCore.toPsiFileArray(allFiles); - } - - @Override - public int getTodoCount(@NotNull final VirtualFile file, final IndexPatternProvider patternProvider) { - if (myProject.isDefault()) { - return 0; - } - if (file instanceof VirtualFileWindow) return -1; - final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); - int count = 0; - for (IndexPattern indexPattern : patternProvider.getIndexPatterns()) { - count += fetchCount(fileBasedIndex, file, indexPattern); - } - return count; - } - - @Override - public int getTodoCount(@NotNull final VirtualFile file, final IndexPattern pattern) { - if (myProject.isDefault()) { - return 0; - } - if (file instanceof VirtualFileWindow) return -1; - return fetchCount(FileBasedIndex.getInstance(), file, pattern); - } - - private int fetchCount(final FileBasedIndex fileBasedIndex, final VirtualFile file, final IndexPattern indexPattern) { - final int[] count = {0}; - fileBasedIndex.processValues( - TodoIndex.NAME, new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), file, - new FileBasedIndex.ValueProcessor() { - @Override - public boolean process(final VirtualFile file, final Integer value) { - count[0] += value.intValue(); - return true; - } - }, GlobalSearchScope.fileScope(myProject, file)); - return count[0]; - } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java new file mode 100644 index 000000000000..0b1e5a10273e --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java @@ -0,0 +1,126 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intellij.psi.impl.cache.impl; + +import com.intellij.injected.editor.VirtualFileWindow; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.FileIndexFacade; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.impl.cache.TodoCacheManager; +import com.intellij.psi.impl.cache.impl.todo.TodoIndex; +import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.IndexPattern; +import com.intellij.psi.search.IndexPatternProvider; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.util.indexing.FileBasedIndex; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * @author Eugene Zhuravlev + * Date: Jan 16, 2008 + */ +public class IndexTodoCacheManagerImpl implements TodoCacheManager { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.cache.impl.IndexTodoCacheManagerImpl"); + private final Project myProject; + private final PsiManager myPsiManager; + + public IndexTodoCacheManagerImpl(PsiManager psiManager) { + myPsiManager = psiManager; + myProject = psiManager.getProject(); + } + + public static boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile, FileIndexFacade index) { + return (scope.isSearchOutsideRootModel() || index.isInContent(virtualFile) || index.isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary(); + } + + @NotNull + public PsiFile[] getFilesWithTodoItems() { + if (myProject.isDefault()) { + return PsiFile.EMPTY_ARRAY; + } + final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + final Set allFiles = new HashSet(); + final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); + for (IndexPattern indexPattern : IndexPatternUtil.getIndexPatterns()) { + final Collection files = fileBasedIndex.getContainingFiles( + TodoIndex.NAME, + new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), GlobalSearchScope.allScope(myProject)); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + for (VirtualFile file : files) { + if (projectFileIndex.isInContent(file)) { + final PsiFile psiFile = myPsiManager.findFile(file); + if (psiFile != null) { + allFiles.add(psiFile); + } + } + } + } + }); + } + return allFiles.isEmpty() ? PsiFile.EMPTY_ARRAY : PsiUtilCore.toPsiFileArray(allFiles); + } + + @Override + public int getTodoCount(@NotNull final VirtualFile file, final IndexPatternProvider patternProvider) { + if (myProject.isDefault()) { + return 0; + } + if (file instanceof VirtualFileWindow) return -1; + final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + int count = 0; + for (IndexPattern indexPattern : patternProvider.getIndexPatterns()) { + count += fetchCount(fileBasedIndex, file, indexPattern); + } + return count; + } + + @Override + public int getTodoCount(@NotNull final VirtualFile file, final IndexPattern pattern) { + if (myProject.isDefault()) { + return 0; + } + if (file instanceof VirtualFileWindow) return -1; + return fetchCount(FileBasedIndex.getInstance(), file, pattern); + } + + private int fetchCount(final FileBasedIndex fileBasedIndex, final VirtualFile file, final IndexPattern indexPattern) { + final int[] count = {0}; + fileBasedIndex.processValues( + TodoIndex.NAME, new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), file, + new FileBasedIndex.ValueProcessor() { + @Override + public boolean process(final VirtualFile file, final Integer value) { + count[0] += value.intValue(); + return true; + } + }, GlobalSearchScope.fileScope(myProject, file)); + return count[0]; + } +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java index 2104ff613b81..8cb9413279a1 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java @@ -17,7 +17,7 @@ package com.intellij.psi.impl.search; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.TodoCacheManager; import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.IndexPatternProvider; import com.intellij.psi.search.searches.IndexPatternSearch; @@ -32,14 +32,14 @@ class IndexPatternSearchImpl extends IndexPatternSearch { @Override protected int getOccurrencesCountImpl(PsiFile file, IndexPatternProvider provider) { - int count = CacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), provider); + int count = TodoCacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), provider); if (count != -1) return count; return search(file, provider).findAll().size(); } @Override protected int getOccurrencesCountImpl(PsiFile file, IndexPattern pattern) { - int count = CacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), pattern); + int count = TodoCacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), pattern); if (count != -1) return count; return search(file, pattern).findAll().size(); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java index 4f1c94e33001..2945ddf4d65c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java @@ -29,7 +29,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.TodoCacheManager; import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.IndexPatternOccurrence; import com.intellij.psi.search.IndexPatternProvider; @@ -60,7 +60,7 @@ public class IndexPatternSearcher implements QueryExecutor +