diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java index 74d1350b3dc7..f6c790a362c9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java @@ -382,7 +382,8 @@ public class PsiLiteralExpressionImpl @Override @NotNull public PsiReference[] getReferences() { - return PsiReferenceService.getService().getContributedReferences(this); + PsiReference[] references = PsiReferenceService.getService().getContributedReferences(this); + return references; } @Override diff --git a/platform/util/src/com/intellij/util/ReflectionAssignabilityCache.java b/platform/util/src/com/intellij/util/ReflectionAssignabilityCache.java index e9e2cecc45e3..a5a1c68a7f14 100644 --- a/platform/util/src/com/intellij/util/ReflectionAssignabilityCache.java +++ b/platform/util/src/com/intellij/util/ReflectionAssignabilityCache.java @@ -19,6 +19,7 @@ import com.intellij.util.containers.ConcurrentFactoryMap; /** * @author peter + * @see ReflectionCache */ public class ReflectionAssignabilityCache { private final ConcurrentFactoryMap> myCache = new ConcurrentFactoryMap>() { 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 4b4489bb7d25..46bebc508add 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 @@ -66,6 +66,21 @@ public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestC assertNull(myFixture.getReferenceAtCaretPosition()); } + public void testInjectIntoJava() throws Exception { + myFixture.configureByText("Foo.java", "class Foo {\n" + + " String bar() {\n" + + " return \"bar.xml\";\n" + + " } \n" + + "}"); + 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()); + } + @Override protected void setUp() throws Exception { super.setUp(); diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java index 2f3735c5f1a5..ea12ada745ee 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java @@ -15,6 +15,7 @@ */ package org.intellij.plugins.intelliLang.inject; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.Language; @@ -116,6 +117,9 @@ public class InjectLanguageAction implements IntentionAction { if (injectable.getLanguage() != null) { // no need for reference injection FileContentUtil.reparseFiles(project, Collections.emptyList(), true); } + else { + DaemonCodeAnalyzer.getInstance(project).restart(); + } } } 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 a5456035b235..ccf74a248217 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java @@ -39,10 +39,10 @@ import java.util.List; */ public class InjectedReferencesContributor extends PsiReferenceContributor { - static final Key INJECTED_REFERENCE = Key.create("injected reference"); + static final Key INJECTED_REFERENCES = Key.create("injected references"); public static boolean isInjected(@Nullable PsiReference reference) { - return reference != null && reference.getElement().getUserData(INJECTED_REFERENCE) != null; + return reference != null && reference.getElement().getUserData(INJECTED_REFERENCES) != null; } @Override @@ -51,15 +51,15 @@ public class InjectedReferencesContributor extends PsiReferenceContributor { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { - element.putUserData(INJECTED_REFERENCE, null); ReferenceInjector[] extensions = ReferenceInjector.EXTENSION_POINT_NAME.getExtensions(); PsiReference[] references = new PsiReference[0]; Configuration configuration = Configuration.getProjectInstance(element.getProject()); + boolean injected = false; for (ReferenceInjector injector : extensions) { Collection injections = configuration.getInjectionsByLanguageId(injector.getId()); for (BaseInjection injection : injections) { if (injection.acceptForReference(element)) { - element.putUserData(INJECTED_REFERENCE, injector); + injected = true; LanguageInjectionSupport support = InjectorUtils.findInjectionSupport(injection.getSupportId()); element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, support); List area = injection.getInjectedArea(element); @@ -75,13 +75,14 @@ public class InjectedReferencesContributor extends PsiReferenceContributor { if (language != null) { ReferenceInjector injector = ReferenceInjector.findById(language.getID()); if (injector != null) { - element.putUserData(INJECTED_REFERENCE, injector); + injected = true; element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, registry.getLanguageInjectionSupport()); TextRange range = ElementManipulators.getValueTextRange(element); references = ArrayUtil.mergeArrays(references, injector.getReferences(element, context, range)); } } } + element.putUserData(INJECTED_REFERENCES, injected ? references : null); return references; } }); diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesInspection.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesInspection.java index 1ac3e11c2627..3d0920724c5e 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesInspection.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesInspection.java @@ -35,10 +35,10 @@ public class InjectedReferencesInspection extends LocalInspectionTool { @Override public void visitElement(PsiElement element) { - PsiReference[] references = element.getReferences(); - if (element.getUserData(InjectedReferencesContributor.INJECTED_REFERENCE) != null) { - for (PsiReference reference : references) { - if (reference.isSoft() && reference.resolve() == null) { + PsiReference[] injected = element.getUserData(InjectedReferencesContributor.INJECTED_REFERENCES); + if (injected != null) { + for (PsiReference reference : injected) { + if (reference.resolve() == null) { holder.registerProblem(reference); } }