Added ClsCustomNavigationPolicy.

This commit is contained in:
Evgeny Gerashchenko
2012-03-13 17:09:07 +04:00
parent 4f9a41d964
commit 2b2ef7e782
5 changed files with 66 additions and 1 deletions
@@ -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<PsiClassStub<?>> 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;
}
@@ -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<ClsCustomNavigationPolicy> 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);
}
@@ -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<PsiFieldStub> 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;
@@ -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<PsiMethodStub> 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;
}
@@ -529,7 +529,10 @@
<extensionPoint name="psi.treeChangePreprocessor"
interface="com.intellij.psi.impl.PsiTreeChangePreprocessor"
area="IDEA_PROJECT"/>
<extensionPoint name="psi.clsCustomNavigationPolicy"
interface="com.intellij.psi.impl.compiled.ClsCustomNavigationPolicy" />
<extensionPoint name="codeBlockProvider"
beanClass="com.intellij.lang.LanguageExtensionPoint"/>