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
;
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
) {
43 public String
getID() {
48 public Language
getLanguage() {
49 return findLanguageById(myID
);
53 public String
getPrefix() {
58 public String
getSuffix() {
63 * Returns whether prefix/suffix were computed dynamically
65 public boolean isDynamic() {
70 public static Language
findLanguageById(@Nullable String langID
) {
71 if (langID
== null || langID
.length() == 0) {
74 synchronized (InjectedLanguage
.class) {
75 if (ourLanguageCache
== null || ourLanguageCount
!= Language
.getRegisteredLanguages().size()) {
78 return ourLanguageCache
.get(langID
);
83 public static String
[] getAvailableLanguageIDs() {
84 synchronized (InjectedLanguage
.class) {
85 if (ourLanguageCache
== null || ourLanguageCount
!= Language
.getRegisteredLanguages().size()) {
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
;
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()) {
113 if (language
.getID().startsWith("$")) {
116 if (language
instanceof InjectableLanguage
) {
119 if (language
instanceof TemplateLanguage
|| language
instanceof DependentLanguage
) {
122 if (LanguageParserDefinitions
.INSTANCE
.forLanguage(language
) == null) {
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);
142 public static InjectedLanguage
create(String id
) {
143 return create(id
, "", "", false);
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
);