Added navigation to class object members.
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user