Call Hierarchy: Use lazy analysis
#KT-4492 Fixed
This commit is contained in:
+1
-2
@@ -141,8 +141,7 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
|
|||||||
elementText = ((JetFile) element).getName();
|
elementText = ((JetFile) element).getName();
|
||||||
}
|
}
|
||||||
else if (element instanceof JetNamedDeclaration) {
|
else if (element instanceof JetNamedDeclaration) {
|
||||||
BindingContext bindingContext =
|
BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) element);
|
||||||
AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext();
|
|
||||||
|
|
||||||
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
|
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
|
||||||
if (descriptor == null) return null;
|
if (descriptor == null) return null;
|
||||||
|
|||||||
+20
-21
@@ -25,7 +25,6 @@ import com.intellij.psi.PsiElement;
|
|||||||
import com.intellij.psi.PsiMethod;
|
import com.intellij.psi.PsiMethod;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
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.lang.resolve.java.jetAsJava.KotlinLightMethod;
|
||||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
||||||
|
|
||||||
@@ -46,49 +45,51 @@ public class KotlinCalleeMethodsTreeStructure extends KotlinCallTreeStructure {
|
|||||||
this.javaTreeStructure = new CalleeMethodsTreeStructure(project, representativePsiMethod, scopeType);
|
this.javaTreeStructure = new CalleeMethodsTreeStructure(project, representativePsiMethod, scopeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<? extends PsiElement> getCalleeElements(@NotNull JetElement rootElement, BindingContext bindingContext) {
|
private static List<? extends PsiElement> getCalleeElements(@NotNull JetElement rootElement) {
|
||||||
final ArrayList<PsiElement> result = new ArrayList<PsiElement>();
|
List<JetElement> elementsToAnalyze = new ArrayList<JetElement>();
|
||||||
JetVisitorVoid visitor = new CalleeReferenceVisitorBase(bindingContext, false) {
|
|
||||||
@Override
|
|
||||||
protected void processDeclaration(JetReferenceExpression reference, PsiElement declaration) {
|
|
||||||
result.add(declaration);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (rootElement instanceof JetNamedFunction) {
|
if (rootElement instanceof JetNamedFunction) {
|
||||||
JetExpression body = ((JetNamedFunction) rootElement).getBodyExpression();
|
elementsToAnalyze.add(((JetNamedFunction) rootElement).getBodyExpression());
|
||||||
if (body != null) {
|
|
||||||
body.accept(visitor);
|
|
||||||
}
|
|
||||||
} else if (rootElement instanceof JetProperty) {
|
} else if (rootElement instanceof JetProperty) {
|
||||||
for (JetPropertyAccessor accessor : ((JetProperty) rootElement).getAccessors()) {
|
for (JetPropertyAccessor accessor : ((JetProperty) rootElement).getAccessors()) {
|
||||||
JetExpression body = accessor.getBodyExpression();
|
JetExpression body = accessor.getBodyExpression();
|
||||||
if (body != null) {
|
if (body != null) {
|
||||||
body.accept(visitor);
|
elementsToAnalyze.add(body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
JetClassOrObject classOrObject = (JetClassOrObject) rootElement;
|
JetClassOrObject classOrObject = (JetClassOrObject) rootElement;
|
||||||
for (JetDelegationSpecifier specifier : classOrObject.getDelegationSpecifiers()) {
|
for (JetDelegationSpecifier specifier : classOrObject.getDelegationSpecifiers()) {
|
||||||
if (specifier instanceof JetCallElement) {
|
if (specifier instanceof JetCallElement) {
|
||||||
specifier.accept(visitor);
|
elementsToAnalyze.add(specifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JetClassBody body = classOrObject.getBody();
|
JetClassBody body = classOrObject.getBody();
|
||||||
if (body != null) {
|
if (body != null) {
|
||||||
for (JetClassInitializer initializer : body.getAnonymousInitializers()) {
|
for (JetClassInitializer initializer : body.getAnonymousInitializers()) {
|
||||||
initializer.getBody().accept(visitor);
|
elementsToAnalyze.add(initializer.getBody());
|
||||||
}
|
}
|
||||||
for (JetProperty property : body.getProperties()) {
|
for (JetProperty property : body.getProperties()) {
|
||||||
JetExpression initializer = property.getInitializer();
|
JetExpression initializer = property.getInitializer();
|
||||||
if (initializer != null) {
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,9 +126,7 @@ public class KotlinCalleeMethodsTreeStructure extends KotlinCallTreeStructure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Object[] buildChildrenByKotlinTarget(HierarchyNodeDescriptor descriptor, JetElement targetElement) {
|
private Object[] buildChildrenByKotlinTarget(HierarchyNodeDescriptor descriptor, JetElement targetElement) {
|
||||||
BindingContext bindingContext =
|
List<? extends PsiElement> calleeDescriptors = getCalleeElements(targetElement);
|
||||||
AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) targetElement.getContainingFile()).getBindingContext();
|
|
||||||
List<? extends PsiElement> calleeDescriptors = getCalleeElements((JetElement) targetElement, bindingContext);
|
|
||||||
return collectNodeDescriptors(descriptor, calleeDescriptors, representativePsiClass);
|
return collectNodeDescriptors(descriptor, calleeDescriptors, representativePsiClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -61,9 +61,10 @@ public abstract class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStr
|
|||||||
@Override
|
@Override
|
||||||
protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descriptor) {
|
protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descriptor) {
|
||||||
final PsiElement element = getTargetElement(descriptor);
|
final PsiElement element = getTargetElement(descriptor);
|
||||||
|
assert element instanceof JetElement :
|
||||||
|
"JetElement must be passed by KotlinCallerMethodsTreeStructure.newInstance(): " + element.getText();
|
||||||
|
|
||||||
BindingContext bindingContext =
|
BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) element);
|
||||||
AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext();
|
|
||||||
|
|
||||||
final ArrayList<PsiElement> result = new ArrayList<PsiElement>();
|
final ArrayList<PsiElement> result = new ArrayList<PsiElement>();
|
||||||
codeBlockForLocalDeclaration.accept(new CalleeReferenceVisitorBase(bindingContext, true) {
|
codeBlockForLocalDeclaration.accept(new CalleeReferenceVisitorBase(bindingContext, true) {
|
||||||
|
|||||||
Reference in New Issue
Block a user