diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java index ce080e06325f..3dc1bfa4dd54 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java @@ -2,17 +2,13 @@ package com.intellij.codeInsight.daemon; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.codeInsight.hint.ImplementationViewComponent; -import com.intellij.idea.Bombed; import com.intellij.psi.PsiElement; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; -import java.util.Calendar; - /** * User: anna */ public class ImplementationsViewTest extends LightCodeInsightFixtureTestCase { - @Bombed(day = 25, month = Calendar.MAY, user = "peter") public void testFromCompletion() { myFixture.configureByText("a.java", "public class Foo {\n" + " private final String text;\n" + @@ -43,9 +39,10 @@ public class ImplementationsViewTest extends LightCodeInsightFixtureTestCase { assert element != null; final String newText = ImplementationViewComponent.getNewText(element); - assertEquals(" public String toString() {\n" + + assertEquals(" @Override\n" + + " public String toString() {\n" + " return \"text\";\n" + - " }\n", newText); + " }", newText); } public void testFromEditor() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtilBase.java b/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtilBase.java index 22fa5c5310b6..b3f2ba2aa2d9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtilBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtilBase.java @@ -20,11 +20,11 @@ */ package com.intellij.codeInsight; +import com.intellij.codeInsight.completion.CompletionUtil; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupManager; -import com.intellij.codeInsight.lookup.LookupValueWithPsiElement; import com.intellij.ide.util.EditSourceUtil; import com.intellij.lang.Language; import com.intellij.lang.LanguageExtension; @@ -146,8 +146,12 @@ public class TargetElementUtilBase { Lookup activeLookup = LookupManager.getInstance(project).getActiveLookup(); if (activeLookup != null && (flags & LOOKUP_ITEM_ACCEPTED) != 0) { - final PsiElement lookupItem = getLookupItem(activeLookup); - return lookupItem != null && lookupItem.isValid() ? lookupItem : null; + LookupElement item = activeLookup.getCurrentItem(); + final PsiElement psi = item == null ? null : CompletionUtil.getTargetElement(item); + if (psi != null && !psi.isValid()) { + throw new AssertionError("Invalid element in lookup: item=" + item); + } + return psi; } Document document = editor.getDocument(); @@ -246,33 +250,6 @@ public class TargetElementUtilBase { return null; } - @Nullable - private static PsiElement getLookupItem(Lookup activeLookup) { - LookupElement item = activeLookup.getCurrentItem(); - if (item == null) return null; - Object o = item.getObject(); - - if (o instanceof PsiElement) { - PsiElement element = (PsiElement)o; - if (!(element instanceof PsiDirectoryContainer)) { - if (!isValidElement(element)) return null; - } - return element; - } - else if (o instanceof LookupValueWithPsiElement) { - final PsiElement element = ((LookupValueWithPsiElement)o).getElement(); - if (element != null && isValidElement(element)) return element; - } - return null; - } - - private static boolean isValidElement(@NotNull PsiElement element) { - if (!element.isValid()) return false; - PsiFile file = element.getContainingFile(); - if (file == null) return false; - return file.getOriginalFile().getVirtualFile() != null; - } - @Nullable protected PsiElement getReferenceOrReferencedElement(PsiFile file, Editor editor, int flags, int offset) { PsiReference ref = findReference(editor, offset); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java index c6b84da9655a..6fb42e114651 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; +import com.intellij.codeInsight.lookup.LookupValueWithPsiElement; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -228,6 +229,11 @@ public class CompletionUtil { return getOriginalElement((PsiElement)object); } + if (object instanceof LookupValueWithPsiElement) { + final PsiElement element = ((LookupValueWithPsiElement)object).getElement(); + if (element != null) return getOriginalElement(element); + } + return null; }