intellilang: pattern-based injection & new settings UI
[fedora-idea.git] / plugins / IntelliLang / src / org / intellij / plugins / intelliLang / inject / InjectedLanguage.java
blobf6dadded8d69e208bac929fa880a3cba0282b8c9
1 /*
2 * Copyright 2006 Sascha Weinreuter
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.intellij.plugins.intelliLang.inject;
18 import com.intellij.lang.*;
19 import com.intellij.psi.templateLanguages.TemplateLanguage;
20 import com.intellij.openapi.fileTypes.FileTypes;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
24 import java.util.*;
26 public final class InjectedLanguage {
27 private static Map<String, Language> ourLanguageCache;
28 private static int ourLanguageCount;
30 private final String myID;
31 private final String myPrefix;
32 private final String mySuffix;
33 private final boolean myDynamic;
35 private InjectedLanguage(@NotNull String id, @NotNull String prefix, @NotNull String suffix, boolean dynamic) {
36 myID = id;
37 myPrefix = prefix;
38 mySuffix = suffix;
39 myDynamic = dynamic;
42 @NotNull
43 public String getID() {
44 return myID;
47 @Nullable
48 public Language getLanguage() {
49 return findLanguageById(myID);
52 @NotNull
53 public String getPrefix() {
54 return myPrefix;
57 @NotNull
58 public String getSuffix() {
59 return mySuffix;
62 /**
63 * Returns whether prefix/suffix were computed dynamically
65 public boolean isDynamic() {
66 return myDynamic;
69 @Nullable
70 public static Language findLanguageById(@Nullable String langID) {
71 if (langID == null || langID.length() == 0) {
72 return null;
74 synchronized (InjectedLanguage.class) {
75 if (ourLanguageCache == null || ourLanguageCount != Language.getRegisteredLanguages().size()) {
76 initLanguageCache();
78 return ourLanguageCache.get(langID);
82 @NotNull
83 public static String[] getAvailableLanguageIDs() {
84 synchronized (InjectedLanguage.class) {
85 if (ourLanguageCache == null || ourLanguageCount != Language.getRegisteredLanguages().size()) {
86 initLanguageCache();
88 final Set<String> keys = ourLanguageCache.keySet();
89 return keys.toArray(new String[keys.size()]);
93 private static void initLanguageCache() {
94 ourLanguageCache = new HashMap<String, Language>();
96 Collection<Language> registeredLanguages;
97 do {
98 registeredLanguages = new ArrayList<Language>(Language.getRegisteredLanguages());
99 for (Language language : registeredLanguages) {
100 if (isInjectableLanguage(language)) {
101 ourLanguageCache.put(language.getID(), language);
104 } while (Language.getRegisteredLanguages().size() != registeredLanguages.size());
106 ourLanguageCount = registeredLanguages.size();
109 private static boolean isInjectableLanguage(Language language) {
110 if (language == Language.ANY || language == FileTypes.PLAIN_TEXT.getLanguage()) {
111 return false;
113 if (language.getID().startsWith("$")) {
114 return false;
116 if (language instanceof InjectableLanguage) {
117 return true;
119 if (language instanceof TemplateLanguage || language instanceof DependentLanguage) {
120 return false;
122 if (LanguageParserDefinitions.INSTANCE.forLanguage(language) == null) {
123 return false;
125 return true;
128 public boolean equals(Object o) {
129 if (this == o) return true;
130 if (o == null || getClass() != o.getClass()) return false;
132 final InjectedLanguage that = (InjectedLanguage)o;
134 return !(myID != null ? !myID.equals(that.myID) : that.myID != null);
137 public int hashCode() {
138 return (myID != null ? myID.hashCode() : 0);
141 @Nullable
142 public static InjectedLanguage create(String id) {
143 return create(id, "", "", false);
146 @Nullable
147 public static InjectedLanguage create(@Nullable String id, String prefix, String suffix, boolean isDynamic) {
148 return id == null ? null : new InjectedLanguage(id, prefix == null ? "" : prefix, suffix == null ? "" : suffix, isDynamic);