From e4936549ee4a611a85bd6a8a0a7cc2b166677070 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 16 Sep 2013 20:49:49 +0400 Subject: [PATCH] Extract isConstructor() check --- .../plugin/findUsages/FindUsagesUtils.java | 59 +++++++++++++++++++ .../KotlinFindClassUsagesHandler.java | 50 +--------------- 2 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/findUsages/FindUsagesUtils.java diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/FindUsagesUtils.java b/idea/src/org/jetbrains/jet/plugin/findUsages/FindUsagesUtils.java new file mode 100644 index 00000000000..e847168fb6e --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/FindUsagesUtils.java @@ -0,0 +1,59 @@ +package org.jetbrains.jet.plugin.findUsages; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiConstructorCall; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; + +public class FindUsagesUtils { + private FindUsagesUtils() { + } + + private static DeclarationDescriptor getCallDescriptor(PsiElement element, BindingContext bindingContext) { + JetConstructorCalleeExpression constructorCalleeExpression = + PsiTreeUtil.getParentOfType(element, JetConstructorCalleeExpression.class); + if (constructorCalleeExpression != null) { + JetReferenceExpression classReference = constructorCalleeExpression.getConstructorReferenceExpression(); + return bindingContext.get(BindingContext.REFERENCE_TARGET, classReference); + } + + JetCallExpression callExpression = PsiTreeUtil.getParentOfType(element, JetCallExpression.class); + if (callExpression != null) { + JetExpression callee = callExpression.getCalleeExpression(); + if (callee instanceof JetReferenceExpression) { + return bindingContext.get(BindingContext.REFERENCE_TARGET, (JetReferenceExpression) callee); + } + } + + return null; + } + + public static boolean isConstructorUsage(PsiElement element, JetClassOrObject jetClassOrObject) { + PsiConstructorCall constructorCall = PsiTreeUtil.getParentOfType(element, PsiConstructorCall.class); + if (constructorCall != null && constructorCall == element.getParent()) { + PsiMethod constructor = constructorCall.resolveConstructor(); + if (constructor == null) return false; + + PsiClass constructorClass = constructor.getContainingClass(); + return constructorClass != null && constructorClass.getNavigationElement() == jetClassOrObject; + } + if (!(element instanceof JetElement)) return false; + + BindingContext bindingContext = + AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) element.getContainingFile()).getBindingContext(); + + DeclarationDescriptor descriptor = getCallDescriptor(element, bindingContext); + if (!(descriptor instanceof ConstructorDescriptor)) return false; + + DeclarationDescriptor containingDescriptor = descriptor.getContainingDeclaration(); + return containingDescriptor != null + && BindingContextUtils.descriptorToDeclaration(bindingContext, containingDescriptor) == jetClassOrObject; + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java index ffdaa90f7bb..1466b04c486 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java @@ -30,21 +30,16 @@ import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.search.PsiElementProcessorAdapter; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; -import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.plugin.findUsages.FindUsagesUtils; import org.jetbrains.jet.plugin.findUsages.KotlinFindUsagesHandlerFactory; import org.jetbrains.jet.plugin.findUsages.dialogs.KotlinFindClassUsagesDialog; import org.jetbrains.jet.plugin.findUsages.options.KotlinClassFindUsagesOptions; -import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import java.util.Collection; @@ -84,7 +79,7 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler