diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java index f1d35ee8195..a36799df39f 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.JetFunction; import org.jetbrains.jet.lang.psi.JetProperty; /** @@ -53,6 +54,12 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy { return sourceProperty; } } + else if (jetDeclaration instanceof JetFunction) { + JetDeclaration sourceFunction = JetSourceNavigationHelper.getSourceFunction((JetFunction) jetDeclaration); + if (sourceFunction != null) { + return sourceFunction; + } + } return jetDeclaration; } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index e0a9446211c..209f58f19a3 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -200,6 +200,22 @@ public class JetSourceNavigationHelper { }); } + @Nullable + public static JetDeclaration getSourceFunction(final @NotNull JetFunction decompiledFunction) { + return getSourcePropertyOrFunction(decompiledFunction, decompiledFunction.getReceiverTypeRef(), new Matcher() { + @Override + public boolean areSame(JetFunction declaration, FunctionDescriptor descriptor) { + // TODO check parameters + return true; + } + + @Override + public Set getCandidatesFromScope(JetScope scope, String name) { + return scope.getFunctions(name); + } + }); + } + private interface Matcher { boolean areSame(Decl declaration, Descr descriptor);