Added navigation to class object members.

This commit is contained in:
Evgeny Gerashchenko
2012-03-28 14:18:42 +04:00
parent d0751b5c11
commit eacb89171e
3 changed files with 24 additions and 7 deletions
@@ -28,6 +28,7 @@ import com.intellij.psi.impl.cache.CacheManager;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.GlobalSearchScopes;
import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.search.UsageSearchContext;
import com.intellij.psi.util.PsiTreeUtil;
import jet.Tuple2; import jet.Tuple2;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -38,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.resolve.DescriptorRenderer; import org.jetbrains.jet.resolve.DescriptorRenderer;
import org.jetbrains.jet.util.slicedmap.WritableSlice; import org.jetbrains.jet.util.slicedmap.WritableSlice;
@@ -169,15 +171,28 @@ public class JetSourceNavigationHelper {
} }
else if (declarationContainer instanceof JetClassBody) { else if (declarationContainer instanceof JetClassBody) {
JetClassOrObject parent = (JetClassOrObject)declarationContainer.getParent(); JetClassOrObject parent = (JetClassOrObject)declarationContainer.getParent();
if (parent instanceof JetObjectDeclaration) { boolean isClassObject = parent instanceof JetObjectDeclaration;
return null; // TODO JetClass jetClass =
isClassObject ? PsiTreeUtil.getParentOfType(parent, JetClass.class) : (JetClass)parent;
if (jetClass == null) {
return null;
} }
Tuple2<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor((JetClass)parent); Tuple2<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(jetClass);
if (bindingContextAndClassDescriptor != null) { if (bindingContextAndClassDescriptor != null) {
BindingContext bindingContext = bindingContextAndClassDescriptor._1; BindingContext bindingContext = bindingContextAndClassDescriptor._1;
ClassDescriptor classDescriptor = bindingContextAndClassDescriptor._2; ClassDescriptor classDescriptor = bindingContextAndClassDescriptor._2;
for (Descr candidate : matcher.getCandidatesFromScope(classDescriptor.getDefaultType().getMemberScope(), entityName)) { JetScope memberScope = classDescriptor.getDefaultType().getMemberScope();
if (candidate.getContainingDeclaration() == classDescriptor) { if (isClassObject) {
JetType classObjectType = classDescriptor.getClassObjectType();
if (classObjectType == null) {
return null;
}
memberScope = classObjectType.getMemberScope();
}
ClassDescriptor expectedContainer = isClassObject ? classDescriptor.getClassObjectDescriptor() : classDescriptor;
for (Descr candidate : matcher.getCandidatesFromScope(memberScope, entityName)) {
if (candidate.getContainingDeclaration() == expectedContainer) {
JetDeclaration property = (JetDeclaration) bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, candidate); JetDeclaration property = (JetDeclaration) bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, candidate);
if (property != null) { if (property != null) {
return property; return property;
@@ -9,9 +9,9 @@ class SimpleClass {
class SimpleTraitImpl : SimpleTrait { class SimpleTraitImpl : SimpleTrait {
} }
class WithInnerAndObject { class <15>WithInnerAndObject {
class object { class object {
fun foo() { fun <16>foo() {
} }
} }
@@ -19,4 +19,6 @@ fun main(args : Array<String>) : Unit {
func(5, "5") func(5, "5")
func(5, 5) func(5, 5)
func() func()
WithInnerAndObject.foo()
} }