From 2b2ef7e7824f9addda5339f82e43d1831791d22e Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 2 Mar 2012 20:49:02 +0400 Subject: [PATCH] Added ClsCustomNavigationPolicy. --- .../psi/impl/compiled/ClsClassImpl.java | 8 ++++ .../compiled/ClsCustomNavigationPolicy.java | 38 +++++++++++++++++++ .../psi/impl/compiled/ClsFieldImpl.java | 8 ++++ .../psi/impl/compiled/ClsMethodImpl.java | 8 ++++ .../src/META-INF/LangExtensionPoints.xml | 5 ++- 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsCustomNavigationPolicy.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java index 77473f7ffcf3..e65932502fce 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.compiled; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; @@ -576,6 +577,13 @@ public class ClsClassImpl extends ClsRepositoryPsiElement> imple @Override @NotNull public PsiElement getNavigationElement() { + for (ClsCustomNavigationPolicy customNavigationPolicy : Extensions.getExtensions(ClsCustomNavigationPolicy.EP_NAME)) { + PsiElement navigationElement = customNavigationPolicy.getNavigationElement(this); + if (navigationElement != null) { + return navigationElement; + } + } + PsiClass aClass = getSourceMirrorClass(); return aClass != null && aClass != this ? aClass.getNavigationElement() : this; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsCustomNavigationPolicy.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsCustomNavigationPolicy.java new file mode 100644 index 000000000000..6b61c54e136e --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsCustomNavigationPolicy.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2012 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.psi.impl.compiled; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Evgeny Gerashchenko + * @since 3/2/12 + */ +public interface ClsCustomNavigationPolicy { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.psi.clsCustomNavigationPolicy"); + + @Nullable + PsiElement getNavigationElement(@NotNull ClsClassImpl clsClass); + + @Nullable + PsiElement getNavigationElement(@NotNull ClsMethodImpl clsMethod); + + @Nullable + PsiElement getNavigationElement(@NotNull ClsFieldImpl clsField); +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFieldImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFieldImpl.java index 1b1c64fc70af..a472439236a3 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFieldImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFieldImpl.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.compiled; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; import com.intellij.psi.impl.*; @@ -247,6 +248,13 @@ public class ClsFieldImpl extends ClsRepositoryPsiElement implemen @Override @NotNull public PsiElement getNavigationElement() { + for (ClsCustomNavigationPolicy customNavigationPolicy : Extensions.getExtensions(ClsCustomNavigationPolicy.EP_NAME)) { + PsiElement navigationElement = customNavigationPolicy.getNavigationElement(this); + if (navigationElement != null) { + return navigationElement; + } + } + PsiClass sourceClassMirror = ((ClsClassImpl)getParent()).getSourceMirrorClass(); PsiElement sourceFieldMirror = sourceClassMirror != null ? sourceClassMirror.findFieldByName(getName(), false) : null; return sourceFieldMirror != null && sourceFieldMirror != this ? sourceFieldMirror.getNavigationElement() : this; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsMethodImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsMethodImpl.java index e16222d6a7b0..0f0053e9ea25 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsMethodImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsMethodImpl.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.compiled; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.ElementPresentationUtil; @@ -379,6 +380,13 @@ public class ClsMethodImpl extends ClsRepositoryPsiElement implem @Override @NotNull public PsiElement getNavigationElement() { + for (ClsCustomNavigationPolicy customNavigationPolicy : Extensions.getExtensions(ClsCustomNavigationPolicy.EP_NAME)) { + PsiElement navigationElement = customNavigationPolicy.getNavigationElement(this); + if (navigationElement != null) { + return navigationElement; + } + } + final PsiMethod method = getSourceMirrorMethod(); return method != this ? method.getNavigationElement() : this; } diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index fb47a265da5e..04707cc5ddfa 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -529,7 +529,10 @@ - + + +