summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java')
-rw-r--r--platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java169
1 files changed, 169 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java
new file mode 100644
index 000000000000..b37c10143636
--- /dev/null
+++ b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchUtil.java
@@ -0,0 +1,169 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.lang.Language;
+import com.intellij.openapi.fileTypes.*;
+import com.intellij.openapi.fileTypes.impl.AbstractFileType;
+import com.intellij.psi.PsiElement;
+import com.intellij.structuralsearch.impl.matcher.MatchUtils;
+import com.intellij.structuralsearch.plugin.ui.Configuration;
+import com.intellij.tokenindex.LanguageTokenizer;
+import com.intellij.tokenindex.Tokenizer;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class StructuralSearchUtil {
+ private static LanguageFileType ourDefaultFileType = null;
+
+ public static boolean ourUseUniversalMatchingAlgorithm = false;
+ private static StructuralSearchProfile[] ourNewStyleProfiles;
+ private static List<Configuration> ourPredefinedConfigurations = null;
+
+ private StructuralSearchUtil() {}
+
+ @Nullable
+ public static StructuralSearchProfile getProfileByPsiElement(@NotNull PsiElement element) {
+ return getProfileByLanguage(element.getLanguage());
+ }
+
+ @Contract("null -> false")
+ public static boolean isIdentifier(PsiElement element) {
+ final StructuralSearchProfile profile = getProfileByPsiElement(element);
+ return profile != null && profile.isIdentifier(element);
+ }
+
+ private static StructuralSearchProfile[] getNewStyleProfiles() {
+ if (ourNewStyleProfiles == null) {
+ final List<StructuralSearchProfile> list = new ArrayList<StructuralSearchProfile>();
+
+ for (StructuralSearchProfile profile : StructuralSearchProfile.EP_NAME.getExtensions()) {
+ if (profile instanceof StructuralSearchProfileBase) {
+ list.add(profile);
+ }
+ }
+ list.add(new XmlStructuralSearchProfile());
+ ourNewStyleProfiles = list.toArray(new StructuralSearchProfile[list.size()]);
+ }
+ return ourNewStyleProfiles;
+ }
+
+ private static StructuralSearchProfile[] getProfiles() {
+ return ourUseUniversalMatchingAlgorithm
+ ? getNewStyleProfiles()
+ : StructuralSearchProfile.EP_NAME.getExtensions();
+ }
+
+ public static FileType getDefaultFileType() {
+ if (ourDefaultFileType == null) {
+ for (StructuralSearchProfile profile : getProfiles()) {
+ ourDefaultFileType = profile.getDefaultFileType(ourDefaultFileType);
+ }
+ if (ourDefaultFileType == null) {
+ ourDefaultFileType = StdFileTypes.XML;
+ }
+ }
+ assert isValidFileType(ourDefaultFileType) : "file type not valid for structural search: " + ourDefaultFileType.getName();
+ return ourDefaultFileType;
+ }
+
+ @Nullable
+ public static StructuralSearchProfile getProfileByLanguage(@NotNull Language language) {
+
+ for (StructuralSearchProfile profile : getProfiles()) {
+ if (profile.isMyLanguage(language)) {
+ return profile;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ public static Tokenizer getTokenizerForLanguage(@NotNull Language language) {
+ return LanguageTokenizer.INSTANCE.forLanguage(language);
+ }
+
+ public static boolean isTypedVariable(@NotNull final String name) {
+ return name.charAt(0)=='$' && name.charAt(name.length()-1)=='$';
+ }
+
+ @Nullable
+ public static StructuralSearchProfile getProfileByFileType(FileType fileType) {
+
+ for (StructuralSearchProfile profile : getProfiles()) {
+ if (profile.canProcess(fileType)) {
+ return profile;
+ }
+ }
+
+ return null;
+ }
+
+ @NotNull
+ public static FileType[] getSuitableFileTypes() {
+ Set<FileType> allFileTypes = new HashSet<FileType>();
+ Collections.addAll(allFileTypes, FileTypeManager.getInstance().getRegisteredFileTypes());
+ for (Language language : Language.getRegisteredLanguages()) {
+ FileType fileType = language.getAssociatedFileType();
+ if (fileType != null) {
+ allFileTypes.add(fileType);
+ }
+ }
+
+ List<FileType> result = new ArrayList<FileType>();
+ for (FileType fileType : allFileTypes) {
+ if (isValidFileType(fileType)) {
+ result.add(fileType);
+ }
+ }
+
+ return result.toArray(new FileType[result.size()]);
+ }
+
+ private static boolean isValidFileType(FileType fileType) {
+ return fileType != StdFileTypes.GUI_DESIGNER_FORM &&
+ fileType != StdFileTypes.IDEA_MODULE &&
+ fileType != StdFileTypes.IDEA_PROJECT &&
+ fileType != StdFileTypes.IDEA_WORKSPACE &&
+ fileType != FileTypes.ARCHIVE &&
+ fileType != FileTypes.UNKNOWN &&
+ fileType != FileTypes.PLAIN_TEXT &&
+ !(fileType instanceof AbstractFileType) &&
+ !fileType.isBinary() &&
+ !fileType.isReadOnly();
+ }
+
+ public static String shieldSpecialChars(String word) {
+ final StringBuilder buf = new StringBuilder(word.length());
+
+ for (int i = 0; i < word.length(); ++i) {
+ if (MatchUtils.SPECIAL_CHARS.indexOf(word.charAt(i)) != -1) {
+ buf.append("\\");
+ }
+ buf.append(word.charAt(i));
+ }
+
+ return buf.toString();
+ }
+
+ public static List<Configuration> getPredefinedTemplates() {
+ if (ourPredefinedConfigurations == null) {
+ final List<Configuration> result = new ArrayList<Configuration>();
+ for (StructuralSearchProfile profile : getProfiles()) {
+ Collections.addAll(result, profile.getPredefinedTemplates());
+ }
+ Collections.sort(result);
+ ourPredefinedConfigurations = Collections.unmodifiableList(result);
+ }
+ return ourPredefinedConfigurations;
+ }
+
+ public static boolean isDocCommentOwner(PsiElement match) {
+ final StructuralSearchProfile profile = getProfileByPsiElement(match);
+ return profile != null && profile.isDocCommentOwner(match);
+ }
+}