From 0185c3388d68372bccbd48901d3cf112acb2a9d7 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 5 Aug 2013 15:27:47 +0400 Subject: [PATCH] IDEA-97264 IntelliLang support for "Path to File" language --- .../intelliLang/ReferenceInjectionTest.java | 18 +++++++++++++++--- .../inject/LanguageInjectionSupport.java | 10 +++++----- .../inject/UnInjectLanguageAction.java | 4 ++-- .../InjectedReferencesContributor.java | 4 ++++ .../inject/config/AbstractTagInjection.java | 7 +++---- .../xml/XmlLanguageInjectionSupport.java | 8 ++++++-- 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java index c8f088ae93f2..f3890bcc67d8 100644 --- a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java +++ b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java @@ -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", "xxx/>"); + 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()); + } } diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/LanguageInjectionSupport.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/LanguageInjectionSupport.java index ff7a87d75524..17b704b7521d 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/LanguageInjectionSupport.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/LanguageInjectionSupport.java @@ -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); diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java index 76b436e867c4..def24968e1c5 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java @@ -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(); } } diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java index 13a150a3d0c8..dfcc403378f1 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java @@ -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 area = injection.getInjectedArea(element); for (TextRange range : area) { references = ArrayUtil.mergeArrays(references, extension.getReferences(element, context, range)); diff --git a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/config/AbstractTagInjection.java b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/config/AbstractTagInjection.java index 9a3bfba5d172..71021f5eaa8a 100644 --- a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/config/AbstractTagInjection.java +++ b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/config/AbstractTagInjection.java @@ -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); } } diff --git a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjectionSupport.java b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjectionSupport.java index 00aac3daf7e2..094bcfd2a562 100644 --- a/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjectionSupport.java +++ b/plugins/IntelliLang/xml-support/org/intellij/plugins/intelliLang/inject/xml/XmlLanguageInjectionSupport.java @@ -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 injections = collectInjections(host, configuration); @@ -319,7 +323,7 @@ public class XmlLanguageInjectionSupport extends AbstractLanguageInjectionSuppor } } - private static ArrayList collectInjections(final PsiLanguageInjectionHost host, + private static ArrayList collectInjections(final PsiElement host, final Configuration configuration) { final ArrayList result = new ArrayList(); final PsiElement element = host instanceof XmlText? ((XmlText)host).getParentTag() :