mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-97264 IntelliLang support for "Path to File" language
This commit is contained in:
+15
-3
@@ -6,6 +6,7 @@ import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCa
|
||||
import org.intellij.plugins.intelliLang.inject.InjectLanguageAction;
|
||||
import org.intellij.plugins.intelliLang.inject.UnInjectLanguageAction;
|
||||
import org.intellij.plugins.intelliLang.references.FileReferenceInjector;
|
||||
import org.jdom.Element;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
@@ -38,9 +39,9 @@ public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestC
|
||||
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
|
||||
assertNotNull(myFixture.getReferenceAtCaretPosition());
|
||||
|
||||
//Configuration configuration = Configuration.getInstance();
|
||||
//Element element = configuration.getState();
|
||||
//configuration.loadState(element);
|
||||
Configuration configuration = Configuration.getInstance();
|
||||
Element element = configuration.getState();
|
||||
configuration.loadState(element);
|
||||
|
||||
((PsiModificationTrackerImpl)PsiManager.getInstance(getProject()).getModificationTracker()).incCounter();
|
||||
assertNotNull(myFixture.getReferenceAtCaretPosition());
|
||||
@@ -48,4 +49,15 @@ public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestC
|
||||
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
|
||||
assertNull(myFixture.getReferenceAtCaretPosition());
|
||||
}
|
||||
|
||||
public void testInjectIntoTagValue() throws Exception {
|
||||
myFixture.configureByText("foo.xml", "<foo xmlns=\"http://foo.bar\" <bar>x<caret>xx</bar>/>");
|
||||
assertNull(myFixture.getReferenceAtCaretPosition());
|
||||
|
||||
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
|
||||
assertNotNull(myFixture.getReferenceAtCaretPosition());
|
||||
|
||||
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
|
||||
assertNull(myFixture.getReferenceAtCaretPosition());
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -67,11 +67,7 @@ public abstract class LanguageInjectionSupport {
|
||||
|
||||
public final boolean addInjectionInPlace(final Injectable injectable, final PsiLanguageInjectionHost psiElement) {
|
||||
if (injectable.getLanguage() == null) {
|
||||
boolean result = addInjectionInPlace(injectable.getId(), psiElement);
|
||||
if (result) {
|
||||
psiElement.putUserData(INJECTOR_SUPPORT, this);
|
||||
}
|
||||
return result;
|
||||
return addInjectionInPlace(injectable.getId(), psiElement);
|
||||
}
|
||||
else {
|
||||
return addInjectionInPlace(injectable.getLanguage(), psiElement);
|
||||
@@ -80,6 +76,10 @@ public abstract class LanguageInjectionSupport {
|
||||
|
||||
public abstract boolean removeInjectionInPlace(final PsiLanguageInjectionHost psiElement);
|
||||
|
||||
public boolean removeInjection(final PsiElement psiElement) {
|
||||
return psiElement instanceof PsiLanguageInjectionHost && removeInjectionInPlace((PsiLanguageInjectionHost)psiElement);
|
||||
}
|
||||
|
||||
public abstract boolean editInjectionInPlace(final PsiLanguageInjectionHost psiElement);
|
||||
|
||||
public abstract BaseInjection createInjection(final Element element);
|
||||
|
||||
+2
-2
@@ -78,8 +78,8 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio
|
||||
if (reference != null) {
|
||||
PsiElement element = reference.getElement();
|
||||
LanguageInjectionSupport support = element.getUserData(LanguageInjectionSupport.INJECTOR_SUPPORT);
|
||||
if (support != null && element instanceof PsiLanguageInjectionHost) {
|
||||
support.removeInjectionInPlace((PsiLanguageInjectionHost)element);
|
||||
if (support != null) {
|
||||
support.removeInjection(element);
|
||||
((PsiModificationTrackerImpl)PsiManager.getInstance(project).getModificationTracker()).incCounter();
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -22,6 +22,8 @@ import com.intellij.psi.*;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import org.intellij.plugins.intelliLang.Configuration;
|
||||
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;
|
||||
@@ -56,6 +58,8 @@ public class InjectedReferencesContributor extends PsiReferenceContributor {
|
||||
for (BaseInjection injection : injections) {
|
||||
if (injection.acceptForReference(element)) {
|
||||
element.putUserData(INJECTED_REFERENCE, extension);
|
||||
LanguageInjectionSupport support = InjectorUtils.findInjectionSupport(injection.getSupportId());
|
||||
element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, support);
|
||||
List<TextRange> area = injection.getInjectedArea(element);
|
||||
for (TextRange range : area) {
|
||||
references = ArrayUtil.mergeArrays(references, extension.getReferences(element, context, range));
|
||||
|
||||
+3
-4
@@ -18,13 +18,13 @@ package org.intellij.plugins.intelliLang.inject.config;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.JDOMExternalizer;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.xml.XmlAttribute;
|
||||
import com.intellij.psi.xml.XmlAttributeValue;
|
||||
import com.intellij.psi.xml.XmlElement;
|
||||
import com.intellij.psi.xml.XmlTag;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.intellij.plugins.intelliLang.util.StringMatcher;
|
||||
import org.intellij.plugins.intelliLang.inject.LanguageInjectionSupport;
|
||||
import org.intellij.plugins.intelliLang.util.StringMatcher;
|
||||
import org.jaxen.JaxenException;
|
||||
import org.jaxen.XPath;
|
||||
import org.jdom.Element;
|
||||
@@ -223,13 +223,12 @@ public class AbstractTagInjection extends BaseInjection {
|
||||
myApplyToSubTagTexts = applyToSubTagTexts;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean acceptForReference(PsiElement element) {
|
||||
if (element instanceof XmlAttributeValue) {
|
||||
PsiElement parent = element.getParent();
|
||||
return parent instanceof XmlAttribute && acceptsPsiElement(parent);
|
||||
}
|
||||
return false;
|
||||
else return element instanceof XmlTag && acceptsPsiElement(element);
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -100,7 +100,11 @@ public class XmlLanguageInjectionSupport extends AbstractLanguageInjectionSuppor
|
||||
}
|
||||
|
||||
public boolean removeInjectionInPlace(final PsiLanguageInjectionHost host) {
|
||||
if (!isMine(host)) return false;
|
||||
return removeInjection(host);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeInjection(PsiElement host) {
|
||||
final Project project = host.getProject();
|
||||
final Configuration configuration = Configuration.getProjectInstance(project);
|
||||
final ArrayList<BaseInjection> injections = collectInjections(host, configuration);
|
||||
@@ -319,7 +323,7 @@ public class XmlLanguageInjectionSupport extends AbstractLanguageInjectionSuppor
|
||||
}
|
||||
}
|
||||
|
||||
private static ArrayList<BaseInjection> collectInjections(final PsiLanguageInjectionHost host,
|
||||
private static ArrayList<BaseInjection> collectInjections(final PsiElement host,
|
||||
final Configuration configuration) {
|
||||
final ArrayList<BaseInjection> result = new ArrayList<BaseInjection>();
|
||||
final PsiElement element = host instanceof XmlText? ((XmlText)host).getParentTag() :
|
||||
|
||||
Reference in New Issue
Block a user