From 903c87d8322a21b15d1378dda031cda08a68b366 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sat, 4 Aug 2012 00:03:31 +0400 Subject: [PATCH] Added navigation to Kotlin alternative signature if it is not external. --- .../KotlinSignatureInJavaMarkerProvider.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinSignatureInJavaMarkerProvider.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinSignatureInJavaMarkerProvider.java index b28090417cd..5008465e025 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinSignatureInJavaMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinSignatureInJavaMarkerProvider.java @@ -20,6 +20,10 @@ 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.navigation.NavigationUtil; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; @@ -52,7 +56,34 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider { }; private static final GutterIconNavigationHandler NAVIGATION_HANDLER = new GutterIconNavigationHandler() { @Override - public void navigate(MouseEvent e, PsiMethod elt) { + public void navigate(MouseEvent e, PsiMethod element) { + if (e.getClickCount() != 1 || e.getButton() != MouseEvent.BUTTON1) return; + + PsiAnnotation annotation = findKotlinSignatureAnnotation(element); + assert annotation != null; + if (annotation.getContainingFile() == element.getContainingFile()) { + // not external, go to + for (PsiNameValuePair pair : annotation.getParameterList().getAttributes()) { + if (pair.getName() == null || "value".equals(pair.getName())) { + PsiAnnotationMemberValue value = pair.getValue(); + if (value != null) { + PsiElement firstChild = value.getFirstChild(); + VirtualFile virtualFile = value.getContainingFile().getVirtualFile(); + if (firstChild != null && firstChild.getNode().getElementType() == JavaTokenType.STRING_LITERAL + && virtualFile != null) { + new OpenFileDescriptor(value.getProject(), virtualFile, value.getTextOffset() + 1).navigate(true); + } + else { + NavigationUtil.activateFileWithPsiElement(value); + } + } + } + } + } + else { + // TODO open external annotations editor + Messages.showInfoMessage(element.getProject(), "Can't edit external annotation yet", "External Annotation"); + } } };