Refactor JetLineMarkerProvider

This commit is contained in:
Natalia.Ukhorskaya
2013-04-09 11:35:40 +04:00
parent 1e86fe1a56
commit e383a41452
@@ -21,6 +21,7 @@ import com.intellij.codeHighlighting.Pass;
import com.intellij.codeInsight.daemon.GutterIconNavigationHandler;
import com.intellij.codeInsight.daemon.LineMarkerInfo;
import com.intellij.codeInsight.daemon.LineMarkerProvider;
import com.intellij.codeInsight.daemon.impl.LineMarkerNavigator;
import com.intellij.codeInsight.daemon.impl.MarkerType;
import com.intellij.codeInsight.hint.HintUtil;
import com.intellij.codeInsight.navigation.NavigationUtil;
@@ -34,8 +35,10 @@ import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.Function;
import com.intellij.util.NullableFunction;
import com.intellij.util.PsiNavigateUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.asJava.LightClassUtil;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
@@ -65,38 +68,51 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
private static final Function<PsiElement, String> SUBCLASSED_CLASS_TOOLTIP_ADAPTER = new Function<PsiElement, String>() {
@Override
public String fun(PsiElement element) {
PsiElement child = getPsiClassFirstChild(element);
// Java puts its marker on a child of the PsiClass, so we must find a child of our own class too
return child != null ? MarkerType.SUBCLASSED_CLASS.getTooltip().fun(child) : null;
public String fun(@NotNull PsiElement element) {
PsiClass psiClass = getPsiClass(element);
return psiClass != null ? SUBCLASSED_CLASS.getTooltip().fun(psiClass) : null;
}
};
private static PsiElement getPsiClassFirstChild(PsiElement element) {
private static final GutterIconNavigationHandler<PsiElement> SUBCLASSED_CLASS_NAVIGATION_HANDLER = new GutterIconNavigationHandler<PsiElement>() {
@Override
public void navigate(@Nullable MouseEvent e, @Nullable PsiElement elt) {
if (elt == null) return;
PsiElement psiClass = getPsiClass(elt);
if (psiClass != null) {
SUBCLASSED_CLASS.getNavigationHandler().navigate(e, psiClass);
}
}
};
private static final MarkerType SUBCLASSED_CLASS = new MarkerType(
new NullableFunction<PsiElement, String>() {
@Override
public String fun(@Nullable PsiElement element) {
if (!(element instanceof PsiClass)) return null;
return MarkerType.getSubclassedClassTooltip((PsiClass) element);
}
},
new LineMarkerNavigator() {
@Override
public void browse(@Nullable MouseEvent e, @Nullable PsiElement element) {
if (!(element instanceof PsiClass)) return;
MarkerType.navigateToSubclassedClass(e, (PsiClass) element);
}
}
);
@Nullable
private static PsiClass getPsiClass(@NotNull PsiElement element) {
if (!(element instanceof JetClass)) {
element = element.getParent();
if (!(element instanceof JetClass)) {
return null;
}
}
PsiClass lightClass = LightClassUtil.getPsiClass((JetClass) element);
if (lightClass == null) {
return null;
}
PsiElement[] children = lightClass.getChildren();
return children.length > 0 ? children[0] : null;
return LightClassUtil.getPsiClass((JetClass) element);
}
private static final GutterIconNavigationHandler<PsiElement> SUBCLASSED_CLASS_NAVIGATION_HANDLER = new GutterIconNavigationHandler<PsiElement>() {
@Override
public void navigate(MouseEvent e, PsiElement elt) {
PsiElement child = getPsiClassFirstChild(elt);
if (child != null) {
MarkerType.SUBCLASSED_CLASS.getNavigationHandler().navigate(e, child);
}
}
};
@Override
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {