Added navigation to source for class properties.

This commit is contained in:
Evgeny Gerashchenko
2012-03-14 17:05:02 +04:00
parent 2b52caf1fe
commit a86c3a5fa3
2 changed files with 42 additions and 5 deletions
@@ -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
@@ -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;
}
}