0e6243097c84640a54af2e54a38d604ec5d886ad
[idea/community.git] / platform / editor-ui-ex / src / com / intellij / psi / impl / search / PsiTodoSearchHelperImpl.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2
3 package com.intellij.psi.impl.search;
4
5 import com.intellij.ide.todo.TodoConfiguration;
6 import com.intellij.ide.todo.TodoIndexPatternProvider;
7 import com.intellij.openapi.util.TextRange;
8 import com.intellij.psi.PsiFile;
9 import com.intellij.psi.impl.PsiManagerEx;
10 import com.intellij.psi.impl.cache.TodoCacheManager;
11 import com.intellij.psi.search.IndexPatternOccurrence;
12 import com.intellij.psi.search.PsiTodoSearchHelper;
13 import com.intellij.psi.search.TodoItem;
14 import com.intellij.psi.search.TodoPattern;
15 import com.intellij.psi.search.searches.IndexPatternSearch;
16 import org.jetbrains.annotations.NotNull;
17
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.List;
21
22 public class PsiTodoSearchHelperImpl implements PsiTodoSearchHelper {
23   private final PsiManagerEx myManager;
24   private static final TodoItem[] EMPTY_TODO_ITEMS = new TodoItem[0];
25
26   public PsiTodoSearchHelperImpl(PsiManagerEx manager) {
27     myManager = manager;
28   }
29
30   @Override
31   @NotNull
32   public PsiFile[] findFilesWithTodoItems() {
33     return TodoCacheManager.SERVICE.getInstance(myManager.getProject()).getFilesWithTodoItems();
34   }
35
36   @Override
37   @NotNull
38   public TodoItem[] findTodoItems(@NotNull PsiFile file) {
39     return findTodoItems(file, 0, file.getTextLength());
40   }
41
42   @Override
43   @NotNull
44   public TodoItem[] findTodoItems(@NotNull PsiFile file, int startOffset, int endOffset) {
45     final Collection<IndexPatternOccurrence> occurrences =
46       IndexPatternSearch.search(file, TodoIndexPatternProvider.getInstance(), TodoConfiguration.getInstance().isMultiLine()).findAll();
47     if (occurrences.isEmpty()) {
48       return EMPTY_TODO_ITEMS;
49     }
50
51     return processTodoOccurences(startOffset, endOffset, occurrences);
52   }
53
54   @NotNull
55   private static TodoItem[] processTodoOccurences(int startOffset, int endOffset, Collection<? extends IndexPatternOccurrence> occurrences) {
56     List<TodoItem> items = new ArrayList<>(occurrences.size());
57     TextRange textRange = new TextRange(startOffset, endOffset);
58     final TodoItemsCreator todoItemsCreator = new TodoItemsCreator();
59     for (IndexPatternOccurrence occurrence: occurrences) {
60       TextRange occurrenceRange = occurrence.getTextRange();
61       if (textRange.intersectsStrict(occurrenceRange) ||
62           occurrence.getAdditionalTextRanges().stream().anyMatch(r -> textRange.intersectsStrict(r))) {
63         items.add(todoItemsCreator.createTodo(occurrence));
64       }
65     }
66
67     return items.toArray(new TodoItem[0]);
68   }
69
70   @NotNull
71   @Override
72   public TodoItem[] findTodoItemsLight(@NotNull PsiFile file) {
73     return findTodoItemsLight(file, 0, file.getTextLength());
74   }
75
76   @NotNull
77   @Override
78   public TodoItem[] findTodoItemsLight(@NotNull PsiFile file, int startOffset, int endOffset) {
79     final Collection<IndexPatternOccurrence> occurrences =
80       LightIndexPatternSearch.SEARCH.createQuery(
81         new IndexPatternSearch.SearchParameters(file, TodoIndexPatternProvider.getInstance(), TodoConfiguration.getInstance().isMultiLine())
82       ).findAll();
83
84     if (occurrences.isEmpty()) {
85       return EMPTY_TODO_ITEMS;
86     }
87
88     return processTodoOccurences(startOffset, endOffset, occurrences);
89   }
90
91   @Override
92   public int getTodoItemsCount(@NotNull PsiFile file) {
93     int count = TodoCacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), TodoIndexPatternProvider.getInstance());
94     if (count != -1) return count;
95     return findTodoItems(file).length;
96   }
97
98   @Override
99   public int getTodoItemsCount(@NotNull PsiFile file, @NotNull TodoPattern pattern) {
100     int count = TodoCacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), pattern.getIndexPattern());
101     if (count != -1) return count;
102     TodoItem[] items = findTodoItems(file);
103     count = 0;
104     for (TodoItem item : items) {
105       if (item.getPattern().equals(pattern)) count++;
106     }
107     return count;
108   }
109
110
111   /**
112    * Returns if td items should be highlighted in editor
113    *
114    * @param file    the file to return the to do count for.
115    * @return if td items should be highlighted in editor. True by default
116    */
117   public boolean shouldHighlightInEditor(@NotNull PsiFile file) {
118     return true;
119   }
120 }