EA-65305 (IAE: StructuralSearchUtil.getProfileByPsiElement)
[idea/community.git] / platform / structuralsearch / source / com / intellij / structuralsearch / StructuralSearchUtil.java
1 package com.intellij.structuralsearch;
2
3 import com.intellij.lang.Language;
4 import com.intellij.openapi.fileTypes.*;
5 import com.intellij.psi.PsiElement;
6 import com.intellij.structuralsearch.impl.matcher.MatchUtils;
7 import com.intellij.structuralsearch.plugin.ui.Configuration;
8 import com.intellij.tokenindex.LanguageTokenizer;
9 import com.intellij.tokenindex.Tokenizer;
10 import org.jetbrains.annotations.Contract;
11 import org.jetbrains.annotations.NotNull;
12 import org.jetbrains.annotations.Nullable;
13
14 import java.util.*;
15
16 /**
17  * @author Eugene.Kudelevsky
18  */
19 public class StructuralSearchUtil {
20   private static LanguageFileType ourDefaultFileType = null;
21
22   public static boolean ourUseUniversalMatchingAlgorithm = false;
23   private static StructuralSearchProfile[] ourNewStyleProfiles;
24   private static List<Configuration> ourPredefinedConfigurations = null;
25
26   private StructuralSearchUtil() {}
27
28   @Nullable
29   public static StructuralSearchProfile getProfileByPsiElement(@NotNull PsiElement element) {
30     return getProfileByLanguage(element.getLanguage());
31   }
32
33   @Contract("null -> false")
34   public static boolean isIdentifier(PsiElement element) {
35     if (element == null) return false;
36     final StructuralSearchProfile profile = getProfileByPsiElement(element);
37     return profile != null && profile.isIdentifier(element);
38   }
39
40   private static StructuralSearchProfile[] getNewStyleProfiles() {
41     if (ourNewStyleProfiles == null) {
42       final List<StructuralSearchProfile> list = new ArrayList<StructuralSearchProfile>();
43
44       for (StructuralSearchProfile profile : StructuralSearchProfile.EP_NAME.getExtensions()) {
45         if (profile instanceof StructuralSearchProfileBase) {
46           list.add(profile);
47         }
48       }
49       list.add(new XmlStructuralSearchProfile());
50       ourNewStyleProfiles = list.toArray(new StructuralSearchProfile[list.size()]);
51     }
52     return ourNewStyleProfiles;
53   }
54
55   private static StructuralSearchProfile[] getProfiles() {
56     return ourUseUniversalMatchingAlgorithm
57            ? getNewStyleProfiles()
58            : StructuralSearchProfile.EP_NAME.getExtensions();
59   }
60
61   public static FileType getDefaultFileType() {
62     if (ourDefaultFileType == null) {
63       for (StructuralSearchProfile profile : getProfiles()) {
64         ourDefaultFileType = profile.getDefaultFileType(ourDefaultFileType);
65       }
66       if (ourDefaultFileType == null) {
67         ourDefaultFileType = StdFileTypes.XML;
68       }
69     }
70     assert ourDefaultFileType instanceof LanguageFileType : "file type not valid for structural search: " + ourDefaultFileType.getName();
71     return ourDefaultFileType;
72   }
73
74   @Nullable
75   public static StructuralSearchProfile getProfileByLanguage(@NotNull Language language) {
76
77     for (StructuralSearchProfile profile : getProfiles()) {
78       if (profile.isMyLanguage(language)) {
79         return profile;
80       }
81     }
82     return null;
83   }
84
85   @Nullable
86   public static Tokenizer getTokenizerForLanguage(@NotNull Language language) {
87     return LanguageTokenizer.INSTANCE.forLanguage(language);
88   }
89
90   public static boolean isTypedVariable(@NotNull final String name) {
91     return name.charAt(0)=='$' && name.charAt(name.length()-1)=='$';
92   }
93
94   @Nullable
95   public static StructuralSearchProfile getProfileByFileType(FileType fileType) {
96
97     for (StructuralSearchProfile profile : getProfiles()) {
98       if (profile.canProcess(fileType)) {
99         return profile;
100       }
101     }
102
103     return null;
104   }
105
106   @NotNull
107   public static FileType[] getSuitableFileTypes() {
108     Set<FileType> allFileTypes = new HashSet<FileType>();
109     Collections.addAll(allFileTypes, FileTypeManager.getInstance().getRegisteredFileTypes());
110     for (Language language : Language.getRegisteredLanguages()) {
111       FileType fileType = language.getAssociatedFileType();
112       if (fileType != null) {
113         allFileTypes.add(fileType);
114       }
115     }
116
117     List<FileType> result = new ArrayList<FileType>();
118     for (FileType fileType : allFileTypes) {
119       if (fileType instanceof LanguageFileType) {
120         result.add(fileType);
121       }
122     }
123
124     return result.toArray(new FileType[result.size()]);
125   }
126
127   public static String shieldSpecialChars(String word) {
128     final StringBuilder buf = new StringBuilder(word.length());
129
130     for (int i = 0; i < word.length(); ++i) {
131       if (MatchUtils.SPECIAL_CHARS.indexOf(word.charAt(i)) != -1) {
132         buf.append("\\");
133       }
134       buf.append(word.charAt(i));
135     }
136
137     return buf.toString();
138   }
139
140   public static List<Configuration> getPredefinedTemplates() {
141     if (ourPredefinedConfigurations == null) {
142       final List<Configuration> result = new ArrayList<Configuration>();
143       for (StructuralSearchProfile profile : getProfiles()) {
144         Collections.addAll(result, profile.getPredefinedTemplates());
145       }
146       Collections.sort(result);
147       ourPredefinedConfigurations = Collections.unmodifiableList(result);
148     }
149     return ourPredefinedConfigurations;
150   }
151
152   public static boolean isDocCommentOwner(PsiElement match) {
153     final StructuralSearchProfile profile = getProfileByPsiElement(match);
154     return profile != null && profile.isDocCommentOwner(match);
155   }
156 }