diff --git a/java/java-impl/src/com/intellij/lang/java/JavaUsageToPsiElementProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaUsageToPsiElementProvider.java new file mode 100644 index 000000000000..d25a4ff6d8c7 --- /dev/null +++ b/java/java-impl/src/com/intellij/lang/java/JavaUsageToPsiElementProvider.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.java; + +import com.intellij.lang.Language; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.impl.source.tree.java.ImportStatementElement; +import com.intellij.usages.UsageToPsiElementProvider; + +/** + * @author Konstantin Bulenkov + */ +public class JavaUsageToPsiElementProvider extends UsageToPsiElementProvider { + private final static Language JAVA = Language.findLanguageByID("JAVA"); + private final static int MAX_HOPES = 17; + + @Override + public PsiElement getAppropriateParentFrom(PsiElement element) { + if (element.getLanguage() == JAVA) { + int hopes = 0; + while (hopes++ < MAX_HOPES && element != null) { + if (element instanceof PsiField || + element instanceof PsiMethod || + element instanceof ImportStatementElement || + element instanceof PsiClass + ) return element; + + element = element.getParent(); + } + } + return null; + } +} diff --git a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java index 884b6c418f9e..218d92add018 100644 --- a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java +++ b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -650,7 +650,8 @@ public class ShowUsagesAction extends AnAction { if (usage instanceof UsageInfo2UsageAdapter) { final PsiElement element = ((UsageInfo2UsageAdapter)usage).getElement(); if (element != null) { - return element.getContainingFile(); + final PsiElement view = UsageToPsiElementProvider.findAppropriateParentFrom(element); + return view == null ? element : view; } } } diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index d9f351b8a5c1..94851d8fc99a 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -145,6 +145,7 @@ + EP_NAME = new ExtensionPointName("com.intellij.usageToPsiElementProvider"); + + @Nullable + public abstract PsiElement getAppropriateParentFrom(PsiElement element); + + @Nullable + public static PsiElement findAppropriateParentFrom(@NotNull PsiElement element) { + for (UsageToPsiElementProvider provider : EP_NAME.getExtensions()) { + final PsiElement parent = provider.getAppropriateParentFrom(element); + if (parent != null) { + return parent; + } + } + return null; + } +} diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 3114b28d7b71..6735fb6e0ff7 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -642,6 +642,7 @@ +