KT-1389 Ctrl-Alt-B on class declaration does not work - first implementation (need tests and removing duplicates)

This commit is contained in:
Nikolay Krasko
2012-07-25 11:08:01 +04:00
parent 12dd53c511
commit 075028a544
2 changed files with 58 additions and 24 deletions
@@ -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<PsiElement, PsiElement> {
@Override
public void processQuery(@NotNull PsiElement queryParameters, @NotNull final Processor<PsiElement> consumer) {
public void processQuery(@NotNull final PsiElement queryParameters, @NotNull final Processor<PsiElement> consumer) {
if (queryParameters instanceof JetClass) {
final JetLightClass psiClass = JetLightClass.wrapDelegate((JetClass) queryParameters);
final Query<PsiClass> query = ClassInheritorsSearch.search(psiClass, true);
JetLightClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable<JetLightClass>() {
@Override
public JetLightClass compute() {
return JetLightClass.wrapDelegate((JetClass) queryParameters);
}
});
Query<PsiClass> query = ClassInheritorsSearch.search(psiClass, true);
query.forEach(new Processor<PsiClass>() {
@Override
public boolean process(final PsiClass pyClass) {
return consumer.process(pyClass);
public boolean process(final PsiClass clazz) {
return consumer.process(clazz);
}
});
}
@@ -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<PsiClass,
}
@Override
public void processQuery(@NotNull DirectClassInheritorsSearch.SearchParameters queryParameters, @NotNull Processor<PsiClass> 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<JetClassOrObject> candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope);
for (JetClassOrObject candidate : candidates) {
if (!(candidate instanceof JetClass)) continue;
final List<JetDelegationSpecifier> 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<PsiClass> 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<JetClassOrObject> candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope);
for (JetClassOrObject candidate : candidates) {
if (!(candidate instanceof JetClass)) continue;
List<JetDelegationSpecifier> 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));
}
}
}
}
}
}
}
});
}
}