mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-17 07:20:53 +07:00
Support for temporary and configuration-based IntelliLang injections in Python (PY-10983, PY-10721)
This commit is contained in:
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user