KT-1389 Ctrl-Alt-B on class declaration does not work - first implementation (need tests and removing duplicates)
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user