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();
|
||||
}
|
||||
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;
|
||||
|
||||
+20
-21
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user