From 68a9812a881174caa62a2d2808d7160d3f2faa1b Mon Sep 17 00:00:00 2001 From: Evgeny Pasynkov Date: Wed, 13 Jun 2012 11:05:01 +0200 Subject: [PATCH] Split PsiSearchHelper and PsiTodoSearchHelper --- .../intellij/psi/search/UpdateCacheTest.java | 18 +-- .../intellij/psi/search/PsiSearchHelper.java | 2 +- .../psi/search/PsiTodoSearchHelper.java | 11 ++ .../daemon/impl/GeneralHighlightingPass.java | 4 +- .../src/com/intellij/ide/todo/TodoFilter.java | 4 +- .../intellij/ide/todo/TodoTreeBuilder.java | 6 +- .../intellij/ide/todo/TodoTreeStructure.java | 5 +- .../vcs/checkin/TodoCheckinHandlerWorker.java | 6 +- .../psi/impl/search/PsiSearchHelperImpl.java | 83 +---------- .../impl/search/PsiTodoSearchHelperImpl.java | 131 ++++++++++++++++++ .../vcs/changes/TodoForBaseRevision.java | 4 +- .../vcs/changes/TodoForExistingFile.java | 6 +- .../openapi/vcs/changes/TodoForRanges.java | 4 +- .../src/META-INF/LangExtensions.xml | 3 + .../src/com/siyeh/ig/maturity/TodoUtil.java | 4 +- 15 files changed, 179 insertions(+), 112 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/psi/impl/search/PsiTodoSearchHelperImpl.java diff --git a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java index e39f43603064..8e89110d977c 100644 --- a/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/search/UpdateCacheTest.java @@ -233,7 +233,7 @@ public class UpdateCacheTest extends PsiTestCase{ } public void testAddExcludeRoot() throws Exception{ - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches ProjectRootManagerEx rootManager = (ProjectRootManagerEx)ProjectRootManager.getInstance(myProject); final VirtualFile root = rootManager.getContentRoots()[0]; @@ -292,7 +292,7 @@ public class UpdateCacheTest extends PsiTestCase{ }); - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches new WriteCommandAction.Simple(getProject()) { @Override @@ -304,7 +304,7 @@ public class UpdateCacheTest extends PsiTestCase{ PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { @@ -352,7 +352,7 @@ public class UpdateCacheTest extends PsiTestCase{ PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { @@ -379,7 +379,7 @@ public class UpdateCacheTest extends PsiTestCase{ final ModuleRootManager rootManager = ModuleRootManager.getInstance(myModule); final VirtualFile root = rootManager.getContentRoots()[0]; - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches new WriteCommandAction.Simple(getProject()) { @Override @@ -391,7 +391,7 @@ public class UpdateCacheTest extends PsiTestCase{ PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { @@ -466,7 +466,7 @@ public class UpdateCacheTest extends PsiTestCase{ ProjectRootManagerEx rootManager = (ProjectRootManagerEx)ProjectRootManager.getInstance(myProject); final VirtualFile root = rootManager.getContentRoots()[0]; - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to initialize caches new WriteCommandAction.Simple(getProject()) { @Override @@ -478,7 +478,7 @@ public class UpdateCacheTest extends PsiTestCase{ PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches + PsiTodoSearchHelper.SERVICE.getInstance(myProject).findFilesWithTodoItems(); // to update caches ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { @@ -530,7 +530,7 @@ public class UpdateCacheTest extends PsiTestCase{ } private void checkTodos(@NonNls String[] expectedFiles){ - PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(myProject); + PsiTodoSearchHelper helper = PsiTodoSearchHelper.SERVICE.getInstance(myProject); PsiFile[] files = helper.findFilesWithTodoItems(); diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java b/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java index 15ff4815a4b8..c5b9f538df76 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java +++ b/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java @@ -31,7 +31,7 @@ import org.jetbrains.annotations.Nullable; * * Use {@link com.intellij.psi.search.PsiSearchHelper.SERVICE#getInstance}() to get a search helper instance. */ -public interface PsiSearchHelper extends PsiTodoSearchHelper { +public interface PsiSearchHelper { class SERVICE { private SERVICE() { } diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java b/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java index fbfd06d5196d..c0d16c6ef762 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java +++ b/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java @@ -15,6 +15,8 @@ */ package com.intellij.psi.search; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -24,6 +26,15 @@ import org.jetbrains.annotations.NotNull; * Time: 10:08 AM */ public interface PsiTodoSearchHelper { + class SERVICE { + private SERVICE() { + } + + public static PsiTodoSearchHelper getInstance(Project project) { + return ServiceManager.getService(project, PsiTodoSearchHelper.class); + } + } + /** * Returns the list of all files in the project which have to do items. * diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java index 2d991fff0e72..6d67b1976d28 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java @@ -61,7 +61,7 @@ import com.intellij.problems.WolfTheProblemSolver; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.injected.Place; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.psi.tree.IElementType; import com.intellij.util.Processor; @@ -778,7 +778,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP @NotNull ProperTextRange priorityRange, @NotNull Collection result, @NotNull Collection outsideResult) { - PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(file.getProject()); + PsiTodoSearchHelper helper = PsiTodoSearchHelper.SERVICE.getInstance(file.getProject()); TodoItem[] todoItems = helper.findTodoItems(file, startOffset, endOffset); if (todoItems.length == 0) return; diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java index b8e596004f23..e34acf5b0d8a 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java @@ -18,7 +18,7 @@ package com.intellij.ide.todo; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoPattern; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -52,7 +52,7 @@ public class TodoFilter implements Cloneable{ * @return true if and only if specified psiFile has * TodoItems accepted by the filter. */ - public boolean accept(PsiSearchHelper searchHelper,PsiFile psiFile){ + public boolean accept(PsiTodoSearchHelper searchHelper,PsiFile psiFile){ for(Iterator i=iterator();i.hasNext();){ TodoPattern todoPattern= i.next(); if(searchHelper.getTodoItemsCount(psiFile,todoPattern)>0){ diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java index fa524d04a5bc..893d69a8d795 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java @@ -42,7 +42,7 @@ import com.intellij.openapi.vcs.FileStatusListener; import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.usageView.UsageTreeColorsScheme; import com.intellij.util.containers.HashMap; @@ -77,7 +77,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder { protected final HashMap myFile2Highlighter; - protected final PsiSearchHelper mySearchHelper; + protected final PsiTodoSearchHelper mySearchHelper; /** * If this flag is false then the updateTree() method does nothing. But when * the flag becomes true and myDirtyFileSet isn't empty the update is invoked. @@ -99,7 +99,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder { myFile2Highlighter = new HashMap(); PsiManager psiManager = PsiManager.getInstance(myProject); - mySearchHelper = PsiSearchHelper.SERVICE.getInstance(myProject); + mySearchHelper = PsiTodoSearchHelper.SERVICE.getInstance(myProject); psiManager.addPsiTreeChangeListener(new MyPsiTreeChangeListener()); myFileStatusListener = new MyFileStatusListener(); diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java index 03a550b848a3..67687fc6da10 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java @@ -23,7 +23,6 @@ import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoPattern; @@ -44,7 +43,7 @@ public abstract class TodoTreeStructure extends AbstractTreeStructureBase implem private boolean myAreModulesShown; - protected final PsiSearchHelper mySearchHelper; + protected final PsiTodoSearchHelper mySearchHelper; /** * Current TodoFilter. If no filter is set then this field is null. */ @@ -54,7 +53,7 @@ public abstract class TodoTreeStructure extends AbstractTreeStructureBase implem super(project); myArePackagesShown=true; mySummaryElement=new ToDoSummary(); - mySearchHelper= PsiSearchHelper.SERVICE.getInstance(project); + mySearchHelper= PsiTodoSearchHelper.SERVICE.getInstance(project); } final void setTreeBuilder(TodoTreeBuilder builder){ diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java b/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java index 142dc882e729..e16baef9e2dd 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java +++ b/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java @@ -43,7 +43,7 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.impl.search.LightIndexPatternSearch; import com.intellij.psi.impl.search.TodoItemsCreator; import com.intellij.psi.search.IndexPatternOccurrence; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.psi.search.searches.IndexPatternSearch; import com.intellij.util.PairConsumer; @@ -65,7 +65,7 @@ public class TodoCheckinHandlerWorker { private final TodoFilter myTodoFilter; private final boolean myIncludePattern; private final PsiManager myPsiManager; - private final PsiSearchHelper mySearchHelper; + private final PsiTodoSearchHelper mySearchHelper; private final List myAddedOrEditedTodos; private final List myInChangedTodos; @@ -81,7 +81,7 @@ public class TodoCheckinHandlerWorker { myTodoFilter = todoFilter; myIncludePattern = includePattern; myPsiManager = PsiManager.getInstance(project); - mySearchHelper = PsiSearchHelper.SERVICE.getInstance(project); + mySearchHelper = PsiTodoSearchHelper.SERVICE.getInstance(project); myAddedOrEditedTodos = new ArrayList(); myInChangedTodos = new ArrayList(); mySkipped = new SmartList>(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index c8245d5fe416..fb13ffed6657 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -18,7 +18,6 @@ package com.intellij.psi.impl.search; import com.intellij.codeInsight.CommentUtil; import com.intellij.concurrency.JobUtil; -import com.intellij.ide.todo.TodoIndexPatternProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.ReadActionProcessor; @@ -28,7 +27,10 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.NullableComputable; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; @@ -38,7 +40,6 @@ import com.intellij.psi.impl.cache.impl.IndexCacheManagerImpl; import com.intellij.psi.impl.cache.impl.id.IdIndex; import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; import com.intellij.psi.search.*; -import com.intellij.psi.search.searches.IndexPatternSearch; import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; @@ -60,7 +61,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.search.PsiSearchHelperImpl"); private final PsiManagerEx myManager; - private static final TodoItem[] EMPTY_TODO_ITEMS = new TodoItem[0]; @Override @NotNull @@ -80,81 +80,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { myManager = manager; } - @Override - @NotNull - public PsiFile[] findFilesWithTodoItems() { - return CacheManager.SERVICE.getInstance(myManager.getProject()).getFilesWithTodoItems(); - } - - @Override - @NotNull - public TodoItem[] findTodoItems(@NotNull PsiFile file) { - return findTodoItems(file, 0, file.getTextLength()); - } - - @Override - @NotNull - public TodoItem[] findTodoItems(@NotNull PsiFile file, int startOffset, int endOffset) { - final Collection occurrences = IndexPatternSearch.search(file, TodoIndexPatternProvider.getInstance()).findAll(); - if (occurrences.isEmpty()) { - return EMPTY_TODO_ITEMS; - } - - return processTodoOccurences(startOffset, endOffset, occurrences); - } - - private TodoItem[] processTodoOccurences(int startOffset, int endOffset, Collection occurrences) { - List items = new ArrayList(occurrences.size()); - TextRange textRange = new TextRange(startOffset, endOffset); - final TodoItemsCreator todoItemsCreator = new TodoItemsCreator(); - for(IndexPatternOccurrence occurrence: occurrences) { - TextRange occurrenceRange = occurrence.getTextRange(); - if (textRange.contains(occurrenceRange)) { - items.add(todoItemsCreator.createTodo(occurrence)); - } - } - - return items.toArray(new TodoItem[items.size()]); - } - - @NotNull - @Override - public TodoItem[] findTodoItemsLight(@NotNull PsiFile file) { - return findTodoItemsLight(file, 0, file.getTextLength()); - } - - @NotNull - @Override - public TodoItem[] findTodoItemsLight(@NotNull PsiFile file, int startOffset, int endOffset) { - final Collection occurrences = - LightIndexPatternSearch.SEARCH.createQuery(new IndexPatternSearch.SearchParameters(file, TodoIndexPatternProvider.getInstance())).findAll(); - - if (occurrences.isEmpty()) { - return EMPTY_TODO_ITEMS; - } - - return processTodoOccurences(startOffset, endOffset, occurrences); - } - - @Override - public int getTodoItemsCount(@NotNull PsiFile file) { - int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), TodoIndexPatternProvider.getInstance()); - if (count != -1) return count; - return findTodoItems(file).length; - } - - @Override - public int getTodoItemsCount(@NotNull PsiFile file, @NotNull TodoPattern pattern) { - int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), pattern.getIndexPattern()); - if (count != -1) return count; - TodoItem[] items = findTodoItems(file); - count = 0; - for (TodoItem item : items) { - if (item.getPattern().equals(pattern)) count++; - } - return count; - } - @Override @NotNull public PsiElement[] findCommentsContainingIdentifier(@NotNull String identifier, @NotNull SearchScope searchScope) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiTodoSearchHelperImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiTodoSearchHelperImpl.java new file mode 100644 index 000000000000..3530e6493d6f --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/PsiTodoSearchHelperImpl.java @@ -0,0 +1,131 @@ +/* + * 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.search; + +import com.intellij.ide.todo.TodoIndexPatternProvider; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.PsiManagerEx; +import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; +import com.intellij.psi.search.IndexPatternOccurrence; +import com.intellij.psi.search.PsiTodoSearchHelper; +import com.intellij.psi.search.TodoItem; +import com.intellij.psi.search.TodoPattern; +import com.intellij.psi.search.searches.IndexPatternSearch; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class PsiTodoSearchHelperImpl implements PsiTodoSearchHelper { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.search.PsiTodoSearchHelperImpl"); + + private final PsiManagerEx myManager; + private static final TodoItem[] EMPTY_TODO_ITEMS = new TodoItem[0]; + + public PsiTodoSearchHelperImpl(PsiManagerEx manager) { + myManager = manager; + } + + @Override + @NotNull + public PsiFile[] findFilesWithTodoItems() { + return CacheManager.SERVICE.getInstance(myManager.getProject()).getFilesWithTodoItems(); + } + + @Override + @NotNull + public TodoItem[] findTodoItems(@NotNull PsiFile file) { + return findTodoItems(file, 0, file.getTextLength()); + } + + @Override + @NotNull + public TodoItem[] findTodoItems(@NotNull PsiFile file, int startOffset, int endOffset) { + final Collection occurrences = IndexPatternSearch.search(file, TodoIndexPatternProvider.getInstance()).findAll(); + if (occurrences.isEmpty()) { + return EMPTY_TODO_ITEMS; + } + + return processTodoOccurences(startOffset, endOffset, occurrences); + } + + private TodoItem[] processTodoOccurences(int startOffset, int endOffset, Collection occurrences) { + List items = new ArrayList(occurrences.size()); + TextRange textRange = new TextRange(startOffset, endOffset); + final TodoItemsCreator todoItemsCreator = new TodoItemsCreator(); + for(IndexPatternOccurrence occurrence: occurrences) { + TextRange occurrenceRange = occurrence.getTextRange(); + if (textRange.contains(occurrenceRange)) { + items.add(todoItemsCreator.createTodo(occurrence)); + } + } + + return items.toArray(new TodoItem[items.size()]); + } + + @NotNull + @Override + public TodoItem[] findTodoItemsLight(@NotNull PsiFile file) { + return findTodoItemsLight(file, 0, file.getTextLength()); + } + + @NotNull + @Override + public TodoItem[] findTodoItemsLight(@NotNull PsiFile file, int startOffset, int endOffset) { + final Collection occurrences = + LightIndexPatternSearch.SEARCH.createQuery(new IndexPatternSearch.SearchParameters(file, TodoIndexPatternProvider.getInstance())).findAll(); + + if (occurrences.isEmpty()) { + return EMPTY_TODO_ITEMS; + } + + return processTodoOccurences(startOffset, endOffset, occurrences); + } + + @Override + public int getTodoItemsCount(@NotNull PsiFile file) { + int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), TodoIndexPatternProvider.getInstance()); + if (count != -1) return count; + return findTodoItems(file).length; + } + + @Override + public int getTodoItemsCount(@NotNull PsiFile file, @NotNull TodoPattern pattern) { + int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), pattern.getIndexPattern()); + if (count != -1) return count; + TodoItem[] items = findTodoItems(file); + count = 0; + for (TodoItem item : items) { + if (item.getPattern().equals(pattern)) count++; + } + return count; + } + + private static ArrayList getWordEntries(String name, boolean caseSensitively) { + List words = StringUtil.getWordsInStringLongestFirst(name); + final ArrayList keys = new ArrayList(); + for (String word : words) { + keys.add(new IdIndexEntry(word, caseSensitively)); + } + return keys; + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java index 63ddf87e0c60..7e16b694280c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java @@ -19,7 +19,7 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.TextRange; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.util.Consumer; @@ -51,7 +51,7 @@ public class TodoForBaseRevision extends TodoForRanges { protected TodoItem[] getTodoItems() { final TodoItem[] items = (TodoItem[])myGetter.get(); if (items != null) return items; - final TodoItem[] todoItems = getTodoForText(PsiSearchHelper.SERVICE.getInstance(myProject)); + final TodoItem[] todoItems = getTodoForText(PsiTodoSearchHelper.SERVICE.getInstance(myProject)); if (todoItems != null) { mySaver.consume(todoItems); } diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java index 5a0f02dae3bc..ae89b44687df 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java @@ -16,16 +16,14 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiManager; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import java.util.List; @@ -53,7 +51,7 @@ public class TodoForExistingFile extends TodoForRanges { return ApplicationManager.getApplication().runReadAction(new Computable() { @Override public TodoItem[] compute() { - final PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(myProject); + final PsiTodoSearchHelper helper = PsiTodoSearchHelper.SERVICE.getInstance(myProject); PsiFile psiFile = myFile == null ? null : PsiManager.getInstance(myProject).findFile(myFile); if (psiFile != null) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java index a6e65a39fa68..dac706fef5dd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java @@ -26,7 +26,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.checkin.StepIntersection; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.util.containers.Convertor; @@ -104,7 +104,7 @@ public abstract class TodoForRanges { protected abstract TodoItem[] getTodoItems(); - protected TodoItem[] getTodoForText(PsiSearchHelper helper) { + protected TodoItem[] getTodoForText(PsiTodoSearchHelper helper) { final PsiFile psiFile = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public PsiFile compute() { diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 34444adf12f5..caa74bd9e508 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -73,6 +73,9 @@ + + diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java index 527047d63270..a75f9185bf3e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java @@ -18,7 +18,7 @@ package com.siyeh.ig.maturity; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; public class TodoUtil { @@ -28,7 +28,7 @@ public class TodoUtil { public static boolean isTodoComment(PsiComment comment) { final PsiFile file = comment.getContainingFile(); - final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(comment.getProject()); + final PsiTodoSearchHelper searchHelper = PsiTodoSearchHelper.SERVICE.getInstance(comment.getProject()); final TodoItem[] todoItems = searchHelper.findTodoItems(file); for (final TodoItem todoItem : todoItems) { final TextRange commentTextRange = comment.getTextRange();