From 075028a54429c426253d155b0f1fb5211a18f105 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 25 Jul 2012 11:08:01 +0400 Subject: [PATCH] KT-1389 Ctrl-Alt-B on class declaration does not work - first implementation (need tests and removing duplicates) --- .../search/KotlinDefinitionsSearcher.java | 17 +++-- .../KotlinDirectInheritorsSearcher.java | 65 +++++++++++++------ 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java index 9d29c7478fe..1552c124204 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinDefinitionsSearcher.java @@ -16,7 +16,9 @@ package org.jetbrains.jet.plugin.search; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.QueryExecutorBase; +import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.search.searches.ClassInheritorsSearch; @@ -31,14 +33,19 @@ import org.jetbrains.jet.lang.psi.JetClass; */ public class KotlinDefinitionsSearcher extends QueryExecutorBase { @Override - public void processQuery(@NotNull PsiElement queryParameters, @NotNull final Processor consumer) { + public void processQuery(@NotNull final PsiElement queryParameters, @NotNull final Processor consumer) { if (queryParameters instanceof JetClass) { - final JetLightClass psiClass = JetLightClass.wrapDelegate((JetClass) queryParameters); - final Query query = ClassInheritorsSearch.search(psiClass, true); + JetLightClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public JetLightClass compute() { + return JetLightClass.wrapDelegate((JetClass) queryParameters); + } + }); + Query query = ClassInheritorsSearch.search(psiClass, true); query.forEach(new Processor() { @Override - public boolean process(final PsiClass pyClass) { - return consumer.process(pyClass); + public boolean process(final PsiClass clazz) { + return consumer.process(clazz); } }); } diff --git a/idea/src/org/jetbrains/jet/plugin/search/KotlinDirectInheritorsSearcher.java b/idea/src/org/jetbrains/jet/plugin/search/KotlinDirectInheritorsSearcher.java index 63b1f90af81..1db94c8b4db 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/KotlinDirectInheritorsSearcher.java +++ b/idea/src/org/jetbrains/jet/plugin/search/KotlinDirectInheritorsSearcher.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.plugin.search; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.QueryExecutorBase; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -26,6 +27,7 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.asJava.JetLightClass; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.plugin.stubindex.JetSuperClassIndex; import java.util.Collection; @@ -40,28 +42,53 @@ public class KotlinDirectInheritorsSearcher extends QueryExecutorBase consumer) { - final PsiClass clazz = queryParameters.getClassToProcess(); - final String name = clazz.getName(); - if (name == null || !(queryParameters.getScope() instanceof GlobalSearchScope)) return; - GlobalSearchScope scope = (GlobalSearchScope) queryParameters.getScope(); - final Collection candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope); - for (JetClassOrObject candidate : candidates) { - if (!(candidate instanceof JetClass)) continue; - final List specifiers = candidate.getDelegationSpecifiers(); - for (JetDelegationSpecifier specifier : specifiers) { - final JetUserType type = specifier.getTypeAsUserType(); - if (type != null) { - final JetSimpleNameExpression referenceExpression = type.getReferenceExpression(); - if (referenceExpression != null) { - final PsiReference reference = referenceExpression.getReference(); - final PsiElement resolved = reference != null ? reference.resolve() : null; - if ((resolved instanceof PsiClass || resolved instanceof JetClass) && resolved.isEquivalentTo(clazz)) { - consumer.process(JetLightClass.wrapDelegate((JetClass) candidate)); + public void processQuery( + @NotNull final DirectClassInheritorsSearch.SearchParameters queryParameters, + @NotNull final Processor consumer + ) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + PsiClass clazz = queryParameters.getClassToProcess(); + String qualifiedName = clazz.getQualifiedName(); + if (qualifiedName == null) { + return; + } + + String name = clazz.getName(); + if (name == null || !(queryParameters.getScope() instanceof GlobalSearchScope)) return; + GlobalSearchScope scope = (GlobalSearchScope) queryParameters.getScope(); + Collection candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope); + for (JetClassOrObject candidate : candidates) { + if (!(candidate instanceof JetClass)) continue; + List specifiers = candidate.getDelegationSpecifiers(); + for (JetDelegationSpecifier specifier : specifiers) { + JetUserType type = specifier.getTypeAsUserType(); + if (type != null) { + JetSimpleNameExpression referenceExpression = type.getReferenceExpression(); + if (referenceExpression != null) { + PsiReference reference = referenceExpression.getReference(); + PsiElement resolved = reference != null ? reference.resolve() : null; + + String resolvedFQName = null; + if (resolved instanceof PsiClass) { + resolvedFQName = ((PsiClass)resolved).getQualifiedName(); + } + else if (resolved instanceof JetClass) { + FqName fqName = JetPsiUtil.getFQName((JetClass) resolved); + if (fqName != null) { + resolvedFQName = fqName.getFqName(); + } + } + + if (qualifiedName.equals(resolvedFQName)) { + consumer.process(JetLightClass.wrapDelegate((JetClass) candidate)); + } + } } } } } - } + }); } }