IDEA-97264 IntelliLang support for "Path to File" language

This commit is contained in:
Dmitry Avdeev
2013-08-05 15:28:22 +04:00
parent 0269c2773d
commit 0185c3388d
6 changed files with 35 additions and 16 deletions
@@ -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());
}
}
@@ -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);
@@ -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();
}
}
@@ -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));
@@ -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);
}
}
@@ -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() :