From a86c3a5fa3c5bc09382257b45f2246fced85d8c0 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 14 Mar 2012 17:05:02 +0400 Subject: [PATCH] Added navigation to source for class properties. --- .../libraries/JetClsNavigationPolicy.java | 10 ++++- .../libraries/JetSourceNavigationHelper.java | 37 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java index 5ecf6b4cb93..8c477ed95d4 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.jet.lang.psi.JetProperty; /** * @author Evgeny Gerashchenko @@ -45,7 +46,14 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy { @Override @Nullable public PsiElement getNavigationElement(@NotNull ClsMethodImpl clsMethod) { - return getJetDeclarationByClsElement(clsMethod); + JetDeclaration jetDeclaration = getJetDeclarationByClsElement(clsMethod); + if (jetDeclaration instanceof JetProperty) { + JetProperty sourceProperty = JetSourceNavigationHelper.getSourceProperty((JetProperty) jetDeclaration); + if (sourceProperty != null) { + return sourceProperty; + } + } + return jetDeclaration; } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index fa7050629ef..c20cb129cfe 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -25,13 +25,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.Processor; +import jet.Tuple0; +import jet.Tuple1; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetPsiUtil; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.plugin.JetFileType; @@ -48,7 +49,7 @@ public class JetSourceNavigationHelper { } @Nullable - public static JetClass getSourceClass(final JetClass decompiledClass) { + public static JetClass getSourceClass(final @NotNull JetClass decompiledClass) { VirtualFile decompiledFile = decompiledClass.getContainingFile().getVirtualFile(); if (decompiledFile == null) { return null; @@ -84,4 +85,32 @@ public class JetSourceNavigationHelper { } return null; } + + @Nullable + public static JetProperty getSourceProperty(final @NotNull JetProperty decompiledProperty) { + String propertyName = decompiledProperty.getName(); + if (propertyName == null) { + return null; + } + + PsiElement propertyContainer = decompiledProperty.getParent(); + if (propertyContainer instanceof JetFile) { + // TODO global property + return null; + } else if (propertyContainer instanceof JetClassBody) { + JetClass sourceClass = getSourceClass((JetClass) propertyContainer.getParent()); + if (sourceClass != null) { + JetClassBody sourceClassBody = sourceClass.getBody(); + if (sourceClassBody != null) { + for (JetProperty p : sourceClassBody.getProperties()) { + if (propertyName.equals(p.getName())) { + return p; + } + } + + } + } + } + return null; + } }