diff --git a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java index 9673c8a2ac9..3ff0a32375e 100644 --- a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java +++ b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java @@ -141,8 +141,7 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i elementText = ((JetFile) element).getName(); } else if (element instanceof JetNamedDeclaration) { - BindingContext bindingContext = - AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext(); + BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) element); DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element); if (descriptor == null) return null; diff --git a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCalleeMethodsTreeStructure.java b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCalleeMethodsTreeStructure.java index 615c352d08f..43af8124691 100644 --- a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCalleeMethodsTreeStructure.java +++ b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCalleeMethodsTreeStructure.java @@ -25,7 +25,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.jetAsJava.KotlinLightMethod; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; @@ -46,49 +45,51 @@ public class KotlinCalleeMethodsTreeStructure extends KotlinCallTreeStructure { this.javaTreeStructure = new CalleeMethodsTreeStructure(project, representativePsiMethod, scopeType); } - private static List getCalleeElements(@NotNull JetElement rootElement, BindingContext bindingContext) { - final ArrayList result = new ArrayList(); - JetVisitorVoid visitor = new CalleeReferenceVisitorBase(bindingContext, false) { - @Override - protected void processDeclaration(JetReferenceExpression reference, PsiElement declaration) { - result.add(declaration); - } - }; - + private static List getCalleeElements(@NotNull JetElement rootElement) { + List elementsToAnalyze = new ArrayList(); if (rootElement instanceof JetNamedFunction) { - JetExpression body = ((JetNamedFunction) rootElement).getBodyExpression(); - if (body != null) { - body.accept(visitor); - } + elementsToAnalyze.add(((JetNamedFunction) rootElement).getBodyExpression()); } else if (rootElement instanceof JetProperty) { for (JetPropertyAccessor accessor : ((JetProperty) rootElement).getAccessors()) { JetExpression body = accessor.getBodyExpression(); if (body != null) { - body.accept(visitor); + elementsToAnalyze.add(body); } } } else { JetClassOrObject classOrObject = (JetClassOrObject) rootElement; for (JetDelegationSpecifier specifier : classOrObject.getDelegationSpecifiers()) { if (specifier instanceof JetCallElement) { - specifier.accept(visitor); + elementsToAnalyze.add(specifier); } } JetClassBody body = classOrObject.getBody(); if (body != null) { for (JetClassInitializer initializer : body.getAnonymousInitializers()) { - initializer.getBody().accept(visitor); + elementsToAnalyze.add(initializer.getBody()); } for (JetProperty property : body.getProperties()) { JetExpression initializer = property.getInitializer(); if (initializer != null) { - initializer.accept(visitor); + elementsToAnalyze.add(initializer); } } } } + final ArrayList result = new ArrayList(); + for (JetElement element : elementsToAnalyze) { + element.accept( + new CalleeReferenceVisitorBase(AnalyzerFacadeWithCache.getContextForElement(element), false) { + @Override + protected void processDeclaration(JetReferenceExpression reference, PsiElement declaration) { + result.add(declaration); + } + } + ); + } + return result; } @@ -125,9 +126,7 @@ public class KotlinCalleeMethodsTreeStructure extends KotlinCallTreeStructure { } private Object[] buildChildrenByKotlinTarget(HierarchyNodeDescriptor descriptor, JetElement targetElement) { - BindingContext bindingContext = - AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) targetElement.getContainingFile()).getBindingContext(); - List calleeDescriptors = getCalleeElements((JetElement) targetElement, bindingContext); + List calleeDescriptors = getCalleeElements(targetElement); return collectNodeDescriptors(descriptor, calleeDescriptors, representativePsiClass); } } diff --git a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallerMethodsTreeStructure.java b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallerMethodsTreeStructure.java index 2ad7f23aa61..d21e5972079 100644 --- a/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallerMethodsTreeStructure.java +++ b/idea/src/org/jetbrains/jet/plugin/hierarchy/calls/KotlinCallerMethodsTreeStructure.java @@ -61,9 +61,10 @@ public abstract class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStr @Override protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descriptor) { final PsiElement element = getTargetElement(descriptor); + assert element instanceof JetElement : + "JetElement must be passed by KotlinCallerMethodsTreeStructure.newInstance(): " + element.getText(); - BindingContext bindingContext = - AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext(); + BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) element); final ArrayList result = new ArrayList(); codeBlockForLocalDeclaration.accept(new CalleeReferenceVisitorBase(bindingContext, true) {