Call Hierarchy: Use lazy analysis

#KT-4492 Fixed
This commit is contained in:
Alexey Sedunov
2014-01-29 16:42:05 +04:00
parent 0ee950f428
commit a4d6fd9cd5
3 changed files with 24 additions and 25 deletions
@@ -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;
@@ -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<? extends PsiElement> getCalleeElements(@NotNull JetElement rootElement, BindingContext bindingContext) {
final ArrayList<PsiElement> result = new ArrayList<PsiElement>();
JetVisitorVoid visitor = new CalleeReferenceVisitorBase(bindingContext, false) {
@Override
protected void processDeclaration(JetReferenceExpression reference, PsiElement declaration) {
result.add(declaration);
}
};
private static List<? extends PsiElement> getCalleeElements(@NotNull JetElement rootElement) {
List<JetElement> elementsToAnalyze = new ArrayList<JetElement>();
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<PsiElement> result = new ArrayList<PsiElement>();
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<? extends PsiElement> calleeDescriptors = getCalleeElements((JetElement) targetElement, bindingContext);
List<? extends PsiElement> calleeDescriptors = getCalleeElements(targetElement);
return collectNodeDescriptors(descriptor, calleeDescriptors, representativePsiClass);
}
}
@@ -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<PsiElement> result = new ArrayList<PsiElement>();
codeBlockForLocalDeclaration.accept(new CalleeReferenceVisitorBase(bindingContext, true) {