1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package com.intellij.structuralsearch.impl.matcher.compiler;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageNamesValidation;
import com.intellij.lang.refactoring.NamesValidator;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiSearchHelper;
import com.intellij.util.Processor;
import gnu.trove.THashMap;
import java.util.Set;
/**
* @author Maxim.Mossienko
*/
class FindInFilesOptimizingSearchHelper extends OptimizingSearchHelperBase {
private PsiSearchHelper helper;
private THashMap<PsiFile,PsiFile> filesToScan;
private THashMap<PsiFile,PsiFile> filesToScan2;
private Lexer javaLexer;
private final boolean findMatchingFiles;
FindInFilesOptimizingSearchHelper(CompileContext _context, boolean _findMatchngFiles, Project project) {
super(_context);
findMatchingFiles = _findMatchngFiles;
if (findMatchingFiles) {
helper = PsiSearchHelper.SERVICE.getInstance(project);
if (filesToScan == null) {
filesToScan = new THashMap<PsiFile,PsiFile>();
filesToScan2 = new THashMap<PsiFile,PsiFile>();
}
}
}
public boolean doOptimizing() {
return findMatchingFiles;
}
public void clear() {
super.clear();
if (filesToScan != null) {
filesToScan.clear();
filesToScan2.clear();
helper = null;
}
}
protected void doAddSearchWordInCode(final String refname) {
final FileType fileType = context.getOptions().getFileType();
final Language language = fileType instanceof LanguageFileType ? ((LanguageFileType)fileType).getLanguage() : Language.ANY;
final NamesValidator namesValidator = LanguageNamesValidation.INSTANCE.forLanguage(language);
if (namesValidator.isKeyword(refname, context.getProject())) {
helper.processAllFilesWithWordInText(refname, (GlobalSearchScope)context.getOptions().getScope(), new MyFileProcessor(), true);
} else {
helper.processAllFilesWithWord(refname, (GlobalSearchScope)context.getOptions().getScope(), new MyFileProcessor(), true);
}
}
protected void doAddSearchWordInText(final String refname) {
helper.processAllFilesWithWordInText(refname, (GlobalSearchScope)context.getOptions().getScope(), new MyFileProcessor(), true);
}
protected void doAddSearchWordInComments(final String refname) {
helper.processAllFilesWithWordInComments(refname, (GlobalSearchScope)context.getOptions().getScope(), new MyFileProcessor());
}
protected void doAddSearchWordInLiterals(final String refname) {
helper.processAllFilesWithWordInLiterals(refname, (GlobalSearchScope)context.getOptions().getScope(), new MyFileProcessor());
}
public void endTransaction() {
super.endTransaction();
THashMap<PsiFile,PsiFile> map = filesToScan;
if (map.size() > 0) map.clear();
filesToScan = filesToScan2;
filesToScan2 = map;
}
public Set<PsiFile> getFilesSetToScan() {
return filesToScan.keySet();
}
private class MyFileProcessor implements Processor<PsiFile> {
public boolean process(PsiFile file) {
if (scanRequest == 0 ||
filesToScan.get(file)!=null) {
filesToScan2.put(file,file);
}
return true;
}
}
}
|