Support for temporary and configuration-based IntelliLang injections in Python (PY-10983, PY-10721)

This commit is contained in:
Andrey Vlasovskikh
2013-11-22 20:55:02 +04:00
parent eeba354624
commit fd11bd29dd
7 changed files with 116 additions and 41 deletions

View File

@@ -7,5 +7,7 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<patterns.patternClass className="com.jetbrains.python.patterns.PythonPatterns" alias="py"/>
<multiHostInjector implementation="com.jetbrains.python.intelliLang.PyTemporaryInjector"/>
<multiHostInjector implementation="com.jetbrains.python.intelliLang.PyConfigurationInjector"/>
</extensions>
</idea-plugin>

View File

@@ -0,0 +1,33 @@
package com.jetbrains.python.intelliLang;
import com.intellij.lang.Language;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.codeInsight.PyInjectorBase;
import org.intellij.plugins.intelliLang.Configuration;
import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
import org.intellij.plugins.intelliLang.inject.InjectorUtils;
import org.intellij.plugins.intelliLang.inject.LanguageInjectionSupport;
import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author vlan
*/
public class PyConfigurationInjector extends PyInjectorBase {
@Nullable
@Override
public Language getInjectedLanguage(@NotNull PsiElement context) {
for (LanguageInjectionSupport support : InjectorUtils.getActiveInjectionSupports()) {
if (support instanceof PyLanguageInjectionSupport) {
final Configuration configuration = Configuration.getInstance();
for (BaseInjection injection : configuration.getInjections(support.getId())) {
if (injection.acceptsPsiElement(context)) {
return InjectedLanguage.findLanguageById(injection.getInjectedLanguageId());
}
}
}
}
return null;
}
}

View File

@@ -15,22 +15,14 @@
*/
package com.jetbrains.python.intelliLang;
import com.intellij.lang.Language;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.jetbrains.python.patterns.PythonPatterns;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyStringLiteralExpression;
import org.intellij.plugins.intelliLang.inject.AbstractLanguageInjectionSupport;
import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author yole
*/
@@ -54,33 +46,6 @@ public class PyLanguageInjectionSupport extends AbstractLanguageInjectionSupport
return host instanceof PyElement;
}
@Override
public boolean useDefaultInjector(PsiLanguageInjectionHost host) {
return true;
}
@Override
public BaseInjection createInjection(Element element) {
// This is how DefaultLanguageInjector gets its injection ranges
return new BaseInjection(getId()) {
@NotNull
@Override
public List<TextRange> getInjectedArea(PsiElement element) {
if (element instanceof PyStringLiteralExpression) {
return ((PyStringLiteralExpression)element).getStringValueTextRanges();
}
return super.getInjectedArea(element);
}
};
}
@Override
public boolean addInjectionInPlace(Language language, PsiLanguageInjectionHost psiElement) {
// XXX: Disable temporary injections via intention actions for Python elements, since TemporaryPlacesInjector cannot handle elements
// with multiple injection text ranges (PY-10691)
return true;
}
@Nullable
@Override
public String getHelpId() {

View File

@@ -0,0 +1,30 @@
package com.jetbrains.python.intelliLang;
import com.intellij.lang.Language;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.jetbrains.python.codeInsight.PyInjectorBase;
import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
import org.intellij.plugins.intelliLang.inject.TemporaryPlacesRegistry;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author vlan
*/
public class PyTemporaryInjector extends PyInjectorBase {
@Nullable
@Override
public Language getInjectedLanguage(@NotNull PsiElement context) {
final TemporaryPlacesRegistry registry = TemporaryPlacesRegistry.getInstance(context.getProject());
if (context instanceof PsiLanguageInjectionHost) {
final PsiFile file = context.getContainingFile();
final InjectedLanguage injectedLanguage = registry.getLanguageFor((PsiLanguageInjectionHost)context, file);
if (injectedLanguage != null) {
return injectedLanguage.getLanguage();
}
}
return null;
}
}